专栏首页Linux驱动4.移植驱动到3.4内核-移植总结

4.移植驱动到3.4内核-移植总结

1.常用函数改动

1)device_create()

作用: 创建设备节点

头文件: #include <linux/device.h>

替代了2.6内核里的class_device_create()函数

2)device_destroy()

作用:卸载设备节点

头文件:#include <linux/device.h>

替代了2.6内核里的class_device_destroy()函数

3)usb_alloc_coherent()

作用:申请usb缓冲区,并保持内存和硬件cache一致性

替代了2.6内核里的usb_buffer_alloc ()函数

4)usb_free_coherent()

作用:释放usb缓冲区

替代了2.6内核里的usb_buffer_free ()函数

5) blk_fetch_request()

作用:获取块设备里的一个申请(申请:主要用来读写块读设备的扇区)

替代了2.6内核里的elv_next_request()函数

6) bool __blk_end_request_cur(struct request *rq, int error)

作用:用来完成当前获取的request结构体(具体使用参考:do_z2_request()函数)

当返回值为0则表示已完成了当前申请(若为真,则需要继续处理当前申请,直到完成为止)

当error为0表示读写扇区成功,error<0表示失败

替代了2.6内核里的end_request()函数

2.结构体改动

1) struct net_device结构体

改动方向: 2.6内核下的net_device结构体成员(与操作相关的),都放在3.4内核的net_device->net_device_ops结构体下

比如2.6内核下的net_device结构体成员:

net_device->hard_start_xmit();     //发包函数
net_device->tx_timeout();         //发包超时处理函数

对应3.4内核下:

net_device->net_device_ops->ndo_start_xmit();   //发包函数
net_device->net_device_ops->ndo_tx_timeout();  //发包超时处理函数

3.宏改动

1)管脚宏改动

S3C2410_GPA(0)~ S3C2410_GPM(0)

头文件: #include <mach/regs-gpio.h>

替代了2.6内核里的S3C2410_GPA0~ S3C2410_GPM0

2)互斥信号量改动

static DEFINE_SEMAPHORE(name);  //定义name变量为互斥信号量

替代了2.6内核里的DECLARE_MUTEX(name)定义宏.

该宏定义如下图所示:

若想定义信号量初始值为0时,可以直接定义:

struct semaphore name    //定义一个name全局结构体变量
//... ...


sema_init(name,0)      //在init函数里初始化

而获取信号量down()函数和释放信号量up()函数保持不变

(2.6内核下的信号量使用请参考:http://www.cnblogs.com/lifexy/p/7515488.html)

4.以移植LED为例

4.1首先直接修改Makefile

将以前的内核位置改为KERN_DIR = /work/system/linux-3.4.2

4.2然后直接make,根据以下错误信息来修改

first_drv.c:7:32: error: asm/arch/regs-gpio.h: No such file or directory

first_drv.c:8:26: error: asm/hardware.h: No such file or directory

first_drv.c: In function 'first_drv_write':

first_drv.c:65: warning: ignoring return value of 'copy_from_user', declared with attribute warn_unused_result

first_drv.c: In function 'first_drv_init':

first_drv.c:152: error: implicit declaration of function 'class_create'

first_drv.c:152: warning: assignment makes pointer from integer without a cast

first_drv.c:155: error: implicit declaration of function 'class_device_create'

first_drv.c:155: warning: assignment makes pointer from integer without a cast

first_drv.c:160: warning: assignment makes pointer from integer without a cast

first_drv.c: In function 'first_drv_exit':

first_drv.c:170: error: implicit declaration of function 'class_destroy'

first_drv.c:172: error: implicit declaration of function 'class_device_unregister'

根据上面错误信息,来修改led文件first_drv.c

1)去掉第7~8行:

//#include <asm/arch/regs-gpio.h>
//#include <asm/hardware.h>

2)将class_device_create()函数改为device_create()

