linux 驱动程序开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 什么是驱动
a)裸板驱动
b)有系统驱动linux 将驱动封装了一套框架(每个驱动)
c)大量和硬件无关的代码已写好只需要编程实现和硬件相关的代码
d)难点:框架的理解代码的理解
e)需要三方面的知识:
i.硬件相关的知识
1.电路原理图
2.芯片的数据手册
3.总线协议rs232 i2c等
ii.内核的知识
1.内核驱动属于内核的一部分,它运行在内核态需要对内核知识有了解
2.内存管理
3.解决竞争状态(如上锁)
4.。。。
iii.驱动框架的知识
1.内核中已经实现了大量硬件驱动完成了驱动的框架编程只需要根据硬
件进行添加
2 搭建linux驱动开发工具
a)安装交叉编译环境
i.arm-linux-gcc uboot PATH
b)移植uboot
c)移植内核
d)制作根文件系统然后通过nfs方式让开发板可以加载
3 内核驱动开发的基本知识
a)如何学驱动编程?
i.最好的老师就是内核源码(没有man 功能)
1.要是用某个函数就去查看某个函数的定义注释
2.查看内核中其他模块儿时如何使用该函数的
3.专业书籍:
a)内核开发:linux内核的设计与实现机械工程出版社
b)驱动开发:圣经级别的-LDD3:LINUX DEVICE
c)操作性别叫强的:精通linux设备驱动程序开发
关于linux内核:
1)linux内核中所使用的函数都是自身实现的它肯定不会调用c库中的函数
2)linux中代码绝大多数代码时gun c语言完成的不是标准c语言可以理解为标c的扩展版和少部分汇编
需要注意的问题:
1)内核态不能做浮点数运算
2)用户空间的每个进程都有独立的0-3G的虚拟空间
多个进程共享同一个内核
内核使用的地址空间为3G-4G
3)每个线程有独立的栈空间
4 写一个最简单的内核模块儿(因为驱动时内核的一个模块套路都一样)
a)几个宏
i.__FUNCTION__:展开为所在函数的名称
ii.__LINE__:展开为printk所在的行号
iii.__DATE__:展开为编译程序的日期
b)通用头文件
i.#include
ii.#include
c)没有main函数
然后写一个makefile
其中:obj -m +=helloworld.o -m表示生成模块儿
make -C 内核路径编译对象路径modules(固定表示模块儿)
例子:make -C /home/changjian/dirver/kernel M=$(PWD) modules
报错:如taints kernel(污染内核)因为写的驱动没有声明license
因为linux为开源所以写的驱动也必须声明为开源可以在程序里加入:MODULE_LICENSE(“GPL”);声明为开源
模块儿驱动开发
1、模块儿参数
a)内核中安装模块时也可以传递参数
i.insmod xx.ko var=123
b)模块参数的使用方法
i.首先在模块中定义全局变量
ii.然后使用module_param 或者module_param_array来修饰该变量
这样一个普通的全局变量就变成可以安装模块时传递参数的模块参数
module_param(name,type,perm)
name:变量名称
type: name的类型(不包括数组)
perm:权限类型rwxr-x 等类型内核做了相关的宏定义形如efine S_IRWXG
表示r w x g(同组)
module_param_array(name,type,nump,perm)将某个数组声明为模块
参数
其中nump:数组元素个数指针
type:模块参数的数据类型
2、系统调用
3、字符设备驱动
驱动解析
1、Linux驱动主要包括字符设备驱动、块设备驱动、网络设备;
1)与驱动相关的配置文件主要有
a.Kconfig:所有可能被编译进内核的文件标志
b..config:制定了那些选项要被编译进内核
c.Makefile:根据.config的配置,按照一定规则将文件编译进内核
2)Kconfig、Makefile为树状多级包含,从树根到树叶都有。.config只在最顶层目录里边有。
2、添加自己编写的字符设备驱动步骤详解
(1)编写设备驱动,主要包括:设备号的注册(动、静两种方法)、file_operation结构
体实例化、成员函数的编写(open、close、release(释放设备号)、init(注册设备
号)等)
(2)编写Kconfig Makefile文件
(3)创建文件夹驱动,将驱动文件.c 放到该文件夹下;将该文件夹放在arch/arm/drive
文件夹下对用的文件夹内(其中字符设备在char里)
(4)修改上一级Kconfig Makefile 文件,讲新添加的Kconfig 和Makefile 添加到编译选
型里边