以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除。

四、platform平台总线工作原理1

1、何为平台总线?

(1)属于总线中的一种,相对于usb、pci、i2c等物理总线来说,platform总线是虚拟的、抽象出来的。

(2)CPU与外部通信的2种方式:地址总线式连接和专用接口式连接(比如nand和cpu的连接)。

  • 平台总线对应地址总线式连接设备(也就是SoC内部集成的各种内部外设)。

(3)思考:为什么要有平台总线?

  • 为了管理上的方便和统一。

2、平台总线下管理的2员大将

(1)platform工作体系都定义在drivers/base/platform.c中。

(2)两个结构体:platform_device和platform_driver。

struct platform_device
{const char * name; // 平台总线下设备的名字int id;struct device dev; // 所有设备通用的属性部分u32 num_resources;// 设备使用到的resource(IO或者中断号等)的个数struct resource* resource;// 设备使用到的资源数组的首地址const struct platform_device_id* id_entry;// 设备ID表,很多个类似的同系列的产品,可以用同一个驱动/* arch specific additions */struct pdev_archdata archdata;// 自留地,用来提供扩展性的,表示设备的一些属性
};
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  (*resume)  (struct platform_device *);//唤醒struct device_driver driver;// 所有设备共用的一些属性const struct platform_device_id *id_table;// 设备ID表,表示支持哪些设备
};

(3)两个接口函数

  • platform_device_register(一般不使用这个,而是使用platform_driver_register中的probe函数?有待深入研究),在系统启动时(见五1(2)),用来注册设备。
  • platform_driver_register,用来注册驱动。

五、platform平台总线工作原理2

1、平台总线体系的工作流程

(1)第一步:系统启动时,在bus系统中注册platform(使得在/sys/bus/目录有platform)。

(2)第二步:内核移植(把硬件的信息写到软件里)的人负责提供platform_device;(即提供板文件,文件里有设备信息。比如Mach-x210.c)

(3)第三步:写驱动的人负责提供platform_driver;(主要是填充结构体并register)

(4)第四步:platform的match函数发现driver和device匹配后(通过name来匹配),调用driver的probe函数来完成驱动的初始化和安装,然后设备就工作起来了。(这个是自动的)

2、代码分析:platform总线本身注册

     

(1)每种总线(不光是platform,usb、i2c那些也是)都会带一个match方法,用来对总线下的device和driver进行匹配。

  • 理论上每种总线的匹配算法是不同的,但是实际上一般都是看name的。

(2)platform_match函数就是平台总线的匹配方法。

  • 如果有id_table,则说明驱动可能支持多个设备;
  • 这时候要去对比id_table中所有的name,只要找到一个相同的就匹配上了不再找了,如果找完id_table都还没找到就说明没有匹配上。
  • 如果没有id_table或者没有匹配上,那就直接对比device和driver的name,如果还没匹配上那就匹配失败。

(3)上面完成了第一步。下面完成第二第三步。(见六)

六、platform平台总线工作原理3

1、platform设备和驱动的注册过程(参考leds-s3c24xx.c文件)

(1)platform_driver_register,驱动部分:

(2)platform_device_register,设备部分

  • 如何找设备部分?即在板文件定义的设备信息?
  • 通过名字,即搜索名字。举个例子如下(某个设备的信息):

  • 众多设备组成一个数组,然后逐个注册。(不能有一个出错!)
  • 对于linux2.6 arm平台而言,对platform_device的定义通常在bsp的板文件中实现。
  • 板文件将设备归纳为一个数组,最终通过platform_add_devices()函数统一注册

2、platform_data怎么玩

  • platform_data其实就是设备注册时提供的、与设备有关的一些数据(譬如设备对应的gpio、使用到的中断号、设备名称……);
  • 这些数据在设备和驱动match之后,会由设备方转给驱动方(probe的第一句代码)
  • 驱动拿到这些数据后,通过这些数据得知设备的具体信息,然后来操作设备。
  • 这样做的好处是:驱动源码中不携带数据,只负责算法(对硬件的操作方法)。
  • 现代驱动设计理念就是算法和数据分离,这样最大程度保持驱动的独立性和适应性。
  • 注意:leds-s3c24xx是驱动文件,是不会有设备信息的,设备信息在板文件中定义。

