|
Доступ к PHY через ETH1 |
|
|
|
Jan 11 2016, 12:35
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 16-03-14
Пользователь №: 80 955

|
Добрый день, господа!
На плате наглухо выгорела микросхема физики, привязанная к mac0. Осталась еще одна на mac1. Тактируются они от общего сигнала MX28_PAD_ENET_CLK__CLKCTRL_ENET, сбрасываются общим ресетом и висят на шине MX28_PAD_ENET0_MDIO__ENET0_MDIO / MDC. Загрузчик u-boot работает через ETH1 (mac1) без проблем. Однако Linux(OpenWRT) думает, что на плате одна микросхема и что висит она на выводах ETH0. ifconfig eth0 up срабатывает, и на разъеме №1 зажигаются диоды (должны зажигаться на разъеме №0). ifconfig eth1 up выдает сообщение, что микросхема физики не найдена(хотя на самом деле рабочая микросхема подключена к выводам ETH1).
Каким образом можно поставить костыль в систему таким образом, чтобы тактирование и сброс микросхемы PHY1 работали от ETH0, а передача данных шла через ETH1? Попытался править dts, но безуспешно.
P.S. Я новичок в подобных системах, поэтому кое-какие моменты мог неправильно изложить, но вроде, осциллограф подтверждает описанную теорию.
|
|
|
|
|
 |
Ответов
(1 - 5)
|
Jan 11 2016, 12:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(vgovseychuk @ Jan 11 2016, 15:35)  Попытался править dts, но безуспешно. Так приложили бы сразу свой dts. И выхлоп dmesg. Цитата(vgovseychuk @ Jan 11 2016, 15:35)  P.S. Я новичок в подобных системах, поэтому кое-какие моменты мог неправильно изложить, но вроде, осциллограф подтверждает описанную теорию. Очень похоже, что все обстоит именно так.
|
|
|
|
|
Jan 11 2016, 13:08
|
Знающий
   
Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050

|
Цитата(vgovseychuk @ Jan 11 2016, 15:35)  Попытался править dts, но безуспешно. что вы там правили неясно.. попробуйте в своем dts найти схожий блок: Код &mac0 { phy-mode = "rmii"; pinctrl-names = "default", "gpio_mode"; pinctrl-0 = <&mac0_pins_a>; pinctrl-1 = <&tx28_mac0_pins_gpio>; status = "okay"; }; &mac1 { phy-mode = "rmii"; pinctrl-names = "default"; pinctrl-0 = <&mac1_pins_a>; /* not enabled by default */ }; и в нижнюю секцию дописать status = "okay";
|
|
|
|
|
Jan 11 2016, 13:34
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 16-03-14
Пользователь №: 80 955

