platform device driver

platform总线是在linux 2.6 内核中加入的一种虚拟总线。platform机制有两部分组成platform_device和platform_driver.

Platform device是linux上一种具有自我管理功能的一个subsystem。它包含了一些基于port的legacy device以及一些host bridge 连接外部总线的设备再者就是embedded system中的许多设备也是platform device。不管是什么设备,只要它属于platform device都有一个共同的特点:
       CPU bus直接寻址
还有一种很少的情况:platform device连接在其他bus的某个segment上但是它的registers是直接寻址的

 

struct platform_device {
    const char    * name;
    int        id;
    struct device    dev;
    u32        num_resources;
    struct resource    * resource;
};

 

 Platform device是一种device自己是不会做事情的,要有人为它做事情,那就是platform driver。下面介绍platform driver。

 

platform driver遵循linux系统的driver model(这个内容是很大的内容有兴趣的可以自己学习)。对于device的discovery/enumerate都不是driver自己完成的而是有由系统的driver注册机制完成。driver编写人员只要将注册必须的数据结构初始化并调用注册driver的kernel API就可以了。以下是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 (*suspend_late)(struct platform_device *, pm_message_t state);
        int (*resume_early)(struct platform_device *);
        int (*resume)(struct platform_device *);
        struct device_driver driver;
};

 

API:
int platform_device_register(struct platform_device *pdev);
int platform_add_devices(struct platform_device **pdevs, int ndev);
int platform_driver_register(struct platform_driver *drv);

 

 

platform机制开发设备驱动的流程如下:

定义platform_device--->注册platform_device--->定义platform_driver--->注册 platform_driver.

 

下面介绍下在linux s3c6410中加入 led平台驱动的方法:

首先要在bsp文件中加入

///*led driver support*/
static struct gpio_led s3c6410_leds[] = {
[0] = {
     .name = "LED10",
  .gpio = S3C64XX_GPK(4),
   },
[1] = {
  .name = "LED12",
  .gpio = S3C64XX_GPK(5),
   },
[2] = {
  .name = "LED13",
  .gpio = S3C64XX_GPK(6),
   },
[3] = {
  .name = "LED14",
  .gpio = S3C64XX_GPK(7),
  },
};

 

static struct gpio_led_platform_data s3c6410_gpio_led_pdata = {
 .num_leds = ARRAY_SIZE(s3c6410_leds),
 .leds = s3c6410_leds,
};

 

static struct platform_device s3c_device_led = {
  .name = "leds-gpio",
  .id   = 1,
  .dev  = {
        .platform_data = &s3c6410_gpio_led_pdata,
     },

};
仔细看你就会发现与设备相关的信息都是在bsp中,即在bsp 中主要实现了platform_device 这个结构体。

 

而在驱动root@wsh-desktop:/home/mini/linux-2.6.28.6/drivers/leds# emacs leds-gpio.c主要是实现了platform_driver

 

static struct platform_driver gpio_led_driver = {
 .probe  = gpio_led_probe,
 .remove  = __devexit_p(gpio_led_remove),
 .suspend = gpio_led_suspend,
 .resume  = gpio_led_resume,
 .driver  = {
  .name = "leds-gpio",//设备名
  .owner = THIS_MODULE,
 },


};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值