目录
一、应用程序调用驱动程序框架
(1) 应用程序的 打开、读、写等操作程序执行时,会经过C库,然后触发 svc异常,调用对应的驱动函数;APP读数据时,内核通过copy_to_user操作把数据发送给APP;APP写数据时,内核通过copy_from_user操作接收APP数据;
(2) 任何时候不能忘记linux驱动的作用:向上给应用程序提供接口(被调用),向下实现应用程序所需要的功能(可能会驱动相关硬件);驱动程序提供的接口函数,与应用程序调用的函数,一一对应(函数名类似,参数一致);
二、入口函数
1、需要用 module_init(xxx_init) 来声明为入口函数,并使用 “__init”来修饰。
2、使用 insmod 或者 modprobe(常用) 命令加载驱动的时候,入口函数(xxx_init)会被调用。
3、入口函数要做的主要事情:
(1)创建设备号
①固定分配:register_chrdev_region();
②自动分配:alloc_chrdev_region();
(2)初始化 cdev :cdev_init(); //核心:file_operations结构体
(3)添加一个cdev:cdev_add();
(4)创建类:class_create();
(5)用设备号和类创建设备:device_create();
三、出口函数
1、需要用 module_exit(xxx_exit) 来声明为出口函数,并使用 “__exit”来修饰。
2、使用 rmmod(常用) 或者 modprobe -r 命令卸载驱动的时候,出口函数(xxx_exit)会被调用。
3、出口函数要做的主要事情:
(1)删除cdev:cdev_del();
(2)反注册设备:unregister_chrdev_region();
(3)注销设备:device_destroy();
(4)注销类:class_destroy();
四、linux驱动主要两个作用
1、向内核注册,产生设备节点,让应用能看到,从而操作设备节点;
从内核驱动的角度看,产生设备节点,是通过向内核注册,注册又分为哪几步:
①创建设备号
②初始化cdev
③添加一个cdev
④创建类
⑤创建设备
2、提供实现功能的接口函数(file_operations结构体),让应用能调用,从而实现所需功能。
根据 file_operations 提供的接口,知道函数的作用,然后去操作相应的硬件。