Android-Firmware加载原理分析
9次阅读,Android入门,移动开发入门,byFgamers.
前言
前段时间移植wifi驱动到android的内核上,发现firmware的加载始终出错,问了几个
人,都不是很了解,没办法,只好自己研究一下。
原理分析
从本质上来说,firmware需要做的事情包括两件:
1,通知用户态程序,我需要下载firmware了;
2,用户态程序把用户态的数据copy到内核层;
3,内核把内核态的数据写到设备上,比如wifi模块里;
其中第三步应该不难,关键是看看,linux里面是如何实现第一、二步的;
实现机制
简单的说,它的机制分成以下几部分:
1,通过一定的方式,通知用户态程序,比如init程序,如图所示:
显然是通过kobject_uevent的方式通知的应用层,它的机制我有空再详细解释,简单的说,
就是往一个socket广播一个消息,只需要在应用层打开socket监听NETLINK_KOBJE
CT_UEVENT组的消息,就可以收到了。
用户态的init是如何做的?
一个socket,然后绑定它,最后通过lect来监听socket上来的数据,最后调用han
dle_device_fd来处理收到的消息;当内核发送一个KOBJ_ADD的消息上来的时候,经过
过滤,判断是否是firmware要被加载的消息,然后调用
handle_firmware_event来处理;
2,用户态的数据如何下载到内核;
本质上它是内核创建了两个文件,一个文件A用来标志下载的开始和结束,另外一个文件
B用来接收用户层传下来的数据,当用户态的程序往A文件写入1的时候,标志用户态
程序已经往里面写程序来,而往里面写入0的时候,就标志下载成功结束,如果写入-1
就表示下载失败了;下面看看这两个文件是如何被创建的,以及数据是如何写到内核的,
请看图:
这个图基本上就是两个文件被创立的过程,以及当这两个文件被用户态程序访问的时候将要
被调用的函数,比如对于标志文件,如果往里面写入数据,将会触发函数firmware_loadin
g_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_
函数;这个函数干的事情很简单,就是把用户态的数据copyright到bb->buffer,而bb->
buffer其实是在open的时候分配的空间,这样的话,就实现了用户态的数据到内核的c
opy;过程是不是完了?
还有一个步骤,这个bb->buffer本身是如何与wifi驱动交互的呢?这只是一个中间层,它
的数据必须要写到wifi的驱动才应该算完整,而这一步其实就是通过flush_write来完成
的,下面看看这个过程:
这里可以清楚的看到,flush_write做的事情就是把bb->buffer的内容copy到wifidriv
er分配的空间fw->data里面去了,至此,用户态的数据已经完整的写到了wifi的driver
空间了;
3,内核态的数据到wifi模块
这个就比较简单了,通过函数sdio_writesb利用sdio总线把数据写到模块里面去了
本文发布于:2023-01-04 05:47:21,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/88966.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |