(一)linux 字符设备驱动的编写

    在编写驱动的过程中主要参考《老罗android之旅博客》 以及《深入linux设备驱动内核机制》,编写一个字符设备驱动,主要编写3个文件:

1)Makefile 主要用于编译驱动模块的

2)Kconfig Kconfig 主要是加入linux kernel 的图形编译系统,可以将驱动模块独立编译,或者是编进内核中。

3)驱动程序(chr_dev.c)


chr_dev 字符设备的主要目的是:能够实现数组中的前面个数之间的加减乘运算,并将结果保存在数组的最后一个元素中。


文件结构如下:

'


Makefile:



Kconfig:


makefile 中的CONFIG_CHR_DEV 是根据CHR_DEV 的值来确定的,系统会自动在CHR_DEV前面添加CONFIG_ 前缀,以便makefile使用。


具体源代码:


chr_open 主要作用是,将自定义设备结构提的数据挂到文件指针去,以便其他操作能够访问设备中的数据,其中的container_of 函数主要通过nd->i_cdev 获取demo_cdev 结构的地址。


chr_read 函数中的 char __user*u, 是用户空间的数据,__user 表示 char* u 所指向的数据是用户空间的数据,内核中如果需要访问用户层的数据必须通过copy_to_user,将用户空间的数据拷贝到内核空间,因为驱动其实是工作在内核空间的,用户空间需要访问内核空间的数据,也是需要将内核空间的数据拷贝到用户空间的。


chr_write 与 chr_read 类似,仅仅是方向不一致而已,这里的down_interruptible() 主要是为了防止多个进程,同时访问数组数据。使用信号量的方法来控制数据的原子访问,并且进程无法获取到操作权限的时候,进入睡眠状态,是可以被像信号之类的东西唤醒的。


ioctl 函数主要是可以接受不同的command, 来实现不同的功能,这样我们就可以完成类似加、减、乘的需求,这里的cmd,命令其实是有一定的规则的,这里仅仅是直接定义为0,、1、2,规范的使用方法,不是这样做的,后期需要注意。

file_operations 是字符设备中一个非常重要的结构体,这里我们仅仅实现了open,read,write, unlocked_ioctl 接口,不同的内核版本,可能接口名称又不一样,只要养成查看源代码的习惯,那种版本都是一样的。




demo_init 是chr_dev 字符设备驱动的初始化函数,主要作用是分配驱动需要的数据结构空间,分配设备号,创建设备,以及类,这里需要明白设备驱动模型的知识,创建设备device_create,会在/dev/目录下创建chr_dev 字符设备,这样,我们就可以通过open函数找到字符设备文件了,最后就能够通过fd来操控我们编写的驱动。


后面的module_init, 以及module_exit 是标准的模块初始化,退出操作,主要的作用是将对应的驱动程序加载到对应的数据段,以便内核能够独立加载,卸载。



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值