Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата

Decode (I/O or memory) of a register is disabled via the command register before sizing a
Base Address register. Software saves the original value of the Base Address register, writes
0 FFFF FFFFh to the register, then reads it back. Size calculation can be done from the
32-bit value read by first clearing encoding information bits (bit 0 for I/O, bits 0-3 for
memory), inverting all 32 bits (logical NOT), then incrementing by 1. The resultant 32-bit
value is the memory/I/O range size decoded by the register. Note that the upper 16 bits of
the result is ignored if the Base Address register is for I/O and bits 16-31 returned zero
upon read. The original value in the Base Address register is restored before re-enabling
decode in the command register of the device.

Автор: misha_mike 22.3.2008, 19:41
Так и делаю. Читаю из нужного BAR-а адрес начала отображаемой памяти, сохраняю. Потом записываю туда 0FFFFFFFFh и снова читаю. Прочитанное значение подвергаю сначала операции "and 0FFFFFFF0h", а потм "not". Затем восстанавливаю сохраненный ранее адрес.

Все как в доке, но неутешительные результаты этих действий в первом постинге.

Автор: MAKCim 22.3.2008, 21:17
Цитата(misha_mike @  22.3.2008,  19:41 Найти цитируемый пост)
Все как в доке, но неутешительные результаты этих действий в первом постинге. 

Цитата

Power-up software can determine how much address space the device requires by writing a
value of all 1's to the register and then reading the value back. The device will return 0's in
all don't-care address bits, effectively specifying the address space required. Unimplemented
Base Address registers are hardwired to zero.

This design implies that all address spaces used are a power of two in size and are naturally
aligned. Devices are free to consume more address space than required, but decoding down
to a 4 KB space for memory is suggested for devices that need less than that amount.

см. выделенное

Автор: misha_mike 23.3.2008, 04:43
Блин. Как же быть?

Автор: MAKCim 23.3.2008, 12:33
Цитата(misha_mike @  23.3.2008,  04:43 Найти цитируемый пост)
Блин. Как же быть? 

а в чем, собственно проблема
используй значение, возвращенное устройством
а для доступа к отображенным регистрам в любом случае нужно использовать спецификацию устройства

Автор: 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
От туда и начинал...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)