uboot.2015.07移植之驱动DM9000(8)

来源:互联网 发布:苏州远洋数据有限公司 编辑:程序博客网 时间:2024/06/13 13:55

移植u-boot-2015.07之修改程序支持 DM9000 网卡

1.添加DM9000的驱动程序

  • 查看 drivers/net/Makefile 文件发现 dm9000x.o 是与 CONFIG_DRIVER_DM9000 这个宏有关的。修改 include/configs/smdk2440.h 如下
#define CONFIG_CS8900       /* we have a CS8900 on-board */#define CONFIG_CS8900_BASE   0x19000300#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */

改为

#define CONFIG_DRIVER_DM9000    /* 此项决定编译 DM9000x.c 文件 */uboot中搜索 CONFIG_DRIVER_DM9000,参考别的板级头文件,添加宏定义如下#define CONFIG_DRIVER_DM9000    /* 此项决定编译 DM9000x.c 文件 */#define CONFIG_DM9000_BASE 0x20000000   /* DM9000 的基地址,与 DM9000 与 S3C2440 的物理连接有关,查看原理图得到 DM9000 连接到 S3C2440 的哪一个片上面,这里是 nGCS4,也就是0x20000000起始地址处 */#define DM9000_IO CONFIG_DM9000_BASE    /* DM9000 的 IO,此处等于 DM9000 的起始基地址 */#define DM9000_DATA (CONFIG_DM9000_BASE + 4)    /* 与 DM9000 的 CMD 引脚有关,本板子 DM9000 的 CMD 引脚接到 LADDR2,所以要加上 2^2=4 */

2.配置时间参数

配置 BWSCON 以及 BANKCON4 寄存器来对应 DM9000 的设置,这里使用之前的配置 BANKCON4 = 0x00000700,BWSCON = 0x22011110

3.更改驱动程序

  • 在 sourceinsight 里面全局搜索 “Net:”,得到在 arch/arm/lib/board.c 以及 common/board_r.c里面有 eth_initialize(gd->bd);
eth_initialize(gd->bd); /* 前面我们知道 gd->bd 指向的是 bd_t 结构体,里面存有串口波特率以及ip地址等等 */    board_eth_init(bis)        int rc = 0;        #ifdef CONFIG_CS8900            rc = cs8900_initialize(0, CONFIG_CS8900_BASE);        #endif            return rc;
  • 将 board/samsung/smdk2440/smdk2440.c里的board_eth_init函数改为
int rc = 0;#ifdef CONFIG_CS8900    rc = cs8900_initialize(0, CONFIG_CS8900_BASE);#endif#ifdef CONFIG_DRIVER_DM9000    rc = dm9000_initialize(bis);    /* 好奇的是实际上并没有使用 bis 参数,不知道传入的目的是什么 */#endif    return rc;

4.修改网卡初始化配置

  • 修改 include/configs/smdk2440.h 里面的
#define CONFIG_NETMASK      255.255.255.0#define CONFIG_IPADDR       10.0.0.110#define CONFIG_SERVERIP     10.0.0.1

改为

#define CONFIG_NETMASK      255.255.255.0#define CONFIG_IPADDR       192.168.2.100       //自己根据需要设置#define CONFIG_SERVERIP     192.168.2.1         //自己根据需要设置#define CONFIG_ETHADDR      00:08:3e:26:0a:5b   //自己根据需要设置

由于2015.07版本中的 include/env_default.h 里面的 default_environment 数组里面并没有 “ethaddr=” 字样,所以我们添加一行如下

#ifdef  CONFIG_ETHADDR    "ethaddr="  __stringify(CONFIG_ETHADDR) "\0"#endif

这里设置完毕之后uboot启动的时候就会自动设置好想要的网络参数了,当然也可以通过uboot内置命令来进行设置

  • 为了解决 “ERROR: resetting DM9000 -> not responding” 与 “could not establish link” 输出信息(其实不管它也没有问题,但是就是看着不舒服,而且速度也比较慢)。将 DM9000x.c 里的 dm9000_reset(void) 函数改为
if ((DM9000_ior(DM9000_PIDL) != 0x0) ||    (DM9000_ior(DM9000_PIDH) != 0x90))    printf("ERROR: resetting DM9000 -> not responding\n");//改变为下面这样i = 0;do{    if(i == 1000)   //此数字根据具体情况进行赋值,我的是1000就可以了    {        break;    }    i ++;}while((DM9000_ior(DM9000_PIDL) != 0x0) || (DM9000_ior(DM9000_PIDH) != 0x90));

dm9000_init 函数里面的

i = 0;while (!(dm9000_phy_read(1) & 0x20)) {  /* autonegation complete bit */    udelay(1000);    i++;    if (i == 10000) {        printf("could not establish link\n");        return 0;    }}

全部注释掉,这样就会直接以100M全速运行。改动到这里就不会出现第一次ping不成功,要快速连ping两次才能成功
测试如下:

U-Boot 2015.07 (Jun 13 2016 - 18:58:30 +0800)CPUID: 32440001FCLK:      400 MHzHCLK:      100 MHzPCLK:       50 MHzDRAM:  64 MiBFlash: 2 MiBNAND:  256 MiBIn:    serialOut:   serialErr:   serialNet:   dm9000SMDK2440 # ping 192.168.2.1dm9000 i/o: 0x20000000, id: 0x90000a46 DM9000: running in 16 bit modeMAC: 00:0c:29:c1:01:efoperating at 100M full duplex modeUsing dm9000 devicehost 192.168.2.1 is alive
0 0
原创粉丝点击