firmware

更新时间:2023-01-04 05:47:21 阅读: 评论:0


2023年1月4日发(作者:美国哥特式)

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小时内删除。

上一篇:安拉
下一篇:原动力
标签:firmware
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图