Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DM365 и RTL8201
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
/dev/null
Доброго дня!
Имеется самодельная плата с процессором DM365 и сетевой Realtek RTL8201, в работе используется linux-2.6.18_pro500, из состава SDK, и u-boot 1.3.4.
Слегка модифицировав u-boot я добился работающего ping-а, к сожалению tftp пока не работает.
Но более приоретным является работоспособность сети в Linux, драйвер davinci_emac от TI видит чип, но смонтировать файловую систему по NFS не может, NFS-сервер в это время работает.
Из странного в работе - постоянно горит индикатор линка, но при попытке монтирования файловой сети он тухнет.
Привожу лог загрузки, касающейся сети:
Код
Linux version 2.6.18_pro500-davinci_evm-arm_v5t_le-gb43d9841-dirty (kirill@kirill) (gcc version 4.2.0 (MontaVista 4.2.0-16.0.32.0801914 2008-08-30)) #1 PREEMPT Mon Nov 29 12:55:40 MSK 2010
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
Machine: DaVinci DM365 EVM
...............................................
Kernel command line: console=ttyS0,115200n8 noinitrd rw eth=00:01:02:03:04:05 ip=192.168.10.254:192.168.10.3:::arm:eth0:off root=/dev/nfs nfsroot=192.168.10.3:/home/kirill/nfs/rootfs,nolock
TI DaVinci EMAC: kernel boot params Ethernet address: 00:01:02:03:04:05
....................................................
Generic PHY: Registered new driver
......................................................
RTL8201PHY: Starting realtek_init.
Realtel RTL8201: Registered new driver
Davinci EMAC MII Bus: probed
i2c_davinci i2c_davinci.1: timeout waiting for bus ready
i2c_davinci i2c_davinci.1: timeout waiting for bus ready
i2c_davinci i2c_davinci.1: timeout waiting for bus ready
i2c_davinci i2c_davinci.1: timeout waiting for bus ready
MAC address is 02:00:10:00:00:00
TI DaVinci EMAC Linux version updated 4.0
...............................................
IPv4 over IPv4 tunneling driver
TCP bic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
...........................................
RTL8201PHY: Starting rtl8201_config_init.
found Realtek RTL8201 PHY
IP-Config: Guessing netmask 255.255.255.0
IP-Config: Complete:
      device=eth0, addr=192.168.10.254, mask=255.255.255.0, gw=255.255.255.255,
     host=arm, domain=, nis-domain=(none),
     bootserver=192.168.10.3, rootserver=192.168.10.3, rootpath=
Looking up port of RPC 100003/2 on 192.168.10.3
portmap: server 192.168.10.3 not responding, timed out
Root-NFS: Unable to get nfsd port number from server, using default
Looking up port of RPC 100005/1 on 192.168.10.3
portmap: server 192.168.10.3 not responding, timed out
Root-NFS: Unable to get mountd port number from server, using default
mount: server 192.168.10.3 not responding, timed out
Root-NFS: Server returned error -5 while mounting /home/kirill/nfs/rootfs
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

Строки начинающиеся на RTL8201PHY являются выводом из моей попытки дописать работу с RTL8201 к Generic PHY.
Может кто-нибудь решил эту проблему?
Спасибо.
sasamy
Цитата(/dev/null @ Dec 1 2010, 13:07) *
NFS-сервер в это время работает.
.......

Looking up port of RPC 100005/1 on 192.168.10.3
portmap: server 192.168.10.3 not responding, timed out
Root-NFS: Unable to get mountd port number from server, using default
mount: server 192.168.10.3 not responding, timed out


Уверены что сервер работает ? Демон portmap запущен ?
#ps -A | grep portmap
/dev/null
Абсолютно.
Код
$ ps aux | grep nfs | grep -v grep
root      1106  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsiod]
root      1387  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd4]
root      1388  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1389  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1390  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1391  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1392  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1393  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1394  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1395  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]

$ ps aux | grep portmap | grep -v grep
daemon    1076  0.0  0.0   1796   444 ?        Ss   Nov29   0:00 /sbin/portmap

У меня создаётся впечатление, что в момент подключения к серверу сетевой чип выключают. Косвенно это подтверждает выключение светодиода на сетевом разъёме.
Поддерживаемые в ядре 2.6.18 PHY:
Код
$ ls drivers/net/phy | grep c
broadcom.c
cicada.c
davicom.c
fixed.c
icplus.c
Kconfig
lxt.c
marvell.c
mdio_bus.c
phy.c
phy_device.c
phy_device.o
qsemi.c
realtek.c
smsc.c
vitesse.c

