LINUX.ORG.RU

Как найти адерс регистров ввода/вывода сетевого адаптера?


0

0

Всем привет.

Конфигурация: Компьютерный модуль - Toradex Colibri PXA320 (ARM, XScale). OC - embedded linux.

По идее, чтобы получить доступ к регистрам сетевого адаптера необходимо «отмапить» их в память, используя функцию ioremap(). Чтобы получить физический адрес I/O регистров используется функция platform_get_resource(), которая возвращает структуру resource с двумя полями: start и end. Оба поля - физические адреса. Берутся эти адреса из файла «определения» платы (не ручаюсь за точный перевод выражения board definition file). Они там определены как #define PXA3xx_CS2_PHYS (0x10000000). В моем случае это arch/arm/mach-pxa/colibri-pxa320.c.

Когда стартует ядро, то система зависает как раз во время инициализации сетевого адаптера, а именно во время обращения по этому физ. адресу (поле start структуры resource).

Вопрос: можно ли как-нибудь «спросить» плату, где (по каким адресам) находится регистры сетевого адаптера?

Спасибо.


Ответ на: комментарий от farisey

>$ grep 8139 /proc/ioports

Это уже после загрузки ОС, а у меня ядро еще не загрузилось

Dennis7
() автор топика
Ответ на: комментарий от ananas

>pci_find_device() ?

Это хорошо конечно, но вот шины PCI на плате нет. Или это можно использовать и не на PCI шине?

Dennis7
() автор топика

эзернет там не в самом чипе случайно? тогда смотрите в мануал на чип, там жёсткая привязка адресов в/в к устройствам.

arsi ★★★★★
()
Ответ на: комментарий от arsi

>эзернет там не в самом чипе случайно? Он выполнен в виде отдельной микросхемы на плате.

В принципе да, должна быть жесткая привязка адресов... НО перечитал кучу мануалов и даташитов, нигде не сказано ни слова по каким адресам лажат (отмаплены) регистры сетевого чипа, для всяких там DMA, AC'97, LCD, MMC/SD и т.д. контроллеров есть адреса где их «искать», а для сети нет. В исходниках жестко прописано, что адрес есть значение 0x10000000. Не с потолка же разработчики это число взяли. С этим адресом не работает. В мануале написано, что по этому адресу отмаплен Static Chip Select2. Вот и все. Ставил винды, сеть работает, залез в реестр, посмотрел там базовый адрес для драйвера ax88796, оказалось то же число - 0x10000000.... Куда копать??? ХЗ

Dennis7
() автор топика
Ответ на: комментарий от ananas

>кстати, а request_mem_region() перед ioremap() дергается?

Да, дергается, но значения возвращаемые этими функциями записываются в разные места.

Вот код:

//Начало

ax->mem = request_mem_region(res->start, size, pdev->name); if (ax->mem == NULL) { dev_err(&pdev->dev, «cannot reserve registers\n»); ret = -ENXIO; goto exit_mem; }

ei_status.mem = ioremap(res->start, size); dev->base_addr = (unsigned long)ei_status.mem;

//Конец

Dennis7
() автор топика
Ответ на: комментарий от Dennis7

В порядке предположения.

М.б. надо мапить с помощью ioport_map?

ttnl ★★★★★
()
Ответ на: комментарий от Dennis7

я так понимаю, это код из drivers/net/ax88796.c

с gpio все в порядке? если без сети собрать, в выхлопе dmesg ничего криминального нет?

ananas ★★★★★
()
Ответ на: комментарий от ananas

>я так понимаю, это код из drivers/net/ax88796.c

Да

с gpio все в порядке?

Да

если без сети собрать, в выхлопе dmesg ничего криминального нет?

Нет

Dennis7
() автор топика
Ответ на: комментарий от Dennis7

Самое интересное, что все значения регистров, например таких как регистры контроллера статической памяти, регистры конфигурации адресов и т.д. верные, и загрузчик (в моем случае u-boot) корректно передает их ядру (драйверу).

Dennis7
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.