(五) 驱动注册
来源:互联网 发布:福州广电网络电视电话 编辑:程序博客网 时间:2024/06/07 09:28
1. platform_driver_registere函数
将驱动注册到平台需要用到结构体”platform_driver_register”,下面就该函数做一下简单介绍:
“platform_driver_register”和“platform_driver_unregister”用户注册和卸载驱动。在linux目录中,使用命令”vim include/linux/platform _device.h”,查找一下“platform_driver_register”,如下:
extern int platform_driver_register(struct platform_driver*);extern void platform_driver_unregister(struct platform_driver*);
这两个函数都调用“platform_driver“类型结构体。在linux目录中使用命令”vim include/linux/plartform_device.h”中:
struct platform_driver { int (*probe)(struct platform_device *); 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; const struct platform_device_id *id_table; };
通常大多数驱动都会用到这个结构体,所以非常重要。该结构体中包含了一组操作函数和一个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。
1.1 probe函数
paltform_driver结构体中的参数probe指向platform_driver_probe函数:
extern int platform_driver_probe(struct platform_driver *driver,int(*probe)(struct platform_device *));
platform_driver_probe参数在前面注册的HELL_CTL结构体中。
1.2 程序清单
#include <linux/init.h>#include <linux/module.h>/*驱动注册的头文件,包含驱动的结构体和注册和卸载的函数*/#include <linux/platform_device.h>#define DRIVER_NAME "hello_ctl"MODULE_LICENSE("Dual BSD/GPL");MODULE_AUTHOR("flywang606");static int hello_probe(struct platform_device *pdv){ printk(KERN_EMERG "\tinitialized\n"); return 0;}static int hello_remove(struct platform_device *pdv){ return 0;}static void hello_shutdown(struct platform_device *pdv){ ;}static int hello_suspend(struct platform_device *pdv){ return 0;}static int hello_resume(struct platform_device *pdv){ return 0;}struct platform_driver hello_driver = { .probe = hello_probe, .remove = hello_remove, .shutdown = hello_shutdown, .suspend = hello_suspend, .resume = hello_resume, .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, }};static int hello_init(void){ int DriverState; printk(KERN_EMERG "hello world init!\n"); DriverState = platform_driver_register(&hello_driver); printk(KERN_EMERG "\tDriverState is %d\n",DriverState); return 0;}static void hello_exit(void){ printk(KERN_EMERG "hello world exit!\n"); platform_driver_unregister(&hello_driver); }module_init(hello_init);module_exit(hello_exit);
- (五) 驱动注册
- 驱动注册,设备注册
- linux IDE驱动分析之IDE总线、驱动注册(五)
- 《Linux驱动》驱动注册
- 设备注册与驱动注册
- S3C6410 按键驱动(五) --- 驱动源代码(我采用自动分配设备号的方法,注册设备)
- 注册图形驱动函数
- 驱动注册的流程
- 驱动注册的顺序
- 驱动注册类型
- 驱动注册platform_driver
- 设备驱动注册过程
- linux 驱动注册
- SPI驱动注册
- I2C驱动注册过程
- 注册JDBC驱动
- I2C设备驱动注册
- IIC 驱动的注册
- 初学者读论文
- c++写杨辉三角
- android 安装 SDK的时候报错!!! 他说拒绝访问https://dl-ssl.google.com??
- iScroll中那些需要理解的细节部分
- MemoryHook 内存统计
- (五) 驱动注册
- web
- [Extjs6]浅谈对admin-dashboard模板左侧菜单树的修改
- 动态规划算法
- 圆形头像
- CentOS7安装jdk7
- python学习之 理解编码的encode,decode
- 程序员必须要学会Google搜索技巧
- 算法-分割有序数组后查值-二分查找的变形