Chinaunix首页 | 论坛 | 博客
  • 博客访问: 67159
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 213
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-24 12:38
个人简介

专注的力量很大,它能把一个人的潜力发挥到极致,一旦达到那种状态你就没有了自我的概念,所有的精力集中到了一点。

文章分类
文章存档

2015年(11)

2014年(6)

我的朋友

分类: 嵌入式

2015-01-07 16:25:57

之前学过内核分离思想的实现过程,第一次没怎么看懂,后面通过查资料有了一定的了解。
在这里自己总结一下:
之前写的驱动代码里面,包含两个部分:
1.纯软件部分,比如设备号,字符设备对象,设备类等。
2.纯硬件部分,比如GPIO的编号,GPIO寄存器地址等。

那么如果当我们把这个驱动程序移植到不同型号的开发板上时,但凡是涉及到硬件相关的内容都要进行修改。
这样看下来,要修改的东西是在是太多了。不但麻烦,而且开发效率非常低。
那如何解决驱动代码可移植性非常差的问题?
于是乎,某个大牛想到了一个方法。
明确驱动的硬件和软件,说白了就是把纯硬件部分和纯软件部分分开来写。
这样的话,一旦移植了开发板,只需要修改纯硬件的部分即可,软件部分内容就无需修改。(这个也不是绝对的,具体看开发)

那内核是怎么实现分离的过程呢?
首先,内核已经帮我们定义好了一个虚拟总线platform_bus_type(平台总线),并且在这个总线上维护两个链表。
分别是dev链表 和 drv链表;
dev链表每个节点上存放的当然是硬件相关的信息,并且对应的数据结构struct platform_devices。
drv链表每个节点上存放的只能是软件相关的信息咯,当然他对应的数据结构就是struct platform_driver。

方法一:   1.当我们用struct platform_devices结构体分配一个对象时,根据实际的硬件去初始化这个对象
               2.然后注册添加到dev链表上,最后内核会帮你去遍历drv链表(软件),取出drv链表上每一个软件节点
               3.通过调用platform_bus_type(平台总线)提供的match函数,去比较软件节点和硬件节点的name是否相等(strcmp)
               4.如果相等!内核会调用软件节点的probe函数,然后将硬件节点的首地址传递给probe函数,让这个函数去操作硬件。
               5.如果没有匹配成功(name不相等),那就一直等待软件节点的到来。

方法二:    1.当我们用struct platform_driver结构体分配一个对象时,根据实际的软件操作,
                2.然后注册添加到drv链表上,最后内核会帮你去遍历dev链表,取出dev链表上的每一个节点
                3.通过调用platform_bus_type(平台总线)提供的match函数,去比较软件节点和硬件节点的name是否相等(strcmp),
                4.如果相等!内核会调用软件节点的probe函数,然后将硬件节点的首地址传递给probe函数,让probe函数获取硬件操作硬件。
                5.如果没有匹配成功(name不相等),那就一直等待软件节点的到来。

我们实际驱动开发只需要关注:
struct platform_device    用它如何去描述硬件信息
struct platform_driver     用它如何去描述软件信息

总结:probe函数是否被调用,代表软件和硬件结合!!如果被调用,软件和硬件再度结合,如果没有调用,这个驱动不完整!

阅读(1973) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~