2016-07-12 9 views
1

Мне нужно связаться с устройством PCI с памятью через /dev/mem. Зачем? Есть много причин, один из которых объясняется тем, что мой босс сказал мне об этом., взаимодействующий с устройством PCI через/dev/mem

Я думаю, что у меня есть мой ответ here. Однако я не могу понять, есть ли ответ MMIO_ADDR. Если я хочу общаться с определенной областью памяти, я бы использовал значение, хранящееся в регистре BAR, в качестве моего MMIO_ADDR? Если нет, то как мне связаться с моим устройством PCI?

ответ

2

Ваш BAR будет присвоен адрес BIOS/kernel. Этот адрес должен был быть записан в регистры адресов BAR в заголовке конфигурации PCI к моменту окончания работы системы.

К примеру, на виртуальной машине я здесь, то e1000 устройство следующим образом (от lspci -v):

02:03.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01) 
     Subsystem: VMware PRO/1000 MT Single Port Adapter 
     Physical Slot: 35 
     Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 17 
    => Memory at fd560000 (64-bit, non-prefetchable) [size=128K] 
     Memory at fdfd0000 (64-bit, non-prefetchable) [size=64K] 
     I/O ports at 2080 [size=64] 
     [virtual] Expansion ROM at fd520000 [disabled] [size=64K] 
     Capabilities: <access denied> 
     Kernel driver in use: e1000 

Вы должны прочитать эту информацию (вы можете достичь его в двоичной форме через /proc/bus/pci/<Bus>/<DevFn> или через /sys/bus/pci/devices/), чтобы найти адрес MMIO.

Например, демпинг двоичного пространства конфигурации PCI для устройства выше показывает:

od -tx1z -Ax /proc/bus/pci/02/03.0 
000000 86 80 0f 10 17 01 30 02 01 00 00 02 10 00 00 00 >......0.........< 
000010 04 00 56 fd 00 00 00 00 04 00 fd fd 00 00 00 00 >..V.............< 
000020 81 20 00 00 00 00 00 00 00 00 00 00 ad 15 50 07 >. ............P.< 
000030 00 00 00 00 dc 00 00 00 00 00 00 00 0b 01 ff 00 >................< 
000040 

первый бар (бар область # 0) находится по смещению 0x10, второй (бар область 2 #) находится на смещении 0x18.

См. https://en.wikipedia.org/wiki/PCI_configuration_space для описания компоновки и интерпретации.

+0

У меня есть способ извлечь значения BAR. Но мой вопрос все еще стоит, являются значения BAR теми, которые мне нужно использовать для 'MMIO_ADDR'? – flashburn

+0

Я думаю, что в вашем ответе есть ошибка. Второй бар должен быть в 0x14 – flashburn

+0

Ну, второй показан 'lspci'. Я уточню –

 Смежные вопросы

  • Нет связанных вопросов^_^