[ECOS] Ethernet driver question

Gokoen gokoen_masahiro@ybb.ne.jp
Tue Oct 9 11:45:00 GMT 2007


Hello,

I'm sorry,since I am a Japanese it took me long time to write reply.

Mr Jürgen Lambrecht wrote,
> I think the problem could be that your hardware driver has not been 
> compiled.
> If you are using an existing board supported by eCos, and are using the 
> net template of the board, then it must be something else.
>
> Can you better discribe all of it.
>

I apologize for lengthy reply.

I already made "MyTarget" template for my board, copying and amending 
"Hitachi SE77x9 board" template.
I already checked RedBoot is working properly.

I am chechikng SMSC LAN91C111 driver(if_lan91cxx.c) using eCos test program 
"nc_test_slave.c".

I build using "MyTarget" hardware template and "net" package template,and 
link to nc_test_slave.c.

My target's configuration is like next.
[in  ecos.db]
target mytarget {
        alias       { "Hitachi mytarget board" }
        packages    { CYGPKG_HAL_SH
                      CYGPKG_HAL_SH_SH3
                      CYGPKG_HAL_SH_SH77X9_mytarget
                      CYGPKG_IO_FLASH
                      CYGPKG_DEVS_FLASH_SH_mytarget
                      CYGPKG_DEVS_FLASH_AMD_AM29XXXXX

                      CYGPKG_DEVS_ETH_SMSC_LAN91CXX
                      CYGPKG_DEVS_ETH_SH_MYTARGET
                      CYGPKG_IO_ETH_DRIVERS

                      CYGPKG_IO_SERIAL_SH_mytarget
                      CYGPKG_IO_SERIAL_SH_SCIF
        }
        description "
           The mytarget target provides the packages needed to run
           eCos on a Hitachi Solution Engine 77x9 board."
}

[in mytarget_eth_drivers.cdl]
cdl_package CYGPKG_DEVS_ETH_SH_MYTARGET {

    display       "Mytarget SMC91C111 ethernet driver"

    parent        CYGPKG_IO_ETH_DRIVERS
    active_if     CYGPKG_IO_ETH_DRIVERS
    active_if     CYGPKG_HAL_SH_SH77X9_mytarget

    # chip wired in PCMCIA, 16-bit mode, no EEPROM
    implements    CYGHWR_NET_DRIVERS
    implements    CYGHWR_NET_DRIVER_ETH0
    implements    CYGINT_DEVS_ETH_SMSC_LAN91CXX_REQUIRED
##    implements    CYGINT_DEVS_ETH_SMSC_LAN91CXX_PCMCIA_MODE
    implements    CYGINT_DEVS_ETH_SMSC_LAN91CXX_STATIC_ESA

    requires      CYGPKG_DEVS_ETH_SMSC_LAN91CXX
    description   "Ethernet driver for Mytarget boards."

    include_dir   cyg/io
    compile       if_mytarget.c

    define_proc {
        puts $::cdl_system_header "/***** ethernet driver proc output start 
*****/"
        puts $::cdl_system_header "#define CYGDAT_DEVS_ETH_SMSC_LAN91CXX_INL 
<cyg/io/devs_eth_mytarget.inl>"
        puts $::cdl_system_header "#define CYGDAT_DEVS_ETH_SMSC_LAN91CXX_CFG 
<pkgconf/devs_eth_sh_mytarget.h>"
        puts $::cdl_system_header "/*****  ethernet driver proc output end 
*****/"
    }

    # Arguably this should do in the generic package
    # but then there is a logic loop so you can never enable it.

    cdl_interface CYGINT_DEVS_ETH_SMSC_LAN91CXX_REQUIRED {
        display   "SMSC LAN91CXX driver required"
    }

    cdl_option CYGDAT_DEVS_ETH_SH_MYTARGET_NAME {
        display       "Device name for the ethernet driver"
        flavor        data
        default_value {"\"eth0\""}
        description   "
            This option sets the name of the ethernet device for the
            ethernet port."
    }

    cdl_option CYGDAT_DEVS_ETH_SH_MYTARGET_ESA {
        display       "The ethernet station address (MAC)"
        flavor        data
        default_value {"{0x00, 0x40, 0x31, 0x08, 0x01, 0x00}"}
        description   "A static ethernet station address.
            Caution: Booting two systems with the same MAC on the same
            network, will cause severe conflicts."
        active_if     !CYGSEM_DEVS_ETH_SH_MYTARGET_REDBOOT_ESA
    }

    cdl_option CYGSEM_DEVS_ETH_SH_MYTARGET_REDBOOT_ESA {
        display "Use the RedBoot ESA (MAC address)"
        default_value 0
        flavor        bool
        description   "
            Use the ESA that is stored as a RedBoot variable instead of
            a static ESA."
    }

}
end of [in mytarget_eth_drivers.cdl]

