码迷,mamicode.com
首页 > 编程语言 > 详细

17.平台总线程序设计

时间:2016-04-08 20:05:55      阅读:373      评论:0      收藏:0      [点我收藏+]

标签:

            平台总线程序设计

   技术分享

一、平台总线概述

  平台总线(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 };

 

17.平台总线程序设计

标签:

原文地址:http://www.cnblogs.com/wmx-learn/p/5369663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!