platform device driver

platform device driverplatform总线是在linux2.6内核中加入的一种虚拟总线。platform机制有两部分组成platform_device和platform_driver.structplatform_device{   constchar   *name;   int      id;   structdevice   dev;   u32      num_resources;   structresource   *resource;};plat

大家好,又见面了,我是你们的朋友全栈君。

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,
 },

};

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163794.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 跨域问题Access to XMLHttpRequest‘*‘from origin ‘*‘ has been blocked by CORS..Access-Control-Allow-Origin[通俗易懂]

    跨域问题Access to XMLHttpRequest‘*‘from origin ‘*‘ has been blocked by CORS..Access-Control-Allow-Origin[通俗易懂]跨域问题解决方案:CORSAccesstoXMLHttpRequestat’*’fromorigin’*’hasbeenblockedbyCORSpolicy:Responsetopreflightrequestdoesn’tpassaccesscontrolcheck:No’Access-Control-Allow-Origin’header…

    2022年6月11日
  • 分辨率,像素,像素密度易懂

    分辨率,像素,像素密度易懂分辨率是什么?一般会说这个屏幕的分辨率是1920*1080,这就说明纵向和横向上有1920个和1080个像素点;像素点是什么?一个像素点就是一个色彩块,没有实际的物理尺寸;什么是屏幕像素密度?一英寸长的一条线上理论上会有多少个像素点;例如:一个手机长边有1920个像素点,短边有1080个像素点,屏幕大小(对角线的物理大小)是5.2英寸的,那么屏幕密度是怎么计…

    2022年5月4日
  • idea激活码 在线(注册激活)[通俗易懂]

    (idea激活码 在线)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
  • 浅谈数字音视频传输网络——AVB[通俗易懂]

    AVB有两种流格式:AM824和AAF。AM824支持24bit音频,iec60958音频编码(SPDIF和AES3),SMPTE时间码和MIDI。对于发送端AM824有三个选项“non-blocking(sync)”、“non-blocking(aync)”和“blocking”。流量整形是为了避免在以太网中发生丢弃数据的情况,通常采用漏桶算法(LeakyBucket)来完成流量整形或速率限制(RateLimiting)。它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。

    2022年4月14日
  • web大文件上传解决方案_java上传文件到服务器

    web大文件上传解决方案_java上传文件到服务器在application.properties加入以下配置即可##视频上传大小spring.http.multipart.maxFileSize=50Mbspring.http.multipart.maxRequestSize=50Mb#end

    2022年10月10日
  • mysql锁表和解锁语句_db2查看是否锁表

    mysql锁表和解锁语句_db2查看是否锁表介绍锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否是否已解除、释放锁等。锁机制共享锁与排他锁共享锁(读锁):其他事务可以读,但不能写。排他锁(写锁):其他事务不能读取,也不能写。粒度锁MySQL不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的

    2022年8月23日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号