1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Linux设备驱动模型3——platform平台总线工作原理

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

时间:2022-07-09 13:33:37

相关推荐

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函数的功能和意义

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。