目录(?)[-]

  1. 原理分析
  2. 实现机制
  3. 总结


前言

前段时间移植wifi驱动到android的内核上,发现firmware的加载始终出错,问了几个人,都不是很了解,没办法,只好自己研究一下。

原理分析

从本质上来说,firmware需要做的事情包括两件:

1,通知用户态程序,我需要下载firmware了;

2,用户态程序把用户态的数据copy到内核层;

3,内核把内核态的数据写到设备上,比如wifi模块里;

其中第三步应该不难,关键是看看,linux里面是如何实现第一、二步的;

实现机制

简单的说,它的机制分成以下几部分:

1,通过一定的方式,通知用户态程序,比如init程序,如图所示:

显然是通过kobject_uevent的方式通知的应用层,它的机制我有空再详细解释,简单的说,就是往一个socket广播一个消息,只需要在应用层打开socket监听NETLINK_KOBJECT_UEVENT组的消息,就可以收到了。

用户态的init是如何做的?

可以看到init程序打开了一个socket,然后绑定它,最后通过select来监听socket上来的数据,最后调用handle_device_fd来处理收到的消息;当内核发送一个KOBJ_ADD的消息上来的时候,经过过滤,判断是否是firmware要被加载的消息,然后调用

handle_firmware_event来处理;

2,用户态的数据如何下载到内核;

本质上它是内核创建了两个文件,一个文件A用来标志下载的开始和结束,另外一个文件B用来接收用户层传下来的数据,当用户态的程序往A文件写入1的时候,标志用户态程序已经往里面写程序来,而往里面写入0的时候,就标志下载成功结束,如果写入-1就表示下载失败了;下面看看这两个文件是如何被创建的,以及数据是如何写到内核的,请看图:

这个图基本上就是两个文件被创立的过程,以及当这两个文件被用户态程序访问的时候将要被调用的函数,比如对于标志文件,如果往里面写入数据,将会触发函数firmware_loading_store函数,如果往bin文件里面写入数据将会触发bin文件类型的write函数;

用户态写数据的过程大约是这样的:当用户态收到KOBJ_ADD消息的时候最终将会调用handle_firmware_event的函数;

它的过程就是:

a,先往标志文件里面写1;

b,从用户空间读取数据;

c,往内核创建的文件里面写数据;

d,如果成功写入0,否则写入-1;

下面看看内核是如何接受这些文件的,前面提到内核创建了一个bin文件,用来接收用户态的数据,下面看看这个过程:

对于SYSFS_KOBJ_BIN_ATTR属性的文件,在inode初始化的时候,将会被赋予bin_fops的文件操作函数集,于是当上层调用write的时候,将会走到内核的bin_fops.write函数;这个函数干的事情很简单,就是把用户态的数据copyright到bb->buffer,而bb->buffer其实是在open的时候分配的空间,这样的话,就实现了用户态的数据到内核的copy;过程是不是完了?

还有一个步骤,这个bb->buffer本身是如何与wifi驱动交互的呢?这只是一个中间层,它的数据必须要写到wifi的驱动才应该算完整,而这一步其实就是通过flush_write来完成的,下面看看这个过程:

这里可以清楚的看到,flush_write做的事情就是把bb->buffer的内容copy到wifi driver分配的空间fw->data里面去了,至此,用户态的数据已经完整的写到了wifi的driver空间了;

3,内核态的数据到wifi模块

这个就比较简单了,通过函数sdio_writesb利用sdio总线把数据写到模块里面去了;

总结

Firmware的加载主要是利用了uevent的通讯机制实现用户态和内核态的交互,另外还涉及了sys文件系统里的文件创建,我加载wifi firmware始终出错的原因是android的文件系统要求把wifi的firmware helper放到/etc/firmware里面,而把真正的firmware sd8686.bin放到/etc/firmware/mrvl里面,估计是marvel修改后的结果,结论就是,这个设计***


From:http://blog.csdn.net/linweig/article/details/5640697

更多相关文章

  1. Android应用程序的数据存放目录解说
  2. Android(安卓)学习之--HttpClient详细使用
  3. Android源代码分析(二) MediaScanner源码分析(上)
  4. Content Prodvider 类----实例:获取通讯录信息
  5. Android(安卓)用户界面---定制组件(Custom Components)(一)
  6. 从零学Android(十三)、Android中的数据存储方式简介
  7. Android中的各种Adapter
  8. Android四种保存数据的方法
  9. Android(安卓)创建XMl文件

随机推荐

  1. android 修改电量图标(改为数字图标)
  2. android版本兼容,高版本低版本兼容性-[And
  3. Android百度地图开发API key申请详细步骤
  4. Android面试总结
  5. Android(安卓)Studio3.0开发JNI流程-----
  6. Android实现资源动态加载的两种方式
  7. android出现注: 某些输入文件使用或覆盖
  8. Android仿360卫士布局风格
  9. Android中MVP模式实战版(一)
  10. Android自动化单元测试(上)