以下代码都在github
https://github.com/SourceLink/S5PV210
一、网卡初始化分析
网卡初始化是在board_init_r中的init_sequence队列中的initr_net函数中:
#ifdef CONFIG_CMD_NET
INIT_FUNC_WATCHDOG_RESET
initr_net,
#endif
#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
/*
* 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;
}
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);
}
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 */