Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Asm: Общие вопросы > Взаимодействие с device через memory address range |
Автор: misha_mike 22.3.2008, 14:56 |
Есть некая полусамопальная PCI-железка, занимается формированием изображения на монохромной светодиодной матрице (думаю все видели такие в виде "бегущей строки"). У этой железки есть отображаемая в адресное пространство процессора память, содержащая битовую карту изображения. Мне нужно в эту память писать для формирования картинки. Сам процесс записи в общем ничего интересного не представляет, но вот куда писать -- непонятно. Все примеры определения диапазона адресов одинаковые, но у меня не фурычат :( Основная проблема в том, что железка возвращает сильно завышенный объем памяти. Если реально на ней распаяно два мегабайта, то почему после записи в нужный BAR числа FFFFFFFF она возвращает мне FFC00000? Это же 4 мегабайта. Причем при обращении выше законных двух метров начитаются сильные задержки, а чтение из этих адресов всегда возвращает одно и то же значение (в зависимости от системы это либо 00 либо FF), т.е. никаких четырех мегабайт там точно нет и не было. На железку пинать не могу, потому что на проверку этим грешат например и видеокарты. Вот собрал по имеющимся статистику (первая пара чисел -- реальный диапазон видеопамяти, третье число -- результат чтения и инверсии соответствующего BAR после записи туда FFFFFFFF): D0000000..D7FFFFFF, DFFFFFFF (GF7300GS/128M) E0000000..E0FFFFFF, E1FFFFFF (VANTA/16M) E6000000..E6FFFFFF, E7FFFFFF (TNT/16M) E6000000..E67FFFFF, E6FFFFFF (TNT/8M) E6000000..E63FFFFF, E67FFFFF (SIS/4M) F0000000..F0FFFFFF, F7FFFFFF (VMWare/16M) Причем если присмотреться, то можно увидеть что во всех кроме последнего (весьма специфического) случаях объем завышен ровно в два раза, т.е. выставлен один лишний бит. Как же узнать реальный размер памяти? |
Автор: MAKCim 22.3.2008, 19:04 | ||
|
Автор: misha_mike 22.3.2008, 19:41 |
Так и делаю. Читаю из нужного BAR-а адрес начала отображаемой памяти, сохраняю. Потом записываю туда 0FFFFFFFFh и снова читаю. Прочитанное значение подвергаю сначала операции "and 0FFFFFFF0h", а потм "not". Затем восстанавливаю сохраненный ранее адрес. Все как в доке, но неутешительные результаты этих действий в первом постинге. |
Автор: misha_mike 23.3.2008, 04:43 |
Блин. Как же быть? |
Автор: MAKCim 23.3.2008, 12:33 |
а в чем, собственно проблема используй значение, возвращенное устройством а для доступа к отображенным регистрам в любом случае нужно использовать спецификацию устройства |
Автор: misha_mike 23.3.2008, 14:58 |
Нет спецификации, железка кустарного производства. Закрытая, даже маркировка чипов спилена. Мне нужно альтернативный софт написать, причем по возможности универсальный, для разных модификаций с разным объемом памяти. |
Автор: MAKCim 23.3.2008, 17:35 |
misha_mike, невозможно написать драйвер без спецификации откуда ты берешь информацию о том, как и что надо записывать? |
Автор: misha_mike 23.3.2008, 18:22 |
Я имею некоторый опыт в этом деле и мне поручили разобраться. Методом тыка выяснил что фреймбуфер доступен в адресном пространстве и как он у этой хреновины организован. Научился формировать изображение, заказчик был счаслив когда увидел работу прототипа. Но на финальной стадии возникла описываемая проблема, мешающая выпустить завершенный продукт. |
Автор: MAKCim 23.3.2008, 18:54 |
misha_mike, ясно попробуйте обратиться на более узкоспециализированный форум wasm.ru |
Автор: misha_mike 23.3.2008, 20:29 |
От туда и начинал... |