Файл realtek.c - это моя попытка добавить поддержку RTL8201, на данный момент неудачная.
sasamy
Цитата(/dev/null @ Dec 2 2010, 09:43) *
Файл realtek.c - это моя попытка добавить поддержку RTL8201, на данный момент неудачная.


Вообще я сомневаюсь что для него вообще нужен какой-то драйвер smile.gif
http://www.realtek.com/faqs/faqsView.aspx?...d=1&Level=3

Цитата
# Q9: Why don't I find RTL8201x driver on the website?

A9:
RTL8201, RTL8201BL, RTL8201CL, RTL8201CP, RTL8201N and RTL8211B(L) are all PHYceiver. That is a driverless hardware device. Software driver are relative to Network controller ( MAC ) which is integrated into chipset in such case mostly. Please contact your mother board maker or chipset manufacturer to obtain proper driver support.
/dev/null
В U-Boot без драйвера не работало ничего, сейчас хоть ping заработал.
А насчёт нужности драйвера http://www.google.com/search?q=linux+rtl8201
Да и что-то не работает.
sasamy
Цитата(/dev/null @ Dec 2 2010, 11:41) *
В U-Boot без драйвера не работало ничего, сейчас хоть ping заработал.
А насчёт нужности драйвера http://www.google.com/search?q=linux+rtl8201
Да и что-то не работает.


И что вы нашли в гугле - у этого PHY нет irq, зачем там драйвер ? Покажите что вы делаете в драйвере ? Поддержка например в at91 для rtl8201 заключается только в чтении идентификатора и констатации факта - да, там у меня rtl8201 висит smile.gif максимум что может потребоваться - это прописать идентификатор, чтобы драйвер MAC узнавал его и знал - что-то висит на MII.

PS кстати посмотрите - может в вашем дроайвере MAC тоже нужно просто дописать его идентификатор а то вполне возможно что он не узнает PHY и отрубается.
/dev/null
Я разве утверждаю, что в драйвере делаю что-то сложное? wink.gif
Код
#include <linux/module.h>
#include <linux/phy.h>

char debug = 1;
#define DBG(format, args...) if (debug) printk("RTL8201PHY: " format "\n", ##args)

static int rtl8201_config_init(struct phy_device *phydev)
{
    DBG("Starting %s.", __func__);
    phydev->irq = PHY_POLL;
    //phydev->interrupts = PHY_INTERRUPT_DISABLED;

    return 0;
}

static int rtl8201_ack_interrupt(struct phy_device *phydev)
{
    DBG("Starting %s.", __func__);
    return 0;
}

static int rtl8201_config_interrupt(struct phy_device *phydev)
{
    DBG("Starting %s.", __func__);
    return 0;
}
static struct phy_driver rtl8201_driver = {
    .phy_id = 0x8201,
    .phy_id_mask = 0xffff,
    .name = "Realtel RTL8201",
    .features = (SUPPORTED_10baseT_Half | \
                 SUPPORTED_10baseT_Full | \
                 SUPPORTED_100baseT_Half | \
                 SUPPORTED_100baseT_Full | \
                 SUPPORTED_Autoneg | \
                 SUPPORTED_MII),
    .flags = 0,
    .config_init = rtl8201_config_init,
    .config_aneg = genphy_config_aneg,
    .read_status = genphy_read_status,
    .ack_interrupt = rtl8201_ack_interrupt,
    .config_intr = rtl8201_config_interrupt,
    .driver = {.owner = THIS_MODULE},
};

static int __init realtek_init(void)
{
    int ret;
    
    DBG("Starting %s.", __func__);
    ret = phy_driver_register(&rtl8201_driver);
    if (ret) {
        printk("Can't registered driver for Realtek RTL8201.\n");
        phy_driver_unregister(&rtl8201_driver);
    }

    return ret;
}

static void __exit realtek_exit(void)
{
    DBG("Starting %s.", __func__);
    phy_driver_unregister(&rtl8201_driver);
}

module_init(realtek_init);
module_exit(realtek_exit);

