platform驱动模型.ppt
platform驱动模型,一个现实的Linux设备和驱动通常都需要挂接在一种总线上。对于本身依附于PCI、USB、IIC、SPI等总线的设备而言,这自然不是问题。因为内核针对PCI、USB、IIC、SPI等总线实现了专门的总线驱动来管理总线上的设备和总线上的驱动,在嵌入式系统中,SoC系统中集成的独立的外设控制器,挂接在SoC内存空间的外设(IIC,RTC,SPI,LCD,看门狗)等却不依附于此类总线(PCI、USB、IIC、SPI等)基于这一背景,Linux发明了一种虚拟的总线,称为platform总线,相应的设备称为platform device,而驱动称platform driver.,使用platform总线的两大好处:1.使得一些杂项设备被挂接在一个总线上,便于管理,同时也符合Linux2.6的设备模型。其结果是,配套的sysfs节点、设备电源管理都成为可能;2.隔离BSP和驱动。在BSP中定义platform设备和它使用的资源、设备的具体配置信息;而在驱动中,只需要通过通用的API去获取资源和数据,做到了BSP相关代码和驱动代码的分离,使得驱动具有更好的可扩展性和跨平台性。BSP:实现于arch/arm/mach-s3c2440/下的代码,设备模型中使用platform_device结构来描述设备的名称、资源等信息struct platform_device constchar*name;/*设备名*/int id;/*设备ID*/struct device dev;/*内嵌的表示设备的结构体*/u32 num_resources;/*设备使用各类资源数量*/struct resource*resource;/*内存和irq资源*/structplatform_device_id*id_entry;structpdev_archdata archdata;,struct resource resource_size_tstart;/*开始值*/resource_size_tend;/*结束值*/constchar*name;unsignedlong flags;/*类型*/structresource*parent,*sibling,*child;当flags为IORESOURCE_MEM时,start和end分别表示该platform_device占据内存的开始地址和结束地址;当flags为IORESOURCE_IRQ时,start和end分别表示该platform_device使用的中断号的开始值和结束值。,注册和注销平台设备int platform_device_register(struct platform_device*);void platform_device_unregister(struct platform_device*);,设备模型中使用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;/*内嵌的表示驱动的结构体*/struct platform_device_id*id_table;,注册和注销平台驱动int platform_driver_register(struct platform_driver*);void platform_driver_unregister(struct platform_driver*);,平台设备与平台驱动的matchstatic int platform_match(struct device*dev,struct device_driver*drv)struct platform_device*pdev=to_platform_device(dev);struct platform_driver*pdrv=to_platform_driver(drv);if(pdrv-id_table)returnplatform_match_id(pdrv-id_table,pdev)!=NULL;return(strcmp(pdev-name,drv-name)=0);假如平台设备和平台驱动的名字相同,则匹配成功,进而执行平台驱动的probe函数,我们一般把驱动的初始化代码放到平台驱动的probe函数里边,作业:将之前所讲的字符设备驱动用platform驱动模型实现,