本帖最后由 求学之路有你 于 2018-1-16 11:37 编辑
4 注册驱动 4.1 在Linux 源码目录下,使用命令“vim include/linux/platform_device.h”查看platform_driver_register 函数和platform_driver_unregister 函数,这两个函数用于注册和卸载驱动。 注册和卸载驱动的函数需要调用platform_driver 类型结构体,如图1.
该结构中包含了一组操作函数和一个struct device_driver 的对像。在驱动中首先要做的就是定义platform_driver 中的函数,并创建这个结构的一个对象实例, 然后在init()函数中调用platform_driver_register()向系统注册驱动。 函数int (*probe)(struct platform_device *);主要是进行设备的探测和初始化。例如想调用一个GPIO,那么首先需要探测这个GPIO 是否被占用了,如果被占用了那么初始化失败,驱动注册也就失败了;如果没有被占用,那么就申明要占用它。该函数中一般还会添加生成设备节点的函数,如果初始化成功,那么就会需要添加设备节点。设备节点的知识在下一节介绍。 函数int (*remove)(struct platform_device *);移除驱动,该函数中一般用于去掉设备节点或者释放软硬件资源。 接着的三个函数: void (*shutdown)(struct platform_device *);关闭驱动 int (*suspend)(struct platform_device *, pm_message_t state);悬挂(休眠)驱动 int (*resume)(struct platform_device *);恢复驱动。 接着的结构体struct device_driver driver;主要包含两个参数,一个是name 参数,驱动名称(需要和设备驱动结构体中的name 参数一样);一个是owner,一般是THIS_MODULE。 4.2 带驱动注册的驱动源码 1)如下图所示,首先需要添加头文件“#include ”,然后定义一个宏变量DRIVER_NAME,定义为“hello_ctl”,需要和前面注册的hello 设备的名称相同。如图2
2)然后在模块入口和出口调用函数platform_driver_register 和platform_driver_unregister,如下图所示,先将参数名定义为“&hello_driver”。另外注册驱动的时候,会返回数值,将其打印出来判断是否注册成功。如图3
3)如下图所示,定义结构体“hello_driver”。driver 中的name 参数就是驱动名称,这里将前面定义的宏变量DRIVER_NAME 赋给它;另外一个参数owner 一般默认为THIS_MODULE。如图4
4)然后定义函数hello_probe、hello_remove、hello_shutdown、hello_suspend、hello_resume。如图5
关注:“小拇指的脑瓜子” 公众号:xmzdngz
如果您还未关注,请微信扫下面二维码关注我吧!
据说聪明的人只需3秒就能记住这个公众号了: ”小拇指的脑瓜子”
|