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

来源:互联网 发布:俄罗斯知乎 编辑:程序博客网 时间:2024/06/07 02:07

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。

四、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函数?),用来注册设备。
  • 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函数的功能和意义


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 主播遇到黑粉怎么办 在工作单位突然死亡怎么办 孕7月半夜脚抽筋怎么办 上单对上两个射手怎么办 游戏本玩游戏掉帧怎么办 手机开直播很卡怎么办 小孩小鸡被虫子咬了怎么办 小鸡仔不吃食了怎么办 小鸡的腿瘸了怎么办 在境外住酒店钱被偷了怎么办 一加6屏幕辣眼睛怎么办 棉质衣服皱了怎么办 洗完衣服皱了怎么办 穿衬衫袖子很皱怎么办 洗完衣服有褶皱怎么办 麻料裤子容易皱怎么办 苹果手机邮件删了怎么办 飞猪12306登录不上怎么办 邮箱被别人绑定12306怎么办 白名单一个地址也没怎么办 12306忘记用户名和密码怎么办 12306忘了用户名和密码怎么办 12306注册后忘了密码怎么办 12306帐号忘了密码怎么办 12306忘了密码和手机号怎么办 12306账号密码邮箱忘了怎么办 注册12306账号没有邮箱怎么办 12306忘了用户名和邮箱怎么办 12306忘记用户名和邮箱怎么办 12306证件号码已被注册怎么办 12306忘记手机号和邮箱怎么办 发邮件被对方服务器退回怎么办 铁路12306显示已注册怎么办 qq密码太长输不进去怎么办 淘宝买家收货地址填写不全怎么办 护士电子注册账户未激活怎么办 您的邮件被退回怎么办 给国外发信被退怎么办 苹果8icloud满了怎么办 吃人参回奶了怎么办 邮箱被黑客黑了怎么办