MAC я передаю в параметрах загрузки.
Пробовал ядро с моим драйвером и без него, результат одинаковый - нет соединения по NFS.
Может действительно проблема в железе? Но проверка тестом из CodeComposer прошла, правда там там тупо шлют некоторое количество байтов и пожалуй это доказывает только то, что процессор видит сетевой чип.
sasamy
Цитата(/dev/null @ Dec 2 2010, 12:14) *
Я разве утверждаю, что в драйвере делаю что-то сложное? wink.gif


Ну понятно - этот драйвер ровным счетом ничего и не делает smile.gif смотрите драйвер ethernet вашего давинча - как он пытается PHY обнаружить.
/dev/null
Код
#define PHY_ID_MASK        0xfffffff0
#define LXT971_ID        0x001378e0
#define KSZ8893MQL_ID    0x00221430
#define RTL8201_ID      0x8201

static int emac_phy_init(struct emac_dev *dev, u8 phy_num, u8 *phy_cnt,
             u8 *phy_max)
{
    char phy_id[BUS_ID_SIZE];

    snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, 1, phy_num);

    dev->phydev[phy_num] = phy_connect(dev->owner, phy_id,
        &emac_update_phy_status, 0, PHY_INTERFACE_MODE_MII);
    if (IS_ERR(dev->phydev[phy_num])) {
        if (dev->phydev[phy_num] == ERR_PTR(-ENODEV))
            dev->phydev[phy_num] = NULL;
        return PTR_ERR(dev->phydev[phy_num]);
    }

    dev->phydev[phy_num]->supported = PHY_BASIC_FEATURES;

    if (dev->init_cfg.gigabit)
        dev->phydev[phy_num]->supported |= SUPPORTED_1000baseT_Full;

    dev->phydev[phy_num]->advertising = dev->phydev[phy_num]->supported;

    if ((dev->phydev[phy_num]->phy_id & PHY_ID_MASK) == LXT971_ID) {
        /*
         * CRITICAL: Fix for increasing PHY signal drive strength for
         * TX lockup issue. On DaVinci EVM, the Intel LXT971 PHY
         * signal strength was low causing TX to fail randomly. The
         * fix is to Set bit 11 (Increased MII drive strength) of PHY
         * register 26 (Digital Config register) on this phy.
         */
        int control;

        pr_info("applying Intel LTX971 workaround..\n");

        control = phy_read(dev->phydev[phy_num], 26);
        phy_write(dev->phydev[phy_num], 26, (control | 0x800));
        phy_read(dev->phydev[phy_num], 26);
    } else if ((dev->phydev[phy_num]->phy_id & PHY_ID_MASK) ==
            KSZ8893MQL_ID) {
        /*
         * KSZ8893MQL is a layer 2 switch that connects to EMAC via
         * MII.  The MII setting is required to be fixed with autoneg
         * off, 100Mbps, and full duplex.  This happens to be the
         * settings and behavior when phy_mode is set to SNWAY_NOPHY.
         * Therefore, we set the phy_mode to SNWAY_NOPHY whenever
         * KSZ8893MQL is detected.
         */
        dev->init_cfg.phy_mode = SNWAY_NOPHY;

        /* The third phy is used for MII, so only expect 2 phys */
        *phy_max = 2;
    } else if ((dev->phydev[phy_num]->phy_id & 0xffff) == RTL8201_ID) {
        pr_info("found Realtek RTL8201 PHY\n");
        //dev->init_cfg.phy_mode = SNWAY_NOPHY;
    }

    *phy_cnt = *phy_cnt + 1;
    phy_start(dev->phydev[phy_num]);

    return 0;
}

PHY обнаруживается, при загрузке я вижу строку "found Realtek RTL8201 PHY".
sasamy
Цитата(/dev/null @ Dec 2 2010, 12:33) *
PHY обнаруживается, при загрузке я вижу строку "found Realtek RTL8201 PHY".


Смотрите драйвер изернет - включите отладочную информацию тогда ясно будет почему он линк гасит, как вы понимаете проблема не может быть в ничего не делающем драйвере smile.gif
/dev/null
Уважаемые, не сочтите за труд, посмотрите на правильность схемы.
sasamy
Цитата(/dev/null @ Dec 2 2010, 14:47) *
Уважаемые, не сочтите за труд, посмотрите на правильность схемы.


linux-xx/Documentation/networking/phy.txt

Цитата
Generic PHY driver

If the desired PHY doesn't have any errata, quirks, or special
features you want to support, then it may be best to not add
support, and let the PHY Abstraction Layer's Generic PHY Driver
do all of the work.


