上章-使内核支持烧写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 = -, //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[] = {
[] = {
.start = MACH_SMDK2440_DM9K_BASE,
.end = MACH_SMDK2440_DM9K_BASE + ,
.flags = IORESOURCE_MEM
},
[] = {
.start = MACH_SMDK2440_DM9K_BASE + ,
.end = MACH_SMDK2440_DM9K_BASE + ,
.flags = IORESOURCE_MEM
},
[] = {
.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 = -,
.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   192.168.2.106:/work/nfs_root/uImage       //下载刚刚编译好的uImage
set machid 16a
bootm

启动内核后,便可以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, 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成功,如下图所示:

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

3.移植驱动到3.4内核-移植DM9000C驱动的更多相关文章

  1. 基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植

    一.移植环境:        1.主机:Ubuntu 10.10发行版        2.目标机:FS_S5PC100平台        3.交叉编译工具:arm-cortex_a8-linux-gn ...

  2. 【转】 linux内核移植和网卡驱动(二)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708911.html 一,内核移植步骤: 1, 修改顶层目录下的Makefile ARCH       ...

  3. 【转】 linux内核移植和驱动添加(三)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708909.html 原文地址:linux内核移植和驱动添加(三) 作者:genehang 四,LED ...

  4. 从串口驱动的移植看linux2.6内核中的驱动模型 platform device & platform driver【转】

    转自:http://blog.csdn.net/bonnshore/article/details/7979705 写在前面的话: 博主新开了个人站点:你也可以在这里看到这篇文章,点击打开链接 本文是 ...

  5. Linux内核移植

    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核 下面以Linux2.6.30.4内核移植到gec2440为例: 一.准备工作:建立工作目录,下载内核 ...

  6. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  7. linux 内核移植和根文件系统的制作

    1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1  Linux版本 Linux内核的版本号 ...

  8. linux内核(二)内核移植(DM365-DM368开发攻略——linux-2.6.32的移植)

    一.介绍linux-2.6.32: Linux-2.6.32的网上介绍:增添了虚拟化内存 de-duplicacion.重写了 writeback 代码.改进了 Btrfs 文件系统.添加了 ATI ...

  9. linux 3.4.103 内核移植到 S3C6410 开发板 移植失败 (问题总结,日本再战!)

    linux 3.4.103 内核移植到 S3C6410 开发板 这个星期差点儿就搭在这里面了,一開始感觉非常不值得,移植这样的浪费时间的事情.想立刻搞定,然后安安静静看书 & coding. ...

随机推荐

  1. JAVA基础-IO流(二)

    一.字节流 字节流是通过字节来进行读写操作的,他的使用对象相比于字符流来说更加的广泛.这主要是因为他们读写文件的方式而决定的.字符流读写文件时是将读取到的字节通过默认编码表转换成字符,在通过默认编码表 ...

  2. H5+Ajax+WebApi实现文件下载(进度条,多文件)

    前言 踩过的坑 1.WebAPI跨域 2.Jquery ajax低版本不支持XHR 2功能 3.Jquery ajax不支持Deferred的process事件 4.IE下文件名乱码问题 功能实现 & ...

  3. Java Web应用集成OSGI

    对OSGI的简单理解 就像Java Web应用程序需要运行在Tomcat.Weblogic这样的容器中一样.程序员开发的OSGI程序包也需要运行在OSGI容器中.目前主流的OSGI容器包括:Apach ...

  4. CVE-2017-8635复现

    在最近几个月里,我花了一些时间深入了Device Guard以及如何实现用户模式代码完整性(UMCI).如果您对Device Guard不熟悉,您可以 在这里阅读更多信息.通常情况下,UMCI可防止未 ...

  5. Cnm%(个人模版)

    Cnm%: #include<stdio.h> #include<string.h> #include<vector> using namespace std; # ...

  6. [51nod][cf468D]1558 树中的配对

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1558 不是很懂dalao们用线段树是怎么写的…… 反正找出重心以后每个子 ...

  7. BZOJ 1088: [SCOI2005]扫雷Mine【思维题,神奇的模拟+枚举】

    1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3791  Solved: 2234[Submit][St ...

  8. '<<' '|' '>>' 等位运算符 课本祥解

    a<<1   相当于a*2     a>>1    相当于a/2   a<<|1   相当于a*2+1 一些算法用得到.

  9. Android 社区App 《窝吧》开源分享

    一整个社区模式App的整套代码,包括发布动态,添加.删除好友,添加黑名单,聊天,用户反馈等功能. 相关技术 1 底层使用Bmob后端云,官网: https://www.bmob.cn/ 2 友盟插件, ...

  10. 用PHP,怎么获取PHP.ini中的文件上传最大的字节数。也就是默认的2M

    PHP中用ini_get函数来获取服务器允许的文件上传最大字节数,如: