Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DP83848
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
xor.kruger
Доброго времени суток!
Встречал на нашем форуме много тем и сообщений об использовании семейства PHY DP83848.
Но не разу не видел чтобы его использовали в сети из под Linux. Поддержка драйвера для данного семейства в последних версиях кернела также замечена не была sad.gif
Вопрос: использовал ли его кто нибудь в Linux и если да, то какой драйвер прикручивали ?
Заранее спасибо за любой ответ/совет sm.gif
Idle
Цитата(xor.kruger @ Oct 28 2013, 11:57) *
Заранее спасибо за любой ответ/совет sm.gif

По моим представлениям драйвера для фаев не очень-то и нужны. Настроил нужный режим "подтяжками" чипа и вперёд. Нет?
Tarbal
Так ведь у всех Фаев одинаковый интерфейс. MII разрешается в конфигурации. Ключевой файл drivers/net/fec.c

Я недавно уже отвечал на подобный вопрос:
http://electronix.ru/forum/index.php?showtopic=115896
xor.kruger
Цитата
По моим представлениям драйвера для фаев не очень-то и нужны. Настроил нужный режим "подтяжками" чипа и вперёд. Нет?

Для некоторых "стандартных" PHY действительно никаких особых опций не нужно, например для SMSC LAN83C185 необходимо только указать опцию в ядре CONFIG_MII, хотя для него есть также отдельная опция CONFIG_SMSC_PHY, которая, как я понимаю, позволяет выполнять более расширенные действия над ним.

Практически в такой же аппаратной системе стоит PHY DP83848J с которым данный трюк не прокатывает и отдельной опции в ядре для него также нету sad.gif
Вот кусок лога загрузки и работы:
Загрузка:
Код
[    4.391557] xilinx_emaclite 40e00000.ethernet: Device Tree Probing
[    4.398573] libphy: Xilinx Emaclite MDIO: probed
[b][    4.441222] mdio_bus c00e41c4: cannot get PHY at address 0[/b]
[    4.445633] xilinx_emaclite 40e00000.ethernet: MAC address is now 00:0a:35:00:00:00
[    4.460226] xilinx_emaclite 40e00000.ethernet: Xilinx EmacLite at 0x40E00000 mapped to 0xF0040000, irq=2
[    4.476092] TCP: cubic registered
[    4.478288] NET: Registered protocol family 17

Работа ifconfig:
Код
/ # ifconfig eth0 192.168.1.89 netmask 255.255.255.0
[   11.756935] net eth0: of_phy_connect() failed
ifconfig: SIOCSIFFLAGS: No such device

Вот такие пироги sad.gif

Цитата
Ключевой файл drivers/net/fec.c

Данный ключевой файл был ключевым до версии ядра 3.1
Idle
Цитата(xor.kruger @ Oct 30 2013, 11:31) *
Для некоторых "стандартных" PHY действительно никаких особых опций не нужно

Не, я так себе представлял что:
1. настроить любой фай можно или программно через MDIO (drivers/net/phy в mainline) или аппаратно подтяжкой выводов чипа или в 0 или к vcc
2. менять настройки фая мало кому нужно, поэтому все делают конфигурацию аппаратно раз и навсегда
3. поскольку все делают конфигурацию аппаратно - в ядре так мало драйверов MDIO

Т.е. я где-то ошибся и для DP83848J нужно обязательно что-то делать через MDIO?
Tarbal
К сожалению мне не приходилось подключать PHY для поздних версий sad.gif
Однако они все должны работать по стандартному интерфейсу. Насколько я помню в протоколе на адресацию устройства отведено 5 бит. драйвер перебирает все 32 устройства, читая идентификацию. Если устройства по этому адресу нет, то читается 0xFFFFFFFF.
Как найти код драйвера. Легче всего посмотреть имя драйвера в другой системе с кернелом 3.1 в /sys:
$ ls /sys/bus/platform/drivers
у меня это fec.
Дальше поищите имя в коде драйверов. Находясь в корне кернела исполните команду:
grep -rn '"fec"' drivers

скорее всего вы ищите строку
.name = "fec",

Ну а потом добавляя в разные места printk протестируйте, что происходит.

Отдельной опции не бывает по двум причинам:
1. Она не нужна, т.к. стандартным драйвером поддерживается целый класс устройств.
2. Код драйвера не добавлен в ядро.

Я почти уверен, что у вас первый случай.