3、match函数的调用轨迹

4、probe函数的功能和意义

Linux设备驱动模型3——platform平台总线工作原理相关推荐

  1. Linux设备驱动模型之platform(平台)总线详解

    /********************************************************/ 内核版本:2.6.35.7 运行平台:三星s5pv210 /*********** ...

  2. Linux设备驱动模型之platform总线

    1 平台设备和驱动初识 platform是一个虚拟的地址总线,相比pci,usb,它主要用于描述SOC上的片上资源,比如s3c2410上集成的控制器(lcd,watchdog,rtc等),platfo ...

  3. linux设备驱动模型-linux驱动开发第5部分-朱有鹏-专题视频课程

    linux设备驱动模型-linux驱动开发第5部分-4285人已学习 课程介绍         本课程是linux驱动开发的第5个课程,主要内容是linux的设备驱动模型,包括总线.类.设备.驱动等概 ...

  4. linux平台设备驱动模型是什么意思,Linux设备驱动模型之我理解

    点击(此处)折叠或打开 /* my_bus.c   */ #include #include #include #include #include #include "my_bus.h&qu ...

  5. RK3568平台开发系列讲解(驱动篇) linux设备驱动模型

    文章目录 linux设备驱动模型 为什么需要设备驱动模型 sysfs概述 设备驱动模型基本元素 驱动模型一 驱动模型二 kobject kset kobj_type linux设备驱动模型 为什么需要 ...

  6. linux 内核驱动模型,linux设备驱动模型架构分析 一

    linux设备驱动模型架构分析 一 发布时间:2018-07-04 15:14, 浏览次数:584 , 标签: linux 概述 LDD3中说:"Linux内核需要一个对系统结构的一般性描述 ...

  7. 请教几个Linux设备驱动模型的问题

    http://bbs.chinaunix.net/thread-3691002-1-1.html 1.Linux设备驱动模型是如何将bus.device和driver关联起来的?它们之间的数据结构关系 ...

  8. linux 统一设备模型 pci,Linux设备驱动模型摘抄

    Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄 Linux设备驱动模型摘抄(1) Linux统一设备模型 简介 Li ...

  9. Linux设备驱动模型1——简介和底层架构

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.linux设备驱动模型简介 1.什么是设备驱动模型? (1)类class.总线bus.设备device.驱动d ...

最新文章

  1. 我的世界最危险的服务器生存系列,《我的世界》极具危险的服务器
  2. 使用c++制作微服务计算服务
  3. Codeforces Round #467 (Div. 1): A. Save Energy!(公式)
  4. 最快的Java序列化框架Protostuff简介
  5. ati hd4570 linux amd 64 安装命令,ATI 显卡的驱动在Linux下的安装方法
  6. GB35114-SIP部分技术预研
  7. 企业微信机器人WorkTool使用文档
  8. javascript高级进阶
  9. linux博通网卡驱动怎么安装,ubuntu14.04手动安装博通官方无线网卡驱动时报错,...
  10. win7默认网关不可用_Win7自带图片查看器异常
  11. PXIe,PXI,CPCI相互区别和关系,总线之间,几种机箱之间是否兼容?
  12. 开始学习python了鸭
  13. SpringBoot整合Mybaits开发报java.lang.IllegalArgumentException: At least one base package must be specifie
  14. STM32 hal库串口空闲中断最新用法
  15. VC 控制台颜色设置
  16. Karto Slam 参数配置
  17. 澳洲移民 技术移民_满足COVID-19期间移民对语言访问的需求
  18. Java相关英语单词
  19. DM642开发板复位芯片TL7705A
  20. Linux 批量修改文件名(前缀或后缀)

热门文章

  1. 网络性能测试工具iperf详细使用图文教程【转载】
  2. 一套完整的用户增长系统架构
  3. 基于MVVM的知乎日报应用安卓源码
  4. NoSQL数据库:数据的一致性
  5. [LeetCode]Search Insert Position
  6. 同样是面对失败的责任:任春雷比杜一楠更有种
  7. C语言笔记(关键字)
  8. 进击的二维码 | ArcBlock 课堂预告
  9. 线程组之间的JMeter传递变量
  10. keepalived与lvs结合使用配置实例