Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Доступ к PHY через ETH1
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
vgovseychuk
Добрый день, господа!

На плате наглухо выгорела микросхема физики, привязанная к 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. Я новичок в подобных системах, поэтому кое-какие моменты мог неправильно изложить, но вроде, осциллограф подтверждает описанную теорию.
aaarrr
Цитата(vgovseychuk @ Jan 11 2016, 15:35) *
Попытался править dts, но безуспешно.

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

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

Очень похоже, что все обстоит именно так.
Jury093
Цитата(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";
vgovseychuk
Вот, что сейчас у меня прописано из устройств, висящих на шине 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
Jury093
Цитата(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 оба чипа висят на одной шине..
пока идей нет, если конечно первый чип выгорая, не прихватил второй..
vgovseychuk
Короче, забил следующие костыли:
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";
        };


Заработало. Система думает, что физики две, но нулевую я не использую.
Всем спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.