/dev/null
Читал я этот файл. Повторю ещё раз - не работает в любом случае, добавлю я свой драйвер или нет.
Некоторые странности в поведении наводят на мысль о ошибке в разводке, для чего выложил схему, или сбой железа.
Странности заключаются в следующем:
- при питании от 12В индикатор линка гаснет при попытке подсоединится по NFS, индикатор активно не горит, соединение по NFS не устанавливается
- при питании по POE когда идёт подсоединение по NFS, индикатор линка гаснет, но через секунду зажигается снова, также зажигается индикатор активности и даже слегка подмигивает, соединение по NFS не устанавливается.
Вставив отладку в драйвер производителя выяснил следующее - устанавливается скорость в 100 Мб/с, режим дуплекса UNKNOW, состояние чипа READY (функция emac_phy_init).
После этого запускается функция phy_start, которая переводи чип в состояние PHY_UP.
Разбираюсь дальше.

P.S. Неужто никто не применяет RTL8201? Или у меня так загрязнены чакры? wink.gif
Arischenko Ivan
Покажите :

cat /etc/exports
/dev/null
/home/kirill/nfs/rootfs 192.168.10.254(rw,no_root_squash,no_all_squash,subtree_check,sync)
Arischenko Ivan
У меня работает при таких параметрах :

linuxworld linux-2.6.31 # cat /etc/exports
# /etc/exports: NFS file systems being exported. See exports(5).

/home/red4sch/imx233/ltib/rootfs *(async,no_root_squash,rw,no_subtree_check)
/dev/null
Нет, проблема не в NFS, специально перепроверил с другой платой у которой стоит Davicom DM9000.
Arischenko Ivan
Есть тема на форуме http://electronix.ru/forum/index.php?showt...mp;hl=RTL8201BL

Там есть ссылка, Reference Designs на микросхему RTL8201BL.

Еще пример, на RTL8201BL.
http://elmicro.com/files/mcselec/iim7000a_datasheet.pdf

Из отличий с вашей схемой емкость С21 лишняя, и нет согласующей цепочки 2х резистора по 50 ом + емкость. Со стороны разъема используется подключение Poe, по этому ничего сказать не могу.

В файле exports у меня две настройки под разные PHY, я сталкивался с проблемой когда 100% рабочая плата не хотела работать с параметрами где были явно указанные IP адреса разрешенные к работе.

cat /etc/exports

linuxworld red4sch # cat /etc/exports
# /etc/exports: NFS file systems being exported. See exports(5).

#/root/rootfs/ 192.168.1.0(sync,no_root_squash,rw,no_subtree_check)
/usr/armv5te-softfloat-linux-gnueabi/ 192.168.10.0(async,no_root_squash,rw,no_subtree_check)
#/home/red4sch/BSP_ltib/ltib/rootfs/ 192.168.10.0(sync,no_root_squash,rw,no_subtree_check)
/home/red4sch/BSP_ltib/ltib/rootfs/ *(async,no_root_squash,rw,no_subtree_check)
/home/red4sch/rootfs/ *(async,no_root_squash,rw,no_subtree_check)
linuxworld red4sch #



Kernel command line: console=ttyAM0,115200 ssp1=spi1 ssp2=gpmi lcd_panel=ssd2119 root=/dev/nfs nfsroot=192.168.10.110:/home/red4sch/BSP_ltib/ltib/rootfs/ ip=192.168.10.100:192.168.10.110:192.168.10.1:255.255.255.0:::off

IP-Config: Complete:
device=eth0, addr=192.168.10.100, mask=255.255.255.0, gw=192.168.10.1,
host=192.168.10.100, domain=, nis-domain=(none),
bootserver=192.168.10.110, rootserver=192.168.10.110, rootpath=
/dev/null
Решил проблему.
Оказалось, что RTL8201 не очень хорошо воспринимает установку рестарта автоопределения (регистр 0, бит 9). Убрал его установку и палата сразу соединилась с NFS-сервером, правда, судя по индикации, на 10 Мб.
Но с этим буду разбираться попозже.
sasamy
Цитата(/dev/null @ Dec 7 2010, 13:23) *
судя по индикации, на 10 Мб.
Но с этим буду разбираться попозже.


Чтобы не судить по индикации есть специальные средства - ethtool. Кроме просмотра текущего состояния можно выставить любой режим.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.