Linux 驱动移植之DM9000网卡(基于Linux-3.4.2)

1.启动开发板,此时uboot环境变量没有设置machid,那么machid一定会采用在uboot代码中的初始化:

果然,此时的machid = id of smdk2410      (当然,此时的整个系统完全能正常启动)

2.测试net功能

    2.1smdk2410

    

    显然smdk2410检测不到网卡驱动。

    2.2smdk2440

    

    

     还是没有网卡驱动。

    2.3mini2440

    

    测试1:能检测DM9000网卡,能设置ip

    

    测试2:ping 

    

    不能ping www.baidu.com  因为没有运行DNS服务。

    但是能ping 通宿主机。

    测试三:nfs mount     (前提是server必须安装nfs,并启动)

    

    mount 失败!

3.给SMDK2440移植DM9000

3.1分析:

    Linux-3.4.2中已经很好的支持DM9000,且有DM9000驱动文件,只是版本有点老。

    在内核中DM9000采用的是platform平台驱动架构。platform驱动架构主要是分两部分:platform device和platform driver

    其中platform device在arch/arm/mach-上c24xx/mach-smdk2440.c中:

    首先要:确定板载资源:struct resource xxx-dm9000-resource{。。。。}

    然后要:确定一些DM9000的私有数据(有没有EEPROM,位宽):struct     

    其次要:填充struct platform_device xxx_dm9000_device{...}

    最后要:在struct  platform_device *xxx_device={  &xxx_dm9000_device}

    补充:Linux内核启动的时候执行start_kernel->setup_arch->...->xxx_device.....所有平台设备的资源注册是在内核启动的时候就完成了。

    其中platform driver在drivers/net/ethernet/davicom/dm9000.c中:

    驱动是完整且与该内核兼容,所以不用修改。

    至于原理不再叙述。。。。

3.2移植

在arch/arm/mach-上c24xx/mach-smdk2440.c中:

添加板载资源:

先看mini2440:

修改:

第二步:修改私有数据:

先看mini2440:

修改:

最后添加:

添加:

OK!

4.编译uImage并测试

set machid 16a

在启动信息中:可以看出内核已经识别出DM9000了

测试:

能设置ip,也能ping 通。

但任然不能挂载:

不过不能挂载不是DM9000的问题。

所以,移植成功!

5.总结

    需要注意的是:

    a.理解platform驱动架构

    b.知道板载资源的IO地址是怎么分配的

    c.了解device 和 driver是怎么注册到内核的。

猜你喜欢

转载自blog.csdn.net/Carl_0/article/details/87855938