I register interrupt ruoitnes
in \packages\devs\eth\smsc\lan91cxx\current\src\if_lan91cxx.c's
smsc_lan91cxx_init() like next,
#ifndef CYGPKG_IO_ETH_DRIVERS_STAND_ALONE
   // Initialize environment, setup interrupt handler
   cyg_drv_interrupt_create(cpd->interrupt,
                            CYGNUM_DEVS_ETH_SMSC_LAN91CXX_INT_PRIO,
                            (cyg_addrword_t)sc,
                            (cyg_ISR_t *)lan91cxx_isr,
                            (cyg_DSR_t *)eth_drv_dsr,
                            &lan91cxx_interrupt_handle,
                            &lan91cxx_interrupt);
   cyg_drv_interrupt_attach(lan91cxx_interrupt_handle);
#endif // !CYGPKG_IO_ETH_DRIVERS_STAND_ALONE
   cyg_drv_interrupt_acknowledge(cpd->interrupt);
   cyg_drv_interrupt_unmask(cpd->interrupt);


My target's LAN91C111 driver instantiating file is
\packages\devs\eth\sh\mytarget\current\include\devs_eth_mytarget.inl,
copying and amending 
\packages\devs\eth\arm\flexanet\current\include\devs_eth_flexanet.inl

[devs_eth_mytarget.inl]
#include <pkgconf/system.h>
#include <pkgconf/devs_eth_sh_mytarget.h>
#include <cyg/hal/hal_intr.h>

// MAC address is stored as a Redboot config option
#ifdef CYGPKG_REDBOOT
#include <pkgconf/redboot.h>
#ifdef CYGSEM_REDBOOT_FLASH_CONFIG
#include <redboot.h>
#include <flash_config.h>

#define LAN91CXX_IS_LAN91C111

RedBoot_config_option("Network hardware address [MAC]",
                     mytarget_esa,
                     ALWAYS_ENABLED, true,
                     CONFIG_ESA, 0
   );
#endif
#endif

// ESA address fetch function
static void mytarget_get_ESA(struct lan91cxx_priv_data *cpd)
{
   // Fetch hardware address from RedBoot config
#if defined(CYGSEM_DEVS_ETH_SH_MYTARGET_REDBOOT_ESA)
#if defined(CYGPKG_REDBOOT) && \
   defined(CYGSEM_REDBOOT_FLASH_CONFIG)
   flash_get_config("mytarget_esa", cpd->enaddr, CONFIG_ESA);
#else
#error "No RedBoot flash configuration to store ESA"
#endif
#else
   unsigned char static_esa[] = CYGDAT_DEVS_ETH_SH_MYTARGET_ESA;
   memcpy(cpd->enaddr, static_esa, 6);
#endif
}

static lan91cxx_priv_data lan91cxx_eth0_priv_data = {
   config_enaddr : mytarget_get_ESA,
#ifndef CYGSEM_DEVS_ETH_SH_MYTARGET_REDBOOT_ESA
   enaddr: CYGDAT_DEVS_ETH_SH_MYTARGET_ESA,
   hardwired_esa : true,
#else
   hardwired_esa : false,
#endif
  base : (unsigned short *) 0xa8000000,
  interrupt : 9,
};

