字符设备驱动有关(一)
2016-11-26 14:14
302 查看
一直在看,但是很是晦涩难懂啊。从网上查了很多。现在写下帮自己理清思路。
一、先理解一些关系
1、如果应用程序想控制硬件,是要通过库函数、内核、和驱动才能达到目的。
|---------------------------------------|
应用------------|库函数---------内核---------------驱动|-------------硬件
|---------------------------------------|
2、应用程序怎么来控制硬件呢?
是通过控制设备文件,设备文件就是将硬件等效为文件,从而将对硬件的操作当做对文件的操作,用open,fopen等
应用---------------------------------------设备文件
怎么创建设备文件呢?以便于应用来访问。(这里虽然创建了,但这个设备文件还没有和硬件关联起来,还需要驱动来实现,这步一般放到最后做)
方法就是:
a、手动创建:mknod命令,也可以写脚本。
b、动态创建:在驱动编程时创建
首先创建一个类:class_create()
然后根据这个类创建节点:device_create()
3、那驱动作用是将设备文件和硬件关联起来。
|----------------------------------------| <------------>
| 内核------------驱动 --------------硬件| <------------> 设备文件
|----------------------------------------| <------------>
关联的方法:
a、分配设备号:
*自动:int alloc_chrdev_region()
*手动:register_chrdev_region()
b、将字符设备注册到内核中:
*动态内存初始化:cdev_alloc(),cdev.ops = &fops;cdev.owner =THIS_MODULE
*静态初始化cdev:cdev_init() , cdev.owner = THIS_MODULE
然后添加到内核中:cdev_add()
-------------------------------------------------------------------------------------------------
以上框架就做好了。当然功能open,read等还没实现。
而且更重要的是理论知道了,但是程序该怎么写啊。
先说上述的该怎么转换成程序
二、将上述所说转化为程序
1、驱动程序加载
int __init testchar_init(void)(参考helloworld模块)
{
a、[b]alloc_chrdev_region() //动态分配主次设备号
[/b]
b、cdev_alloc() //cdev分配空间
c、cdev_init() //cdev初始化
d、cdev.owner = THIS_MODULE
e、cdev_add() //添加到内核
f、class_create() //动态设备文件的创建
g、device_create()
}
module_init(testchar_init);
2、驱动程序卸载
void __exit testchar _cleanup(void)
{
a、unregister_chrdev_region();//取消设备号
b、class_device_destroy(); //取消动态设备文件的创建
c、class_destroy();
d、cdev_del(); //从内核中取消注册
}
module_exit(testchar_cleanup);
------------------------------------------------------------------------------------------
以上程序就是主要的模块添加与卸载的程序,和helloword模块是一样的,不过还程序还不完善,下面来完善open,read等功能
三、一些数据结构
主要这三种:file_operations数据结构,file数据结构 和 inode数据结构.
1、file_operations数据结构:(其实内容还有很多,但基本只用到了下面几个)
structfile_operations test_fops =
{
一、先理解一些关系
1、如果应用程序想控制硬件,是要通过库函数、内核、和驱动才能达到目的。
|---------------------------------------|
应用------------|库函数---------内核---------------驱动|-------------硬件
|---------------------------------------|
2、应用程序怎么来控制硬件呢?
是通过控制设备文件,设备文件就是将硬件等效为文件,从而将对硬件的操作当做对文件的操作,用open,fopen等
应用---------------------------------------设备文件
怎么创建设备文件呢?以便于应用来访问。(这里虽然创建了,但这个设备文件还没有和硬件关联起来,还需要驱动来实现,这步一般放到最后做)
方法就是:
a、手动创建:mknod命令,也可以写脚本。
b、动态创建:在驱动编程时创建
首先创建一个类:class_create()
然后根据这个类创建节点:device_create()
3、那驱动作用是将设备文件和硬件关联起来。
|----------------------------------------| <------------>
| 内核------------驱动 --------------硬件| <------------> 设备文件
|----------------------------------------| <------------>
关联的方法:
a、分配设备号:
*自动:int alloc_chrdev_region()
*手动:register_chrdev_region()
b、将字符设备注册到内核中:
*动态内存初始化:cdev_alloc(),cdev.ops = &fops;cdev.owner =THIS_MODULE
*静态初始化cdev:cdev_init() , cdev.owner = THIS_MODULE
然后添加到内核中:cdev_add()
-------------------------------------------------------------------------------------------------
以上框架就做好了。当然功能open,read等还没实现。
而且更重要的是理论知道了,但是程序该怎么写啊。
先说上述的该怎么转换成程序
二、将上述所说转化为程序
1、驱动程序加载
int __init testchar_init(void)(参考helloworld模块)
{
a、[b]alloc_chrdev_region() //动态分配主次设备号
[/b]
b、cdev_alloc() //cdev分配空间
c、cdev_init() //cdev初始化
d、cdev.owner = THIS_MODULE
e、cdev_add() //添加到内核
f、class_create() //动态设备文件的创建
g、device_create()
}
module_init(testchar_init);
2、驱动程序卸载
void __exit testchar _cleanup(void)
{
a、unregister_chrdev_region();//取消设备号
b、class_device_destroy(); //取消动态设备文件的创建
c、class_destroy();
d、cdev_del(); //从内核中取消注册
}
module_exit(testchar_cleanup);
------------------------------------------------------------------------------------------
以上程序就是主要的模块添加与卸载的程序,和helloword模块是一样的,不过还程序还不完善,下面来完善open,read等功能
三、一些数据结构
主要这三种:file_operations数据结构,file数据结构 和 inode数据结构.
1、file_operations数据结构:(其实内容还有很多,但基本只用到了下面几个)
structfile_operations test_fops =
{
相关文章推荐
- 字符设备驱动有关(二)
- 字符设备驱动有关(三)
- 【每日记录】Linux字符设备驱动
- 11-S3C2440驱动学习(七)嵌入式linux-字符设备的另一种写法及RTC驱动程序分析和字符设备驱动框架总结
- Linux字符设备驱动之register_chrdev_region()系列
- 字符设备驱动 架构分析
- 字符设备驱动4: ioremap
- 字符设备驱动
- 第一个字符设备驱动
- android内核字符驱动设备实战之----------内置C语言测试程序篇
- 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系
- 第三章:字符设备驱动
- Tiny6410 LED字符设备驱动
- linux驱动开发--字符设备:信号量
- 字符设备驱动之Buttons-异步通知(fasync)
- Linux 字符设备驱动开发基础(五)—— ioremap() 函数解析
- 高级字符设备驱动01
- linux设备驱动--globalmem字符设备框架分析
- 字符设备驱动之笔记-Platform设备驱动机制(1)
- 初入android驱动开发之字符设备(一)