|
Вот, что сейчас у меня прописано из устройств, висящих на шине AHB: Код ahb@80080000 { usb0: usb@80080000 { pinctrl-names = "default"; pinctrl-0 = <&usb0_pins_a>; vbus-supply = <®_usb0_vbus>; status = "okay"; }; usb1: usb@80090000 { pinctrl-names = "default"; pinctrl-0 = <&usb1_pins_a>; vbus-supply = <®_usb1_vbus>; status = "okay"; }; mac0: ethernet@800f0000 { phy-mode = "rmii"; pinctrl-names = "default"; pinctrl-0 = <&mac0_pins_custom>; phy-reset-gpios = <&gpio2 13 GPIO_ACTIVE_LOW>; phy-reset-duration = <100>; status = "okay"; }; mac1: ethernet@800f4000 { phy-mode = "rmii"; pinctrl-names = "default"; pinctrl-0 = <&mac1_pins_a>; status = "okay"; }; GPIO2.13 - пин сброса физики, определен как hog-pin Как я понимаю, чтобы заставить систему думать, что микросхемы две, надо отключить MDIO. Некоторые микросхемы PHY не имеют такого интерфейса. Вторая теория состоит в том, чтобы подменять как-то адреса(то есть система будет думать, что шлет сигналы на выводы ETH0, а на самом деле на ETH1). Но это по-моему, либо сложно, либо невозможно. И да, до этого все работало как часы, т.е. обе физики. Теперь в Linux ни одна не работает. Если о чем-то скажет, приложу еще вывод ифконфиг: Код root@OpenWrt:/# ifconfig -a eth0 Link encap:Ethernet HWaddr 00:01:87:22:33:44 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth1 Link encap:Ethernet HWaddr 00:01:87:00:00:00 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:48 errors:0 dropped:0 overruns:0 frame:0 TX packets:48 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3320 (3.2 KiB) TX bytes:3320 (3.2 KiB) Код root@OpenWrt:/etc/init.d# ifconfig eth1 up [ 382.377131] fec 800f4000.ethernet eth1: no PHY, assuming direct connection to switch [ 382.385056] libphy: PHY fixed-0:00 not found [ 382.389372] fec 800f4000.ethernet eth1: could not attach to PHY
root@OpenWrt:/etc/init.d# ifconfig eth0 up [ 425.739776] fec 800f0000.ethernet eth0: Freescale FEC PHY driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=800f0000.etherne:01, irq=-1) [ 425.752812] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready root@OpenWrt:/etc/init.d# [ 427.734581] fec 800f0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx [ 427.742637] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
Сообщение отредактировал vgovseychuk - Jan 11 2016, 13:35
|
|
|
|
|
Jan 11 2016, 14:41
|
Знающий
   
Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050

|
Цитата(vgovseychuk @ Jan 11 2016, 16:34)  GPIO2.13 - пин сброса физики, определен как hog-pin Как я понимаю, чтобы заставить систему думать, что микросхемы две, надо отключить MDIO. Некоторые микросхемы PHY не имеют такого интерфейса. Вторая теория состоит в том, чтобы подменять как-то адреса(то есть система будет думать, что шлет сигналы на выводы ETH0, а на самом деле на ETH1). Но это по-моему, либо сложно, либо невозможно. И да, до этого все работало как часы, т.е. обе физики. Теперь в Linux ни одна не работает. как-то противоречиво по симптоматике.. работали оба канала, потом нулевой сгорел, но первый совсем не видится.. видимо надо в логи смотреть (aaarrr прав), покажите что выводит Код cat /proc/net/dev и вывод dmesg на pastebin.com положите чисто для пробы - попробуйте запретить mac0 в dts, а строки о контакте сброса перебросьте в секцию mac1 Код root@OpenWrt:/# ifconfig -a eth0 Link encap:Ethernet HWaddr 00:01:87:22:33:44 eth1 Link encap:Ethernet HWaddr 00:01:87:00:00:00 странные цифры у eth1 - обычно разница в единицу.. по MDIO у чипа MAC [SMSC LAN8710/LAN8720] три пина для задания адреса на шине mdc/mdio, т.е. до 8 одинаковых чипов на шину. ядро в процессе загрузки перебирает 32 адреса, судя по dts оба чипа висят на одной шине.. пока идей нет, если конечно первый чип выгорая, не прихватил второй..
|
|
|
|
|
Jan 12 2016, 08:35
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 16-03-14
Пользователь №: 80 955

|
Короче, забил следующие костыли: 1. В драйвер FEC (файл fec_main.c , закомментил 2 строки) , как тут: https://community.freescale.com/thread/2498942. В dts добавил задействованные пины из mac0 в mac1: Код mac0: ethernet@800f0000 { phy-mode = "rmii"; pinctrl-names = "default"; pinctrl-0 = <&mac0_pins_custom>; phy-reset-gpios = <&gpio2 13 GPIO_ACTIVE_LOW>; phy-reset-duration = <100>; status = "okay"; }; mac1: ethernet@800f4000 { phy-mode = "rmii"; pinctrl-names = "default"; pinctrl-0 = <&mac1_pins_a>; pinctrl-1 = <&mac0_pins_custom>; phy-reset-gpios = <&gpio2 13 GPIO_ACTIVE_LOW>; phy-reset-duration = <100>; status = "okay"; }; 3. В dtsi добавил клоки для eth1(до этого были только в eth0): Код mac0: ethernet@800f0000 { compatible = "fsl,imx28-fec"; reg = <0x800f0000 0x4000>; interrupts = <101>; clocks = <&clks 57>, <&clks 57>, <&clks 64>; // clocks added clock-names = "ipg", "ahb", "enet_out"; status = "disabled"; };
mac1: ethernet@800f4000 { compatible = "fsl,imx28-fec"; reg = <0x800f4000 0x4000>; interrupts = <102>; clocks = <&clks 57>, <&clks 57>, <&clks 64>; clock-names = "ipg", "ahb", "enet_out"; status = "disabled"; }; Заработало. Система думает, что физики две, но нулевую я не использую. Всем спасибо.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|