接着设备注册之后,就是进行驱动注册,本节主要介绍驱动注册操作流程
1.驱动注册和卸载函数介绍
- 驱动注册函数:platform_driver_register函数
- 驱动卸载函数:platform_driver_unregister 函数
注册和卸载两个函数位于:include/linux/platform_device.h
extern int platform_driver_register(struct platform_driver *);
extern void platform_driver_unregister(struct platform_driver *);
函数中platform_driver
结构体为:
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;
};
- 结构体中字段的含义
- probe方法:主要是进行设备的探索和初始化
- remove:移除驱动,该函数一般用于去掉设备节点或释放软硬件资源
- shutdown、suspend、resume:这三个函数分别是关闭、休眠以及恢复驱动的时候该驱动要做什么
- 结构体struct device_driver :主要定义两个参数name(驱动名称)、owner一般是THIS_MODULE
2.驱动注册操作
- 在模块入口函数中调用驱动注册函数:
platform_driver_register(&led_driver)
- 定义一个struct platform_driver类型的结构体“led_driver”
- 为结构体”led_driver”赋值:
struct platform_driver led_driver ={
.probe = led_probe,
.remove = led_remove,
.shutdown = led_shutdown,
.suspend = led_suspend,
.resume = led_resume,
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
}
};
- 定义led_probe、led_remove、 led_shutdown、led_suspend、 led_resume函数:
/*设备初始化*/
static int led_probe(struct platform_device * pdv){
printk(KERN_EMERG "init device\t%s,%d\n",__FUNCTION__,__LINE__);
return 0;
}
/*移除驱动*/
static int led_remove(struct platform_device * pdv){
return 0;
}
/*关闭驱动*/
static void led_shutdown(struct platform_device * pdv){
}
/*休眠驱动*/
static int led_suspend(struct platform_device *pdv,pm_message_t state){
return 0;
}
/*恢复驱动*/
static int led_resume(struct platform_device * pdv){
return 0;
}
- 在模块出口函数调用驱动卸载函数:
platform_driver_unregister(&led_driver)
3. 加载测试
开发板通过nfs服务器挂在,在开发板上进行驱动模块注册卸载测试
参考
itop4412驱动实验手册