linux字符设备驱动
驱动编写要点
- 定义和匹配fpos函数
- ope - release - write - read - ioctrl - seek
- 创建cdev结构体
- 注册设备
- 手动注册--已知主次设备号
- 自动注册--动态分配吗设备号
- 字符设备初始化,绑定fops和设备
- 添加字符设备
- 创建节点--几种方式
- 手动添加--mknod,需要已知设备号
- mdev基于类添加位于dev/下的节点
- kobject创建位于/sys/下的节点
- 通过proc_create创建/proc/下节点
- 加载函数--作为module初始化
- 卸载函数--对上方使用的资源一一释放
- 设备树可以通过node系列函数匹配
驱动写好后,发现echo/cat命令没法写入读取,而且板子会卡。原因:
驱动中write函数返回值是一个正数n时,表示写入了n个;返回0时表示没写;返回负数表示出错。
驱动中read函数返回值是一个正数n时,表示读取了n个;返回0时表示读到结尾;返回负数表示出错。
上层的write和read函数返回值的意义同上,所以在驱动中编写好返回值和偏移量即可。
上层的echo、cat函数返回值意义同上,可是cat在调用驱动中的read函数得到的返回值如果为0,却不做回显而是直接返回了。
可以修改返回值or使用simple_write_to/from_buffer。
使用cat读取和echo写内核文件节点的一些问题(侵删)