在PWM,ADC,LED,DS18B20,BEEP等驱动中我们发现设备注册,卸载使用了,misc_register,misc_deregister。
结构体
struct miscdevice {
int minor; //次设备号
const char *name; //设备名称
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const char *nodename;
mode_t mode;
};
混杂设备是字符设备的子集,所有的混杂设备都有一个共同的主设备号,每个混杂设备有不同的次设备号,在驱动程序初始化函数中使用函数misc_register注册设备。在驱动程序卸载函数中使用misc_deregister函数注销设备。最后就是完成file_operations中的函数功能实现,这样一个混杂设备的驱动就完成了。
而我们看watchdog和RTC等驱动的时候,注册,卸载使用函数不同,在驱动程序初始化函数中使用函数 platform_driver_register注册设备。在驱动程序卸载函数中使用platform_driver_unregister函数注销设备
注册的是struct 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; //同一类型设备,不同ID
};
最后就是完成platform_driver中的函数功能实现,这些函数传入了结构体struct platform_device
各个函数的作用:
probe()函数是在内核建立
是在驱动程序中带__init宏初始化函数执行完之后执行,一般内核启动的时候就会调用初始化函数,将会注册平台设备和平台设备驱动程序,平台设备和设备驱动程序在适当的时候建立连接,连接成功就会调用probe函数。
remove()函数,与probe()函数对应,在probe函数申请的资源,应该在remove函数中释放。
suspend()函数,使设备处于低功耗状态
resume()函数,使设备处于恢复到正常状态
shutdown()函数,使设备处于关机状态。
struct platform_device {
const char * name; //平台设备名称
int id; //一般设为-1
struct device dev;
u32 num_resources; //资源数量
struct resource * resource; //资源指针
const struct platform_device_id *id_entry;
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata;
};
RTC的驱动也可以按照混杂设备的驱动进行编写。