u-boot-2016.11移植网卡(基于s5pv210)

以下代码都在github

https://github.com/SourceLink/S5PV210

一、网卡初始化分析

网卡初始化是在board_init_r中的init_sequence队列中的initr_net函数中:

#ifdef CONFIG_CMD_NET
        INIT_FUNC_WATCHDOG_RESET
        initr_net,
#endif

initr_net函数中又调用了eth_initialize函数进行初始化

#ifdef CONFIG_CMD_NET
static int initr_net(void)
{
        puts("Net:   ");
        eth_initialize();
#if defined(CONFIG_RESET_PHY_R)
        debug("Reset Ethernet PHY\n");
        reset_phy();
#endif
        return 0;
}
#endif

进行代码跟踪后发现eth_initialize函数在net/eth_legacy.c中定义

        /*
         * If board-specific initialization exists, call it.
         * If not, call a CPU-specific one
         */
        if (board_eth_init != __def_eth_init) {
                if (board_eth_init(gd->bd) < 0)
                        printf("Board Net Initialization Failed\n");
        } else if (cpu_eth_init != __def_eth_init) {
                if (cpu_eth_init(gd->bd) < 0)
                        printf("CPU Net Initialization Failed\n");
        } else {
                printf("Net Initialization Skipped\n");
        }


然后继续跟踪发现board_eth_init 在smdkv210.c中定义。


二、移植

1、首先更改board_eth_init函数,更改如下:

int board_eth_init(bd_t *bis)
{
        int rc = 0;
        /* add by Sourcelink */
        rc = dm9000_initialize(bis);
        return rc;
}

2、更改硬件初始化,在smdkv210.c中

int board_init(void)
{
        dm9000_pre_init();

        gd->bd->bi_arch_number = MACH_TYPE_SMDKC100;
        gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;

        return 0;
}

static void dm9000_pre_init(void)
{
        u32 smc_bw_conf, smc_bc_conf;
        /* Ethernet needs bus width of 16 bits */
        smc_bw_conf = SMC_DATA16_WIDTH(CONFIG_ENV_SROM_BANK) | SMC_BYTE_ADDR_MODE(CONFIG_ENV_SROM_BANK);
        smc_bc_conf = SMC_BC_TACS(0x0) | SMC_BC_TCOS(0x1) | SMC_BC_TACC(0x2)
                        | SMC_BC_TCOH(0x1) | SMC_BC_TAH(0x0)
                        | SMC_BC_TACP(0x0) | SMC_BC_PMC(0x0);

        /* Select and configure the SROMC bank */
        s5p_config_sromc(CONFIG_ENV_SROM_BANK, smc_bw_conf, smc_bc_conf);
}

3、把驱动添加到编译程序中,查看vim drivers/net/Makefile 

obj-$(CONFIG_DRIVER_DM9000) += dm9000x.o
发现需要定义这个宏,接着在smdkv210.h中定义。

4、定义一些关键宏

1)CONFIG_DM9000_NO_SROM

2)CONFIG_ENV_SROM_BANK 1      选择SROM_BANK1,具体参看原理图修改

3)CONFIG_DM9000_BASE      0x88000000  bank1的地址也就时dm9000的地址

4)DM9000_IO               (CONFIG_DM9000_BASE)

5)DM9000_DATA             (CONFIG_DM9000_BASE + 0x4)

6)CONFIG_CMD_PING 可以使用命令ping

7)CONFIG_NET_RANDOM_ETHADDR   CONFIG_LIB_RAND  随机生成网卡物理地址

/* add by Sourcelink */
#define CONFIG_DRIVER_DM9000    
#define CONFIG_DM9000_NO_SROM
#define CONFIG_DM9000_BASE      0x88000000
#define DM9000_IO               (CONFIG_DM9000_BASE)
#define DM9000_DATA             (CONFIG_DM9000_BASE + 0x4)
#define CONFIG_NET_RANDOM_ETHADDR       
#define CONFIG_LIB_RAND
#define CONFIG_ENV_SROM_BANK    1
#define CONFIG_CMD_PING
#endif /* CONFIG_CMD_NET */

你可能感兴趣的:(u-boot)