3)将class_device_unregister()函数改为device_create()

4)添加头文件

 #include <linux/device.h> 

5)然后再次编译测试程序,移植到板子上测试即可

5.移植LCD

1)编译驱动

2)去掉内核自带的lcd驱动

进入Device Drivers -> Graphics support -> Support for frame buffer devices

<M>   S3C2410 LCD framebuffer support         //设为模块化

<M>   Silicon Motion SM501 framebuffer support  //设为模块化

make uImage 编译内核

make modules 编译模块

然后将drivers/video下面的3个文件放入nfs文件系统里,如下图所示:

(LCD驱动里的成员fb_fillrect(), fb_copyarea(), fb_imageblit()需要用到)

3)装载试验

insmod cfbcopyarea.ko

insmod cfbfillrect.ko

insmod cfbimgblt.ko

insmod 9th_lcd.ko

使用echo和cat命令试验

5.1 安装tslib,试验

1)首先编译触摸屏驱动

2)然后安装tslib,参考: http://www.cnblogs.com/lifexy/p/7628780.html

测试时,打印"selected device is not a touchscreen I understand",指配置的触摸屏环境里的设备不正确

这是因为 3.4内核的input系统和tslib的input输入系统版本号不匹配.

3.4内核自带了版本号,为0x010001:

include/linux/input.h:37:#define EV_VERSION             0x010001

而tslib没有自带版本号,用的是编译器的版本号,所以进入/usr/local/arm/4.3.2/搜索,找到为0x10000:

arm-none-linux-gnueabi/libc/usr/include/linux/input.h:32:#define EV_VERSION       0x010000

所以接下来修改编译器的EV_VERSION,将:

#define EV_VERSION       0x010000

改为:

#define EV_VERSION       0x010001

然后进入tslib目录,然后make clean,再重新安装到板子上试验

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 3.修改第一个程序来点亮LED

    在上一节中已经将驱动程序框架搭建好了 接下来开始写硬件的操作(控制LED): (1)看原理图,确定引脚 (2)看2440手册 (3)写代码(需要使用iorema...

    张诺谦
  • 2.制作第一个驱动程序

    先讲解驱动框架,然后写出first_drv驱动程序,来打印一些信息 写出first_drv驱动程序需要以下几步: (1)写出驱动程序first_drv_open...

    张诺谦
  • 第2阶段——编写uboot之硬件初始化和制作链接脚本lds(1)

    目标: 第一阶段: 1.关看门狗 2.设置时钟 3.初始化SDRAM (初始化寄存器以及清除bss段) 4.重定位 (将nan...

    张诺谦
  • 挑战程序竞赛系列(13):2.6辗转相除法

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • 51Nod-1617-奇偶数组

    ACM模版 描述 ? ? 题解 这个题的题意有些繁琐,看了好久才看懂。 首先给定一个1~n 序列,要你进行一系列变换,直到没有变化后,然后对该序列进行区间查询。...

    f_zyj
  • 开发 | Facebook 开源增强版 LASER 库:可实现 93 种语言的零样本迁移

    为了加速 NLP 应用在更多语言上的部署,Facebook 对 LASER (Language-Agnostic SEntence Representation...

    AI科技评论
  • Facebook开源增强版LASER库,包含93种语言工具包

    为了将 NLP 应用尽快部署到更多语言,Facebook 的研究者拓展并改进了其 LASER(Language-Agnostic SEntence Repres...

    机器之心
  • web渗透测试--防sql注入

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露V...

    我被狗咬了
  • [剑指offer] 合并两个排序的链表

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

    尾尾部落
  • python代码实现图片噪声去除

    今天来给大家分享下怎么做图片的噪声去除。平时其实大家上网都能遇到这样的场景,就是输入讨厌验证码,怎么都输不对。验证码现在可以说是千奇百怪、分外妖娆,为啥要做成这...

    IT派

扫码关注云+社区

领取腾讯云代金券