专栏首页Linux驱动3.移植驱动到3.4内核-移植DM9000C驱动

3.移植驱动到3.4内核-移植DM9000C驱动

上章-使内核支持烧写yaffs2,裁剪内核并制作补丁

本章,便开始移植以前2.6内核的驱动到3.4新内核


1.介绍

首先内核更新,有可能会重新定义新的宏,去除以前的宏,以及更改函数名等

所以移植驱动的过程如下:

  • 1)编译
  • 2)解决错误
  • ->2.1)头文件不对:去掉或改名
  • ->2.2)宏不对:改名使用新宏
  • ->2.3)有些函数没有了:改名使用新函数

2.移植内核自带的DM9000网卡驱动

machid=16a(mach-smdk2440.c)的内核下输入ifconfig,发现该板卡的内核不支持DM9000,如下图所示:

而在machid= 7cf(mach-mini2440.c)的内核下输入ifconfig,却能支持DM9000,如下图所示:

2.1这是因为mach-mini2440.c单板文件里支持了内核自带的DM9000网卡驱动

1)进入内核的驱动文件看看(位于drivers/net/ethernet/davicom/dm9000.c)

首先来看init入口函数,代码如下:

static struct platform_driver dm9000_driver = {
       .driver     = {
              .name    = "dm9000", 
              .owner    = THIS_MODULE,
              .pm  = &dm9000_drv_pm_ops,
       },
       .probe   = dm9000_probe,                              //.probe函数
       .remove  = __devexit_p(dm9000_drv_remove),
};

static int __init dm9000_init(void)
{
       printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION);
       return platform_driver_register(&dm9000_driver);            //注册平台驱动
}

从上面代码看到,内核会注册一个"dm9000"平台驱动,而再注册个"dm9000"平台设备时,内核便会调用上面的probe函数来注册dm9000驱动.

2)然后再来看看mach-mini2440.c单板文件,是如何支持dm9000的,代码如下:

static struct platform_device mini2440_device_eth = {                           
       .name            = "dm9000",
       .id           = -1,              //id号,一个平台驱动可以有多个平台设备,-1表示只有一个平台设备
       .num_resources      = ARRAY_SIZE(mini2440_dm9k_resource), 
       .resource = mini2440_dm9k_resource,    //资源,保存硬件相关
       .dev        = {
              .platform_data       = &mini2440_dm9k_pdata, 
       },
};
... ...

static struct platform_device *mini2440_devices[] __initdata = {                    
       &s3c_device_ohci,
       &s3c_device_wdt,
       &s3c_device_i2c0,
       &s3c_device_rtc,
       &s3c_device_usbgadget,
       &mini2440_device_eth                 //需要添加的DM9000平台设备
       ... ...
};
... ...

static void __init mini2440_init(void)                   //init入口函数
{
 ... ...
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));       //注册平台设备
}     

从上面代码看到,由于mach-mini2440.c注册了一个name为"dm9000"的平台设备, 所以内核便会去匹配平台驱动,从而支持DM9000.c(平台设备一般保存的是硬件相关代码,然后平台驱动根据平台设备的内容来注册)

2.2然后参考上面平台设备,修改mach-smdk2440.c(位于arch/arm/mach-s3c24xx/mach-smdk2440.c)

(使它也支持内核自带的DM9000网卡驱动)

1)添加头文件

#include <linux/dm9000.h>  

2)添加全局变量:

#define MACH_SMDK2440_DM9K_BASE    (S3C2410_CS4 + 0x300)
static struct resource smdk2440_dm9k_resource[] = {
       [0] = {
              .start = MACH_SMDK2440_DM9K_BASE,
              .end   = MACH_SMDK2440_DM9K_BASE + 3,
              .flags = IORESOURCE_MEM
       },
       [1] = {
              .start = MACH_SMDK2440_DM9K_BASE + 4,
              .end   = MACH_SMDK2440_DM9K_BASE + 7,
              .flags = IORESOURCE_MEM
       },
       [2] = {
              .start = IRQ_EINT7,
              .end   = IRQ_EINT7,
              .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
       }
};
/*
 * The DM9000 has no eeprom, and it's MAC address is set by
 * the bootloader before starting the kernel.
 */
static struct dm9000_plat_data SMDK2440_dm9k_pdata = {
       .flags             = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};

static struct platform_device smdk2440_device_eth = {
       .name            = "dm9000",
       .id           = -1,
       .num_resources      = ARRAY_SIZE(smdk2440_dm9k_resource),
       .resource = smdk2440_dm9k_resource,
       .dev        = {
              .platform_data       = &SMDK2440_dm9k_pdata,
       },
};

