linux字符设备驱动

驱动编写要点

  1. 定义和匹配fpos函数
  • ope - release - write - read - ioctrl - seek
  1. 创建cdev结构体
  2. 注册设备
  • 手动注册--已知主次设备号
  • 自动注册--动态分配吗设备号
  1. 字符设备初始化,绑定fops和设备
  2. 添加字符设备
  3. 创建节点--几种方式
  • 手动添加--mknod,需要已知设备号
  • mdev基于类添加位于dev/下的节点
  • kobject创建位于/sys/下的节点
  • 通过proc_create创建/proc/下节点
  1. 加载函数--作为module初始化
  2. 卸载函数--对上方使用的资源一一释放
  3. 设备树可以通过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写内核文件节点的一些问题(侵删)

open函数调用过程

图片原文
图

posted @ 2021-12-23 15:23  月的光景  阅读(88)  评论(0编辑  收藏  举报