Linux设备驱动模型3——platform平台总线工作原理
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除。
四、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平台总线工作原理相关推荐
- Linux设备驱动模型之platform(平台)总线详解
/********************************************************/ 内核版本:2.6.35.7 运行平台:三星s5pv210 /*********** ...
- Linux设备驱动模型之platform总线
1 平台设备和驱动初识 platform是一个虚拟的地址总线,相比pci,usb,它主要用于描述SOC上的片上资源,比如s3c2410上集成的控制器(lcd,watchdog,rtc等),platfo ...
- linux设备驱动模型-linux驱动开发第5部分-朱有鹏-专题视频课程
linux设备驱动模型-linux驱动开发第5部分-4285人已学习 课程介绍 本课程是linux驱动开发的第5个课程,主要内容是linux的设备驱动模型,包括总线.类.设备.驱动等概 ...
- linux平台设备驱动模型是什么意思,Linux设备驱动模型之我理解
点击(此处)折叠或打开 /* my_bus.c */ #include #include #include #include #include #include "my_bus.h&qu ...
- RK3568平台开发系列讲解(驱动篇) linux设备驱动模型
文章目录 linux设备驱动模型 为什么需要设备驱动模型 sysfs概述 设备驱动模型基本元素 驱动模型一 驱动模型二 kobject kset kobj_type linux设备驱动模型 为什么需要 ...
- linux 内核驱动模型,linux设备驱动模型架构分析 一
linux设备驱动模型架构分析 一 发布时间:2018-07-04 15:14, 浏览次数:584 , 标签: linux 概述 LDD3中说:"Linux内核需要一个对系统结构的一般性描述 ...
- 请教几个Linux设备驱动模型的问题
http://bbs.chinaunix.net/thread-3691002-1-1.html 1.Linux设备驱动模型是如何将bus.device和driver关联起来的?它们之间的数据结构关系 ...
- linux 统一设备模型 pci,Linux设备驱动模型摘抄
Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄 Linux设备驱动模型摘抄(1) Linux统一设备模型 简介 Li ...
- Linux设备驱动模型1——简介和底层架构
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.linux设备驱动模型简介 1.什么是设备驱动模型? (1)类class.总线bus.设备device.驱动d ...
最新文章
- 我的世界最危险的服务器生存系列,《我的世界》极具危险的服务器
- 使用c++制作微服务计算服务
- Codeforces Round #467 (Div. 1): A. Save Energy!(公式)
- 最快的Java序列化框架Protostuff简介
- ati hd4570 linux amd 64 安装命令,ATI 显卡的驱动在Linux下的安装方法
- GB35114-SIP部分技术预研
- 企业微信机器人WorkTool使用文档
- javascript高级进阶
- linux博通网卡驱动怎么安装,ubuntu14.04手动安装博通官方无线网卡驱动时报错,...
- win7默认网关不可用_Win7自带图片查看器异常
- PXIe,PXI,CPCI相互区别和关系,总线之间,几种机箱之间是否兼容?
- 开始学习python了鸭
- SpringBoot整合Mybaits开发报java.lang.IllegalArgumentException: At least one base package must be specifie
- STM32 hal库串口空闲中断最新用法
- VC 控制台颜色设置
- Karto Slam 参数配置
- 澳洲移民 技术移民_满足COVID-19期间移民对语言访问的需求
- Java相关英语单词
- DM642开发板复位芯片TL7705A
- Linux 批量修改文件名(前缀或后缀)