Вы взяли за прототип какое-то устройство и поменяли PHY на удобный вам?
Если так, то есть ли у вас исходное устройство живьём?
sasamy
Цитата(xor.kruger @ Oct 30 2013, 11:31) *
Код
/ # ifconfig eth0 192.168.1.89 netmask 255.255.255.0
[   11.756935] net eth0: of_phy_connect() failed
ifconfig: SIOCSIFFLAGS: No such device


А в device tree PHY прописан ?

http://lxr.free-electrons.com/source/drive.../of_mdio.c#L191
Idle
Цитата(Idle @ Oct 30 2013, 15:27) *
Т.е. я где-то ошибся и для DP83848J нужно обязательно что-то делать через MDIO?

А, понял. Связь мака с фаем драйверу мака нужна в любом случае. Просто есть стандартные регистры и расширения для конкретного чипа. Собственно драйвера нужны для расширений. Там где нет прямой связи с фаем используют fixed phy.
Tarbal
Цитата(sasamy @ Oct 30 2013, 16:07) *
А в device tree PHY прописан ?

http://lxr.free-electrons.com/source/drive.../of_mdio.c#L191


Должен конечно. Он туда попадает при регистрации устройства. Это легко проверить, посмотрев в /sys
xor.kruger
Цитата
А в device tree PHY прописан ?

Прописан.
По сути весь SoC тот же как и на рабочей системе за отличием PHY.

Думаю может написать пробный "базовый" драйвер для данного PHY по аналогии с другими имеющимися в linux-kernel/drivers/net/phy
xor.kruger
Цитата
Отдельной опции не бывает по двум причинам:

Цитата
1. Она не нужна, т.к. стандартным драйвером поддерживается целый класс устройств.

Это и так понятно, только вот понятие "стандартное тоже достаточно широкое" sm.gif, например DP83865DVH (National), вообще не заведется если отдельно поддержку не включить (Стандартный такой себе PHY)
Цитата
2. Код драйвера не добавлен в ядро.

Что Вы хотели этим сказать ? sm.gif

НУ а если по теме, то проблема в считывании ID PHY, если в исходниках убрать проверку на йидишник, то дальше регистрация и "создание" устройства проходит нормально. В результате чего теже пинги на плату и с платы проходят нормально. Осталось разобраться почему считываются одни нули sad.gif
Tarbal
Цитата(xor.kruger @ Nov 1 2013, 18:57) *
Что Вы хотели этим сказать ? sm.gif


В сорс коде используемого вами ядра нет кодов драйвера.
Вы нашли какой драйвер используется?
xor.kruger
Цитата
Вы нашли какой драйвер используется?

Ну для конкретного данного PHY нету => использую стандартный Framework for finding and configuring PHYs.
Tarbal
Цитата(xor.kruger @ Nov 4 2013, 09:46) *
Ну для конкретного данного PHY нету => использую стандартный Framework for finding and configuring PHYs.


Вы так и не сказали что у вас в директориях:
/sys/bus/platform/drivers
/sys/bus/platform/devices
xor.kruger
Цитата
Вы так и не сказали что у вас в директориях:

Это не имеет никакого отношения к решению моей проблемы. Например в каталоге /sys/bus/platform/devices описаны какие устройства зарегистрировались в моей системе; ну и что дальше, с работой периферийных устройств и шин у меня проблем нету sm.gif
Ну если Вы так настаиваете и может с помощью содержимых каталогов решить данную проблему, то милости просим sm.gif
Код
/ # ls -lR /sys/bus/platform/devices
/sys/bus/platform/devices:
total 0
lrwxrwxrwx    1 0        0                0 Jan  1 00:02 40000000.gpio -> ../../../devices/axi.1/40000000.gpio
lrwxrwxrwx    1 0        0                0 Jan  1 00:02 40600000.serial -> ../../../devices/axi.1/40600000.serial
lrwxrwxrwx    1 0        0                0 Jan  1 00:02 40e00000.ethernet -> ../../../devices/axi.1/40e00000.ethernet
lrwxrwxrwx    1 0        0                0 Jan  1 00:02 41200000.interrupt-controller -> ../../../devices/axi.1/41200000.interrupt-controller
lrwxrwxrwx    1 0        0                0 Jan  1 00:02 41c00000.timer -> ../../../devices/axi.1/41c00000.timer
lrwxrwxrwx    1 0        0                0 Jan  1 00:02 alarmtimer -> ../../../devices/platform/alarmtimer
lrwxrwxrwx    1 0        0                0 Jan  1 00:02 axi.0 -> ../../../devices/axi.0
lrwxrwxrwx    1 0        0                0 Jan  1 00:02 axi.1 -> ../../../devices/axi.1


