linux混杂设备驱动程序编写的不同

在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的驱动也可以按照混杂设备的驱动进行编写。

你可能感兴趣的:(linux驱动)