没有合适的资源?快使用搜索试试~ 我知道了~
jz2440学习笔记-设备驱动
5星 · 超过95%的资源 需积分: 9 19 下载量 40 浏览量
2013-11-12
21:50:48
上传
评论
收藏 1.84MB DOCX 举报
温馨提示
试读
58页
jz2440学习笔记-设备驱动,是我自己学习s3c2440 linux设备驱动做的记录
资源推荐
资源详情
资源评论
本文中红色高亮标记表示此时新增内容,当前重点关注
字符设备驱动
这一部分的源码用 对比工具对比即可找到每一部分新增内容
字符设备驱动程序之 LED 驱动程序
、定义一个结构:
、告诉内核这个结构:
、谁来调用:驱动的入口函数
、卸载
代码:,参考程序为:
编译生成
用 加载到开发板上。
编 译 ! 中 的 " 方 法 : 修改 # : $%&'()&*+,+"-!-
,+-../ 编译命令:0&12*1&34413#5)6%*--
出现错误: 7++-.7'8
对于 6.9.:.; 的内核,这三个头文件存放的路径是
<=+!.>
<=++-.>
<=+,.>
但是,对于 6.9.". 的内核,它的存放路径在
<=+!.>
<=+-.>
<=+,.>
因此,需要这样修改一下。。
这几份文件到底真正的存放在哪里的,这里以我的 6.9.". 的内核为例,他是实
际存放在
6.9.".+++-"+++,. 中
所以修改后的头文件为:
<=+.>
<=+.>
<=+ .>
<=+.>
<=+8.>
<=+.>
<=+.>
<=+!.>
<=+.>
<=+-.>
<=+,.>
另外修改 为 和
为 8
();
8();
在 .9./ 中变为:
()
8()
编译成功后,使用方法:
++ 列出内核目前支持的设备,第一个列示主设备号
.加载驱动到内核, 执行后就可以看见设备驱动已加载,或者
++ :
测试程序:---.
开发板上执行即可
此时访问失败
手动创建设备文件主设备号要和++ 中的一致,否则创建了设备,应用程序
也无法打开
++8?:" 执行测试程序,即可看见效果 ++8?
文件中没有指定编译工具,应该用的就是指定内核中的编译工具编译。
这个过程开发板与 机上没有区别, 上看 用 @
查看加载的模块
移除模块
++8?删除设备文件
自动创建设备文件
上是 机制 8 中是 机制
会根据系统信息+8(+8++),会自动创建设备节点,所以只要
给 提供需要的信息,就可以自动创建设备文件了。
提供的信息有:
A 一个类
A 一个类下面建立一个设备
然后提供给 ,下面这两个函数就可以给内核提供系统信息
++先创建一个类,会在+8++下创建类目录
*B2)4#3(C6%DEE
++类下面创建一个设备
* D 'C66D #$(%FGD "D 'C66D
E8?E+A++8?A+
++这两条语句后,就会在系统中添加设备信息,设备文件,应用程序即可访问
驱动卸载的时候可以要删除设备节点
8
8
+8+ 这 个 下 面 有 各 种 类 +8+++ , 类 下 面 有 各 种 设 备 : +8++
+8?->..+..++++8?
执行后,可以看见 ++8? 效果,然后将 #3(C6%6)1%'4%EH56E删除试试
效果
成功,++8? 设备 , 上测试 ,! 上其他都正常,但是没有自动创
建 +8? 文件,解决方法如下:
查看 8 里面的 +.文件,于是在 ++.+4 里面增加如下命令(红
色字体),:
<I++
"J.9;..
-
-+
-8 8 +8
++>++8++
-
变化过程
手动创建设备节点
register_chrdev 后,变化有 、++ 、
、+8++
后,变化有 、++8?
自动创建设备节点
class_create / device_create 后,变化有 、+8++
、+8+++ 、++8?
*A":9"""":"D9
将物理地址映射为虚拟地址
Q & A
编 译 内 核 驱 动 时 经 常 会 出 现 这 样 的 错 误 :
KK或者是 K8K
只 要 把 KK 改 成 KK , K8K 改
成K8K一般就可以正确通过编译了。这主要是由内核版本决定的,那么我们怎
样看一个内核到底是支持KK还是KK,每次都这样尝试可能有
点麻烦。
我们可以通过查看 -.9.".+++路径下的 . 文件来看到底是支持
哪个的。
如 果 内 核 声 明 的 是 KK , 那 么 编 写 内 核 的 时 候 就 改
成KK就可以了。
之前写的字符类设备驱动,没有自动创建设备节点,因为只使用了 ()
函数,只是注册了这个设备。然后在系统启动后,就要自己创建设备节点 ,这样虽
然是可行的,但是比较麻烦。于是想在 函数里面,自动创建设备节点。
创建设备节点使用了两个函数 和 ,当然在()
函数里,要使用 8和 8注销创建的设备节点!
问 题 来 了 , 编 译 了 之 后 , 发 现 报 错 7
KK等几个错误。经过分析,应该是 6 内核版本不同的原因!早期的版
本,使用的是上面说的两个函数,但是在 .9.J 以后(我用的是 .9. 的),使用的函数
则变成了 和 ,并且要在声明中加入<=+.>,
因为定义这些函数是在 6.9.+++. 里面!
经过这些修改后,驱动编译成功,就能够自动创建设备节点了!
1. device_create()
文件包含7<=+.>
函数定义:
函数位置: +++.
函 数 格 式 : . A AD
ADDADA D...
函数功能:
函数 用于动态的建立逻辑设备,并对新的逻辑设备类进行相应初始
化,将其与函数的第一个参数所代表的逻辑类关联起来,然后将此逻辑设备加到 内核
系统的设备驱动程序模型中。函数能够自动在+8++ 目录下创建新的逻辑设备
目录,在+ 目录下创建于逻辑类对应的设备文件
参数说明:
:与即将创建额逻辑设备相关的逻辑类,在“ 类 使用”说
明了。
7设备号
A7 类型的指针,代表回调函数的输入参数
A 7逻辑设备的设备名D即在目录 +8++ 创建的逻辑设备目录
的目录名。
2.函数 device_destroy()
文件包含:<=+.>
函数定义: +++.
8AD
函数功能:
函数 8用于从 内核系统设备驱动程序模型中移除一个设备,并
删除+8++ 目录下对应的设备目录及++目录下对应的设备文件
class_create() 和 device_create()有什么关系呢??
在刚开始写 6 设备驱动程序的时候,很多时候都是利用 命令手动创建设备
节点,实际上 6 内核为我们提供了一组函数,可以用来在模块加载的时候自动在+
目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了
。什么事 ??
内核中定义了 结构体,顾名思义,一个 结构体类型变量对应一
个类,内核同时提供了 L函数,可以用它来创建一个类,这个类存放于 8
下面,一旦创建好了这个类,再调用 L函数来在+ 目录下创建相应的设备
节点。这样,加载模块的时候,用户空间中的 会自动响应 L函数,去+
8 下寻找对应的类从而创建设备节点。
在下面的例子中具体说明关系!!!!!!!!
.首先通过 *B2)4#3(C6%DE8,E语句建立了逻辑
设备类,在 +8++下新建了 8, 目录
. 通 过 语 句
D'C66D#$(%F#%##0M3&D#%##)'3&D'C66DE8,E
阿在 ++下自动建立了 8,设备节点
.那么 和 还有什么关系呢??
在+8+++建立了 “8,N
在+8+++8,+++下建立了 8,目录
字符设备驱动程序之查询方式的按键驱动程序
代码:
.+O在后台运行
这个加了个 函数
剩余57页未读,继续阅读
资源评论
- 太仓一粟2015-05-15还行,反正不要积分。大家都下载看看吧
zeroboundary
- 粉丝: 77
- 资源: 35
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功