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

本文档详细介绍了在S5PV210平台上如何移植u-boot-2016.11的网卡初始化过程,包括在board_init_r的init_sequence队列中的initr_net函数初始化,以及在smdkv210.c中定义的board_eth_init函数的更改。主要涉及的关键宏包括CONFIG_DM9000_NO_SROM、CONFIG_ENV_SROM_BANK、CONFIG_DM9000_BASE等,以及配置支持ping命令和随机生成网卡物理地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码都在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 */

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值