реклама на сайте
подробности

 
 
> Доступ к PHY через ETH1
vgovseychuk
сообщение Jan 11 2016, 12:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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. Я новичок в подобных системах, поэтому кое-какие моменты мог неправильно изложить, но вроде, осциллограф подтверждает описанную теорию.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
aaarrr
сообщение Jan 11 2016, 12:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(vgovseychuk @ Jan 11 2016, 15:35) *
Попытался править dts, но безуспешно.

Так приложили бы сразу свой dts. И выхлоп dmesg.

Цитата(vgovseychuk @ Jan 11 2016, 15:35) *
P.S. Я новичок в подобных системах, поэтому кое-какие моменты мог неправильно изложить, но вроде, осциллограф подтверждает описанную теорию.

Очень похоже, что все обстоит именно так.
Go to the top of the page
 
+Quote Post
Jury093
сообщение Jan 11 2016, 13:08
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 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";
Go to the top of the page
 
+Quote Post
vgovseychuk
сообщение Jan 11 2016, 13:34
Сообщение #4


Участник
*

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



Вот, что сейчас у меня прописано из устройств, висящих на шине AHB:
Код
    ahb@80080000 {
        usb0: usb@80080000 {
            pinctrl-names = "default";
            pinctrl-0 = <&usb0_pins_a>;
            vbus-supply = <&reg_usb0_vbus>;
            status = "okay";
        };
        usb1: usb@80090000 {
            pinctrl-names = "default";
            pinctrl-0 = <&usb1_pins_a>;
            vbus-supply = <&reg_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
Go to the top of the page
 
+Quote Post
Jury093
сообщение Jan 11 2016, 14:41
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 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 оба чипа висят на одной шине..
пока идей нет, если конечно первый чип выгорая, не прихватил второй..
Go to the top of the page
 
+Quote Post
vgovseychuk
сообщение Jan 12 2016, 08:35
Сообщение #6


Участник
*

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



Короче, забил следующие костыли:
1. В драйвер FEC (файл fec_main.c , закомментил 2 строки) , как тут: https://community.freescale.com/thread/249894
2. В 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";
        };


Заработало. Система думает, что физики две, но нулевую я не использую.
Всем спасибо.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.0142 секунд с 7
ELECTRONIX ©2004-2016