ETH_DRV_SC(lan91cxx_sc,
          &lan91cxx_eth0_priv_data,          // Driver specific data
          CYGDAT_DEVS_ETH_SH_MYTARGET_NAME, // Name for device
          lan91cxx_start,
          lan91cxx_stop,
          lan91cxx_control,
          lan91cxx_can_send,
          lan91cxx_send,
          lan91cxx_recv,
          lan91cxx_deliver,
          lan91cxx_poll,
          lan91cxx_int_vector
);

NETDEVTAB_ENTRY(lan91cxx_netdev,
               "lan91cxx_" CYGDAT_DEVS_ETH_SH_MYTARGET_NAME,
               smsc_lan91cxx_init,
               &lan91cxx_sc);

//EOF devs_eth_mytarget.inl
end of [in mytarget_eth_drivers.cdl]

I think if I could call lan91cxx_start routine properly,lan91cxx drv will 
work,
but as I said in previous mail,since ng_ether_attach_p == NULL,I couldn't 
execute
attach routine  (*ng_ether_attach_p)(ifp);

As a try,I inserted next coding before calling (*ng_ether_attach_p) in 
ether_ifattach().

 ng_ether_attach_p = if_attach;
 if (ng_ether_attach_p != NULL)
  (*ng_ether_attach_p)(ifp);

Then executed (*ng_ether_attach_p)(ifp) and jumped
 if_attach(ifp)
in packages\net\bsd_tcpip\current\src\sys\net\if.c

But lan91cxx_start was never called.

Although I cannot understand how lan91cxx_start is called,
looks like the mechanism that calls lan91cxx_start is not working.

My fconfig setting is below.
[my fconfi setting]
RedBoot> fconfig
Run script at boot: true
Boot script:
.. fis load -b 0x8c010000 nc_slave
.. channel 1
.. go 0x8c010000
Enter script, terminate with empty line
>> fis load -b 0x8c010000 nc_slave
>> channel 1
>> go 0x8c010000
>>
Boot script timeout (1000ms resolution): 3
Use BOOTP for network configuration: false
Gateway IP address: 172.16.1.1
Local IP address: 172.16.1.200
Local IP address mask: 255.255.255.0
Default server IP address: 172.16.1.1
Console baud rate: 38400
dns_ip: 172.16.1.1
GDB connection port: 9000
Force console for special debug messages: false
Network hardware address [MAC]: 0x00:0x40:0x31:0x08:0x01:0x00
Network debug at boot time: true
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xa03f0000-0xa0400000: .
... Program from 0x8fff0000-0x90000000 at 0xa03f0000: .
RedBoot>
end of [my fconfi setting]

And RedBoot serial output is below.
[RedBoot serial output]
My Flash ID is 4:22f9:0:19
eth_drv_init:enaddr=0x8c0005c4
Ethernet send:
8C002214: FF FF FF FF FF FF 00 40  31 08 01 00 08 06        |.......@1..... 
|
Ethernet send:
8C002214: FF FF FF FF FF FF 00 40  31 08 01 00 08 06        |.......@1..... 
|
Ethernet send:
8C002214: FF FF FF FF FF FF 00 40  31 08 01 00 08 06        |.......@1..... 
|
Ethernet send:
8C002214: FF FF FF FF FF FF 00 40  31 08 01 00 08 06        |.......@1..... 
|
Ethernet send:
8C002214: FF FF FF FF FF FF 00 40  31 08 01 00 08 06        |.......@1..... 
|
Ethernet send:
8C002214: FF FF FF FF FF FF 00 40  31 08 01 00 08 06        |.......@1..... 
|
Ethernet send:
8C002214: FF FF FF FF FF FF 00 40  31 08 01 00 08 06        |.......@1..... 
|
Ethernet send:
8C002214: FF FF FF FF FF FF 00 40  31 08 01 00 08 06        |.......@1..... 
|
Ethernet eth0: MAC address 00:40:31:08:01:00
IP: 172.16.1.200/255.255.255.0, Gateway: 172.16.1.1
Default server: 172.16.1.1

