17.平台总线程序设计

            平台总线程序设计

  

一、平台总线概述

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

17.平台总线程序设计的相关文章

设备模型(device-model)之平台总线(bus),驱动(driver),设备(device)

关于关于驱动设备模型相关概念请参考<Linux Device Drivers>等相关书籍,和内核源码目录...\Documentation\driver-model 简单来说总线(bus),驱动(driver),设备(device)这三者之间的关系就是:驱动开发者可以通过总线(bus)来将驱动(driver)和设备(device)进行隔离,这样的好处就是开发者可以将相对稳定不变的驱动(driver)独立起来,可以通过总线(bus)来桥接与之匹配的设备(device).设备(device)只需要

驱动04.平台总线驱动模型——点亮LED灯

1 平台总线的简介 平台总线是一种虚拟的总线,相应的设备则为platform_device,而驱动则为platform_driver.总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动:相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成. 我们可以把一个驱动程序抽出来分为两部分,一部分是硬件相关的dev,另一部分则是稳定的纯软件部分driver.而总线只是一种机制,把dev和driver这两部分建立"联系"的机制. eg: ①dev部分 a.

20150226 IMX257 总线设备驱动模型编程之平台总线设备platform

20150226 IMX257 总线设备驱动模型编程之平台总线设备platform 2015-02-26 李海沿 前面我们实现了总线设备驱动模型,下面我们来了解一下平台总线,平台设备驱动 分为平台设备和平台驱动两种,和前面所说的设备驱动差不多 platform总线是一种虚拟的总线,相应的设备则为platform_device,而驱动则为platform_driver.Linux 2.6的设备驱动模型中,把I2C.RTC.LCD等都归纳为platform_device. 一.平台设备介绍 1. p

平台总线 —— 平台总线驱动模型

目录 1.为什么会有平台总线? 2.平台总线三要素 3.平台总线编程接口 4.编写能在多平台下使用的led驱动 1.为什么会有平台总线? 1 用于平台升级:三星: 2410, 2440, 6410, s5pc100 s5pv210 4412 2 硬件平台升级的时候,部分的模块的控制方式,基本上是类似的 3 但是模块的地址是不一样 4 5 gpio控制逻辑: 1, 配置gpio的输入输出功能: gpxxconf 6 2, 给gpio的数据寄存器设置高低电平: gpxxdata 7 逻辑操作基本上是

linux设备驱动之platform平台总线工作原理(三)

设备为数据,驱动为加工着 1.以led-s3c24xx.c为例来分析platform设备和驱动的注册过程 其中关于led的驱动数据结构为: static struct platform_driver s3c24xx_led_driver = { .probe = s3c24xx_led_probe, .remove = s3c24xx_led_remove, .driver = { .name = "s3c24xx_led", .owner = THIS_MODULE, }, }; s

linux设备驱动之平台总线实践环节(三)

1.在平台总线的实践环节的一和二中,分别将led的platform_driver和platform_device初步完成,接下来看下platform_device和platform_driver同时存在时的效果,就是led的平台设备已经注册到内核中,并且在根文件系统中ismod加载上led的平台总线驱动.看一下platform_device和platform_driver两者相遇会怎么样,根据platform平台总线的逻辑,因为我们已经将led的platform_device注册到了内核中,这个

linux设备驱动之platform平台总线工作原理(二)

5.5.5.platform平台总线工作原理2 5.5.5.1.平台总线体系的工作流程 (1)第一步:linux内核系统启动时在bus系统中注册platform. 1.什么叫做bus系统,操作系统中有一套管理总线的体系,内核里有一个子系统,就叫做总线子系统.就是内核来管理总线的.bus系统在内核启动时建立起来,比platform建立的时间还要早,bus系统的是由内核编写的人提供的,我们将来分析代码的时候不需要去分析他.在bus系统起来以后,就需要在bus系统中注册这个platform平台总线的b

linux驱动之platform平台总线工作原理(一)

5.5.4.platform平台总线工作原理 5.5.4.1.何为平台总线 (1)platform总线相对于i2c.usb.spi.pci等总线是不同的,他们属于物理总线,platform总线是属于虚拟总线.抽象出来的,platform总线下的设备并不对应于真实存在的一种设备,这种总线在真实的物理是是没有的.比如i2c在物理上有i2c总线,但是platform总线在物理上并没有这种总线. (2)CPU和外部通信时,有两种连接方式,一种叫做地址总线式连接,一种叫做专用接口式连接,有一些设备是通过地

9.平台总线驱动设计

平台总线驱动设计 平台总线(Platform bus)是linux2.6内核加入的一种虚拟总线,其优势在于采用了总线的模型对设备与驱动进行了管理,这样提高了程序的可移植性.虚拟总线和实际的总线优势相当.我们只要把驱动和设备挂载到虚拟总线就可以了. 平台总线驱动与设备匹配机制 平台总线的结构:platform_bus_type: 该结构中,最重要的是我们的匹配函数platform_match: 在匹配函数里,有我们熟悉的代码,最后一行: Strcmp(pdev->name,drv->name)这