Код
/ # ls -lR /sys/bus/platform/drivers
/sys/bus/platform/drivers:
total 0
drwxr-xr-x    2 0        0                0 Jan  1 00:01 alarmtimer
drwxr-xr-x    2 0        0                0 Jan  1 00:01 uartlite
drwxr-xr-x    2 0        0                0 Jan  1 00:01 xilinx_emaclite

/sys/bus/platform/drivers/alarmtimer:
total 0
lrwxrwxrwx    1 0        0                0 Jan  1 00:06 alarmtimer -> ../../../../devices/platform/alarmtimer
--w-------    1 0        0             4096 Jan  1 00:06 bind
--w-------    1 0        0             4096 Jan  1 00:06 uevent
--w-------    1 0        0             4096 Jan  1 00:06 unbind

/sys/bus/platform/drivers/uartlite:
total 0
lrwxrwxrwx    1 0        0                0 Jan  1 00:06 40600000.serial -> ../../../../devices/axi.1/40600000.serial
--w-------    1 0        0             4096 Jan  1 00:06 bind
--w-------    1 0        0             4096 Jan  1 00:06 uevent
--w-------    1 0        0             4096 Jan  1 00:06 unbind

/sys/bus/platform/drivers/xilinx_emaclite:
total 0
lrwxrwxrwx    1 0        0                0 Jan  1 00:06 40e00000.ethernet -> ../../../../devices/axi.1/40e00000.ethernet
--w-------    1 0        0             4096 Jan  1 00:06 bind
--w-------    1 0        0             4096 Jan  1 00:06 uevent
--w-------    1 0        0             4096 Jan  1 00:06 unbind
/ #


Реально, по факту, на данный момент проблема локализирована и как я писал выше - это проблема при считывании ID - считываются нули. Если убрать данную проверку то все отлично работает. Но это не спортивно и по свободе нуна будет этот момент добить до конца sm.gif
Tarbal
Ага fec поменялся на ethernet. А теперь в корне сорсов кернела такую команду. ethernet в двух кавычках, снаружи одинарные внутри двойные.
grep -rn '"ethernet"' drivers

Ищем в каких файлах есть строки
.name = "ethernet"

Цитата(xor.kruger @ Nov 5 2013, 11:36) *
Реально, по факту, на данный момент проблема локализирована и как я писал выше - это проблема при считывании ID - считываются нули. Если убрать данную проверку то все отлично работает. Но это не спортивно и по свободе нуна будет этот момент добить до конца sm.gif


Ну не может ведь все работать и считывать нули при определении идентификации устройства.
xor.kruger
Цитата
Ищем в каких файлах есть строки

Так мне это и ненужно, я и так знаю какой драйвер используется в моем случае для PHY - это стандартные phy_device.c и phy.c. А то о чем вы говорите, это Ethernet драйвер EmacLite, он тут не при чем sm.gif
Код
Ну не может ведь все работать и считывать нули при определении идентификации устройства.

Вполне может быть, просто при регистрации PHY в начальной инициализации есть базовый этап - это проверка на марку производителя, если производителя в списке нету, то работа драйвера завершается ошибкой, вот и всё. Ну а это уже второй вопрос, тут нуна курить даташит на данный фитер и как вариант записать свой айдишник а потом считать и сравнить, вполне может быть что неправильно сконфигурирована шина MDIOBus, в принципе ее можно перевесить на gpio и заюзать драйвер mdio-gpio.c
Tarbal
Я хотел пройти по цепочке и добавить чтение регистров PHY через /proc, но если вам все известно, то поставьте printk в эту функцию (get_phy_device), чтобы посмотреть что читается из чипа по всем 32 адресам.

Надо напечатать значение phy_id сразу после чтения.

http://lxr.free-electrons.com/source/drive...y_device.c#L331


Цитата(xor.kruger @ Nov 5 2013, 17:26) *
Вполне может быть, просто при регистрации PHY в начальной инициализации есть базовый этап - это проверка на марку производителя, если производителя в списке нету, то работа драйвера завершается ошибкой, вот и всё.


Вся проверка в этой же функции:
if ((phy_id & 0x1fffffff) == 0x1fffffff)
return NULL;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.