字符设备驱动开发框架

字符设备开发具有一定的框架
在这里插入图片描述
1、模块驱动的加载与卸载
使用的函数:
module_init(xxx_init);//加载xxx_init函数,在串口终端输入modprobe命令时便会调用该函数,此函数为入口函数。
static int __init xxx_init(void)
module_exit(xxx_exit);//卸载调用xxx_exit函数,在串口终端输入rmmod命令时,xxx_exit函数会被调用。此函数为出口函数
static void __exit xxx_exit(void)
2、在入口和出口函数里注册和注销设备
在加载的xxx_init函数里会调用注册函数:
static inline int register_chrdev(unsigned int major, const char *name,
const struct file_operations *fops)
{
return __register_chrdev(major, 0, 256, name, fops);
}
其中形参:major为主设备号;name为驱动名;fops为file_operations结构体指针(后面会说)
该函数返回值为0的时候表示注册成功;返回EINVAL的时候表示主设备号非法(一般是主设备号超限了);返回EBUSY表示主设备号正被别的驱动设备使用;注册成功的话在串口终端可通过“cat /proc/devices”发现已经申请的设备号
同理在卸载函数xxx_exit里会调用注销函数:
static inline void unregister_chrdev(unsigned int major, const char *name)
{
__unregister_chrdev(major, 0, 256, name);
}
形参为major主设备号;name为驱动名
3、操作集合 file_operations结构体
这就说到了前面注册设备函数里的形参了,它是一个结构体如下图:
在这里插入图片描述
它里面包含了很多操作函数,比如我们一般常用的open、read、write、release(close)等函数。在编写设备驱动的时候,都会先定义一下该结构体,把要用到的函数包含进去。如下图:
在这里插入图片描述
要注意的是结构体中的结束符用逗号,不是分号。
然后依次具体实现每一个函数的功能。
加载函数(xxx_init)便会通过注册函数(register_chrdev)调用结构体里的函数进行具体的操作。
4、应用程序编写
在应用程序中要对应驱动程序里的操作集合里的函数进行编写。
5、头文件添加
有些函数可以在Ubuntu终端输入man命令来查看相关信息
man 分1、2、3……分别为commands(普通命令)、system calls(系统调用)、library calls(库函数)…比如open函数属于系统调用,查看它的相关用法则为:man 2 ope,当然,当不知道属于哪个的时候直接man 要查询的即可。比如man open; 使用q退出
在这里插入图片描述
可以看出需要加以上三个头文件。

根据学习后面在添加更新。
该博客只用于学习记录。
有错误恳请指出,感激不尽