RedBoot(tm) bootstrap and debug environment [ROM]
Non-certified release, version UNKNOWN - built 16:50:29, Sep 19 2007

Platform: mytarget (SH 7709S)
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
Copyright (C) 2003, 2004, 2005, 2006 eCosCentric Limited

RAM: 0x8c000000-0x90000000, [0x8c00bed0-0x8ffed000] available
FLASH: 0xa0000000 - 0xa0400000, 64 blocks of 0x00010000 bytes each.
== Executing boot script in 3.000 seconds - enter ^C to abort
Ethernet recv:
8C005D34: FF FF FF FF FF FF 00 15  C5 6D 23 F0 08 06        |.........m#... 
|
Ethernet recv:
8C006344: FF FF FF FF FF FF 00 15  C5 6D 23 F0 08 06        |.........m#... 
|
Ethernet recv:
8C006954: FF FF FF FF FF FF 00 15  C5 6D 23 F0 08 06        |.........m#... 
|
RedBoot> fis load -b 0x8c010000 nc_slave
RedBoot> channel 1
RedBoot> go 0x8c010000
Network stack using 69632 bytes for misc space
                    69632 bytes for mbufs
                    139264 bytes for mbuf clusters
[cyg_net_init] Init: mbinit(0x00000000)
[cyg_net_init] Init: cyg_net_init_devs(0x00000000)
Init device 'lan91cxx_eth0'
smsc_lan91cxx_init
LAN91CXX - supposed BankReg @ a800000e = 3302
LAN91CXX - type: 9, rev: 1
LAN91CXX - status: 0069
LAN91CXX - static ESA: 00:40:31:08:01:00
[cyg_net_init] Init: loopattach(0x00000000)
[cyg_net_init] Init: ifinit(0x00000000)
[cyg_net_init] Init: domaininit(0x00000000)
[cyg_net_init] Init: cyg_net_add_domain(0x8c05a754)
New domain internet at 0x00000000
[cyg_net_init] Init: cyg_net_add_domain(0x8c05a198)
New domain route at 0x00000000
[cyg_net_init] Init: call_route_init(0x00000000)
[cyg_net_init] Done
Start Network Characterization - SLAVE
No load = 58442
Set background load = 20%
Set background load = 0%
High Load[20] = 37136 => 37%
Set background load = 20%
Set background load = 0%
Load[10] = 47742 => 19%
Set background load = 20%
Set background load = 0%
Final load[10] = 47858 => 19%
Start test for eth0
end of [RedBoot serial output]

What do I lack to install lan91cxx driver ?
I would appreciate any help.

Gokoen Masahiro

> My first mail:
>> Hello,
>>
>> I am a newcomer to eCos.
>>
>> I am trying to run LAN91C111 driver using "net" template,but I am 
>> encountered what I cannot understand.
>>
>> My target board is implemented with SH7709S CPU and SMSC LAN91C111 
>> ethernet controller.
>>
>> Looks like doing nothing,so
>> I checked attach routine.
>>
>> I discovered attach is executed at 
>> /packages/net/bsd_tcpip/current/src/sys/net/if_ethersubr.c
>> ether_ifattach(ifp, bpf) function's last part.
>>
>> if (ng_ether_attach_p != NULL)
>>  (*ng_ether_attach_p)(ifp);
>>
>> But I discovered that because ng_ether_attach_p == NULL,
>> it skipped over (*ng_ether_attach_p)(ifp).
>>
>> ng_ether_attach_p is defined in 
>> /packages/net/bsd_tcpip/current/include/sys/param.h
>> #define ng_ether_attach_p cyg_ng_ether_attach_p
>> but cyg_ng_ether_attach_p == NULL.
>>
>> eCos version is CVS downloaded current version.
>>
>> I do not know why this happens.
>> Would you please teach me what shoud I do ?
>>
>> I would appreciate your help.
>>
>> Gokoen
>> 

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss



More information about the Ecos-discuss mailing list