免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1221 | 回复: 0
打印 上一主题 下一主题

[转]platform_device和platform_driver [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-22 11:00 |只看该作者 |倒序浏览
原文地址
http://blog.163.com/jk_new/blog/static/9954856220099130338200/
从linux-2.6开始引入了一套新的驱动管理和注册机制:platform_device和platform_driver.
linux中的大部分设备驱动,都可以使用该机制,设备用platform_device表示,驱动用platform_deriver进行注册。
platform是linux的一个虚拟的地址总线,主要是用来描述芯片的片内资源,它直接取片内地址进行资源读写。因此和内核相关性不大,象lcd,rtc,watchdog,uart等都是这类。
看看这个:
http://www.eetop.cn/blog/html/45/11145-676.html
platform_device结构体用来描述设备的名称、资源信息等,该结构被定义在include/linux/platform_device.h中
#include     //该头文件就是以前Linux-2.4驱动的头文件,利用driver_register()进行驱动注册
               
               
                struct platform_device {                  // 设备结构体信息
        const char      * name;                // 该平台设备的名称
        u32             id;               
        struct device   dev;
        u32             num_resources;
        struct resource * resource;   // 定义平台设备的资源
};
其中最重要的是struct resource *resource结构,该结构定义在include/linux/ioport.h中
struct resource {
        resource_size_t start;         // 定义资源的起始地址
        resource_size_t end;       // 定义资源的结束地址
        const char *name;          // 定义资源的名称
        unsigned long flags;                 // 定义资源的类型,例如MEM, IO ,IRQ, DMA类型
        struct resource *parent, *sibling, *child;     //资源链表指针
};
//////////////////设备在内核中也需要注册,通过调用函数platform_add_devices()向系统添加该设备,在该函数内部会调用platform_device_register()向系统内核进行设备的注册。
//////////////////注意设备的注册要在驱动的注册之前,即驱动注册platform_driver_register()注册之前,因为驱动注册时需要匹配内核中所有已经注册了的设备名。

那么接下来我们开始驱动的注册定义:主要结构体是platform_driver,该结构体也是定义在incluce/linux/platform_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 (*suspend_late)(struct platform_device *, pm_message_t state);
        int (*resume_early)(struct platform_device *);
        int (*resume)(struct platform_device *);
        struct device_driver driver;                               //老设备驱动,定义在include/linux/device.h中
};
然后内核提供的platform_driver结构体的注册函数为platform_driver_register(),该函数定义在driver/base/platform.c中
函数原型:
int platform_driver_register(struct platform_driver *drv)
{
        drv->driver.bus = &platform_bus_type;                      //驱动总线类型: IO, IRQ,DMA,MEM类型
        if (drv->probe)
                drv->driver.probe = platform_drv_probe;          //设备探测
        if (drv->remove)
                drv->driver.remove = platform_drv_remove;
        if (drv->shutdown)
                drv->driver.shutdown = platform_drv_shutdown;
        if (drv->suspend)
                drv->driver.suspend = platform_drv_suspend;
        if (drv->resume)
                drv->driver.resume = platform_drv_resume;
        return driver_register(&drv->driver);                              //这个就是老的设备驱动注册了
}
EXPORT_SYMBOL_GPL(platform_driver_register);
举例设备驱动:
static struct platform_driver mxc_kpd_driver = {
.driver = {
     .name = "mxc_keypad",
     .bus = &platform_bus_type,
     },
.suspend = mxc_kpp_suspend,
.resume = mxc_kpp_resume,
.probe = mxc_kpp_probe,
.remove = mxc_kpp_remove
};
////////////////////还有一个函数input_register_device();是将该驱动添加到/class/input/input0-12中。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/30958/showart_2075428.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP