平台总线程序设计
一、平台总线概述
平台总线(Platform bus)是linux2.6内核加入的一种虚拟总线,其优势在于采用了总线的模型对设备与驱动进行了管理,这总线的模型对设备与驱动进行了管理,这样提高了程序的可移植性。
通过平台总线机制开发设备驱动的流程如图:
平台总线的结构:platform_bus_type:
1 struct bus_type platform_bus_type = { 2 .name = "platform", 3 .dev_attrs = platform_dev_attrs, 4 .match = platform_match, 5 .uevent = platform_uevent, 6 .pm = &platform_dev_pm_ops, 7 };
该结构中,最重要的是我们的匹配函数platform_match:
1 static int platform_match(struct device *dev, struct device_driver *drv) 2 { 3 struct platform_device *pdev = to_platform_device(dev); 4 struct platform_driver *pdrv = to_platform_driver(drv); 5 6 /* Attempt an OF style match first */ 7 if (of_driver_match_device(dev, drv)) 8 return 1; 9 10 /* Then try to match against the id table */ 11 if (pdrv->id_table) 12 return platform_match_id(pdrv->id_table, pdev) != NULL; 13 14 /* fall-back to driver name match */ 15 return (strcmp(pdev->name, drv->name) == 0); 16 }
在匹配函数里,有我们熟悉的代码:总线设备驱动程序学习中使用过的
二、平台设备
平台设备使用struct platform_device来描述:
1 struct platform_device{ 2 const char *name; /*设备名*/ 3 int id; /*设备编号,配合设备名使用*/ 4 struct device dev; 5 u32 num_resources; 6 struct resource *resource; /*设备资源*/ 7 };
在这个结构中,重要的成员name,设备要和驱动的名字一样。另一个是resource。设备的资源,例如中断号,寄存器.....都是资源。这些就放到resource这个结构里:
其中struct resource *resource描述:
1 struct resource{ 2 resource_size_t start; 3 resource_size_t end; 4 const char *name; 5 unsigned long flags; /*资源的类型*/ 6 struct resource *parent, *sibling, *child; 7 };
1.1注册和注销平台设备
注册平台设备,使用函数:
int platform_device_register(struct platform_device *pdev)
注销平台设备,使用函数:
int platform_device_unregister(struct platform_device *pdev)
使用实例:
1 #include <linux/init.h> 2 #include <linux/module.h> 3 #include <linux/platform_device.h> 4 #include <linux/interrupt.h> 5 #include <linux/of_platform.h> 6 7 MODULE_LICENSE("GPL"); 8 9 #define GPNCON 0x7f008830 10 11 //定义资源 12 struct resource key_resource[] ={ 13 [0] = { //第一项资源 14 .start = GPNCON, 15 .end = GPNCON+8, 16 .flags = IORESOURCE_MEM, 17 }, 18 [1] = { //第二项资源,中断号 19 .start = IRQ_EINT(0), 20 .end = IRQ_EINT(1), 21 .flags = IORESOURCE_IRQ, 22 }, 23 }; 24 25 //定义平台设备结构 26 struct platform_device key_device = { 27 .name = "my-key", 28 .id = 0, 29 .num_resources = 2, 30 .resource = key_resource, 31 }; 32 33 int keydev_init(void) 34 { 35 int ret; 36 //平台设备的注册 37 ret = platform_device_register(&key_device); 38 return ret; 39 } 40 41 void keydev_exit(void) 42 { 43 platform_device_unregister(&key_device); 44 } 45 46 module_init(keydev_init); 47 module_exit(keydev_exit);
执行结果如下:
三、平台驱动
平台驱动使用struct platform_driver 描述:
1 struct platform_driver { 2 int (*probe)(struct platform_device *); 3 int (*remove)(struct platform_device *); 4 void (*shutdown)(struct platform_device *); 5 int (*suspend)(struct platform_device *, pm_message_t state); 6 int (*resume)(struct platform_device *); 7 struct device_driver driver; 8 const struct platform_device_id *id_table; 9 };
时间: 2024-10-13 16:43:58