3)在smdk2440_devices[]数组下添加:

static struct platform_device *smdk2440_devices[] __initdata = {
       &s3c_device_ohci,
       &s3c_device_lcd,
       &s3c_device_wdt,
       &s3c_device_i2c0,
       &s3c_device_iis,
       &smdk2440_device_eth,                     //添加该句
};

2.3 然后编译烧写

在uboot下输入:

nfs  30000000 192.168.2.106:/work/nfs_root/uImage       //下载刚刚编译好的uImage
set machid 16a
bootm 30000000

启动内核后,便可以ping通,如下图所示:

3.移植厂家提供的DM9000C驱动

3.1我们发现内核自带的DM9000驱动版本只有1.31

如下图所示(位于drivers/net/ethernet/davicom/dm9000.c):

而我们板子的网卡硬件比较新,已经是dm9000c了,所以我们去移植厂家提供的DM9000C驱动

在之前学习2.6内核的驱动时,我们便移植过了厂家提供的DM9000C驱动了,链接入口:http://www.cnblogs.com/lifexy/p/7777961.html

文件名为dm9dev9000c.c,由于2.6内核和3.4内核有很多不一样的地方,所以编译dm9dev9000c.c会出现很多错误,解决错误的具体办法如下:

  • 1)通过搜索,来阅读错误的变量的用途,然后参考dm9000.c来修改dm9dev9000c.c
  • 2)将只有定义而没用到的错误变量,删除掉

最终修改好的dm9dev9000c.c,链接入口:https://github.com/lifeyx/dm9000c

将修改好的dm9dev9000c.c也放在drivers/net/ethernet/davicom/目录下

并修改Makefile:

#obj-$(CONFIG_DM9000) += dm9000.o
obj-$(CONFIG_DM9000) += dm9dev9000c.o

3.2编译烧写

1)启动内核后,试验,如下图所示,可以ping通:

2)然后测试下使用nfs文件系统

在uboot设置bootargs参数:

set  bootargs root=/dev/nfs console=ttySAC0,115200 nfsroot=192.168.2.106:/work/nfs_root/fs_mini_mdev_new  ip=192.168.2.105:192.168.2.106:192.168.2.1:255.255.255.0::eth0:off   

然后启动nfs成功,如下图所示:

未完待续,下章再来移植其它驱动~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 轻松入门Golang pprof实用不忽悠

    网上已搜索golang pprof,资料不少,简明高效的一个没看到,这篇文章5步教你用会pprof获取cpu和内存prof。

    李海彬
  • [SpingBoot guides系列翻译]通过JDBC和Spring访问关系数据库

    build的时候用到了spring-boot-maven-plugin插件。他提供了很多便捷的特性。

    _淡定_
  • 小程序开发框架WePY和mpvue使用感受

    今天想和小伙伴聊聊小程序开发框架的问题。 种种原因,去年年末接触到了小程序,使用mpvue做了两个项目,也使用WePY做了一个项目,关于这两个框架的恩恩怨怨,我...

    江南一点雨
  • 简易项目搭建(用于一般杂七杂八的小功能点)3

    现在开始实现一个小的功能 需求: 1、每隔10秒访问数据库某张表,然后打印数据总个数 2、将应用打包成windows服务,其实就是做成一个外挂

    小狐狸
  • Homestead + laravel-mix 环境下 hmr 的两种玩法

    我在前几天刚写过的《让 F5 歇一会儿——laravel-mix 自动刷新之道》[1]中介绍了 laravel-mix 实现自动刷新的几种方法,其中就有涉及 h...

    overtrue
  • OpenCC中文简体和繁体互转

    下载地址:https://github.com/BYVoid/OpenCC.git

    Python疯子
  • 内核必须懂(七): Linux四级页表(x64)

    SeanDepp
  • 细说 Java 泛型及其应用

    当获取列表中的第二个元素时,会报错,java.lang.ClassCastException: java.lang.Integer cannot be cast...

    aoho求索
  • Linux编程--解决头文件`redefine of struct xxx`

    但是在检查后发现,并没有出现include多次头文件,也只有这一个定义ELF_FILE结构体的地方

    None_Ling
  • 搞懂这7个Maven问题,带你吊打面试官!

    在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见。Maven的仓库管理、依赖管理、继承和聚合等特性为项目的构建提供了一整套完善的解决方案...

    Java技术栈

扫码关注云+社区

领取腾讯云代金券