Android linux firmware下载——续request_firmware之fw_path_para方式
安卓10固件下载——续
- 正文开始
之前有写过一篇blog来分析安卓代码里固件下载部分的实现,链接:android8 linux内核下载固件函数request_firmware流程分析
但是最近在工作中,遇到了一种情况,在安卓文件系统的同一个目录,有时自己编写的固件下载函数能够成功,有时再重新烧录一遍系统以后就不成功了,总显示打开文件失败(至今不知为何,忘有大佬能指出可能存在的问题)。
在这种情况下,需要暂时使用安卓系统自带的request_firmware来下载固件,但代码自带的fw_path中的路径不包含我们需要存放固件的位置,同时又不希望修改fw_path变量,这就很尴尬。
查了很久的资料都没啥有效的,后又花几周仔细看了看安卓代码,发现还有以下这种方法可实现:可以利用fw_path_para
思路来源是在安卓源码中找到了一段话:
文件位置kernel/Documentation/driver-api/firmware/fw_search_path.rst
=====================
Firmware search paths
=====================The following search paths are used to look for firmware on your
root filesystem.* fw_path_para - module parameter - default is empty so this is ignored
* /lib/firmware/updates/UTS_RELEASE/
* /lib/firmware/updates/
* /lib/firmware/UTS_RELEASE/
* /lib/firmware/The module parameter ''path'' can be passed to the firmware_class module
to activate the first optional custom fw_path_para. The custom path can
only be up to 256 characters long. The kernel parameter passed would be:* 'firmware_class.path=$CUSTOMIZED_PATH'There is an alternative to customize the path at run time after bootup, you
can use the file:* /sys/module/firmware_class/parameters/pathYou would echo into it your custom path and firmware requested will be
searched for there first.
以下代码均来自于android 10,本文是在上一篇博客的基础上写的,不是从开头讲起,如有疑问可以看下之前那篇。和上篇的Android版本虽不同,但文中涉及到的内容区别不大。
正文开始
文件位置rk3399-android-10/kernel/drivers/base/firmware_loader/main.c
/* direct firmware loading support */
static char fw_path_para[256];
static const char * const fw_path[] = {fw_path_para,"/lib/firmware/updates/" UTS_RELEASE,"/lib/firmware/updates","/lib/firmware/" UTS_RELEASE,"/lib/firmware"
};/** Typical usage is that passing 'firmware_class.path=$CUSTOMIZED_PATH'* from kernel command line because firmware_class is generally built in* kernel instead of module.*/
module_param_string(path, fw_path_para, sizeof(fw_path_para), 0644);
MODULE_PARM_DESC(path, "customized firmware image search path with a higher priority than default path");
上述代码,由注释及代码可知,在firmware_class模块内,声明了一个fw_path_para全局变量,而module_param_string使该变量可被模块外访问,外部访问的变量名是path,这个外部可见的path与模块内部可见的fw_path_para是同一个变量,只不过内外的叫法不同。
而安卓系统运行起来以后,在控制台,cd到/sys/module/下,ls所见的都是系统当前已加载的各个模块。再cd到firmware_class文件夹里,ls可以看到有parameters这个文件夹(每个模块对应的文件夹下都有parameters和uevents)。这个文件夹里是当前模块通过module_param系列函数声明的变量,firmware_class/parameters下的是path。
输入cat /sys/module/firmware_class/parameters/path
可以查看当前path的值,也就是上述main.c中fw_path_para的值。
想要改变这个path有两类:一种是暂时的,每次重启系统后都失效;另一种是永久的。
暂时的就是,在每次系统运行起来以后,修改firmware_class/parameters/path的值。cd到parameters目录,如果想要存放固件的目录是/vendor/firmware/,则su进入管理员模式,输入echo -n "/vendor/firmware" > /sys/module/firmware_class/parameters/path
。
如果不加-n,则path的值会带着换行符,在后续代码的生成完整固件路径的时候也会带着这个换行符,效果例如:
“/vendor/firmware/
test.bin”
firmware后也不要加“/”,否则会多出一个“/”,如:
“/vendor/firmware//test.bin"。
写完后可以cat输出一下,看是否成功。此时再尝试固件下载调用request_firmware可成功。
永久的改变,自然是在系统初始化该变量的时候就修改成自己需要的位置。对应的修改在~/rk3399-android-10/device/rockchip/common/BoardConfig.mk
:
ifneq ($(filter true, $(BOARD_AVB_ENABLE)), )
BOARD_KERNEL_CMDLINE := androidboot.wificountrycode=US androidboot.hardware=rk30board androidboot.console=ttyFIQ0 firmware_class.path=/vendor/firmware init=/init rootwait ro init=/init
else # BOARD_AVB_ENABLE is false
BOARD_KERNEL_CMDLINE := console=ttyFIQ0 androidboot.baseband=N/A androidboot.wificountrycode=US androidboot.veritymode=enforcing androidboot.hardware=rk30board androidboot.console=ttyFIQ0 androidboot.verifiedbootstate=orange firmware_class.path=/vendor/firmware init=/init rootwait ro
endif # BOARD_AVB_ENABLE
此处,将两处firmware_class.path=都置为目的存放位置。重新编译系统,系统运行起来,在控制台输入cat查看path的值,会发现它与BoardConfig.mk里设置的一致。
Android linux firmware下载——续request_firmware之fw_path_para方式相关推荐
- 【Linux】部署Springboot项目到Linux服务器以及linux服务器下载文件的三种方式详解
Linux学习之路 初识Linux Linux内核 由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写 Linux 是一套免费使用和自由传播的类Unix操作系 ...
- Android,linux常用资源下载链接
1 uboot 源码下载: http://www.denx.de/wiki/U-Boot,该网址上有关于uboot的源码和文档 2 交叉编译工具下载: GNU Toolchain for ARM Pr ...
- 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译
本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:http://item.jd.com/12212640.html 试读地址:http:/ ...
- 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译...
本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:item.jd.com/12212640.ht- 试读地址:www.epubit.com ...
- Android/Linux设备有线无线 双网共存(同时上内、外网)
目录 Shell脚本实现嵌入式Android/Linux有线和无线网卡双网共存 一.网络环境及问题再现 二.命令行方式实现双网共存 实现结果: 三.Shell脚本自动实现双网共存(根据网络环境动态配置 ...
- 【Android 安装包优化】p7zip 源码交叉编译 Android 平台可执行程序 ( 下载 p7zip 源码 | 交叉编译 Android 中使用 7z 可执行程序 )
文章目录 一.下载 p7zip 源码 二.交叉编译 Android 中使用 7z 可执行程序 三.参考资料 一.下载 p7zip 源码 下载 7zip 源码 , 下载页面 https://source ...
- Android Linux内核编译调试
对于在Windows上写代码写习惯的人,调试是必不可少的手段,但是转到Android以后,发现调试手段异常简陋,跟Windows简直不是一个级别,特别是Android的内核调试,网上资料也相对较少,不 ...
- android源码下载方式
android源码下载方式: 方式一: repo init -u git://android.git.kernel.org/platform/manifest.git repo sync 这是官方提供 ...
- Android/Linux boot time分析优化
如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...
最新文章
- webpack 项目使用--转换为React项目(4)
- echarts瀑布图_ECharts · Example
- 合并Spark社区代码的正确姿势
- mysql cluster 设置单向复制_mysql单向主从配置
- 职教云自动签到PHP接口版
- c语言中分数的类型,用C语言编程平均分数
- asp.net DataGridTree表格树控件 下拉树 DropTree c# .net
- CentOS 8,凛冬将至
- PHP设计模式——状态模式
- Perl语言入门14-17
- 【WordPress】小卡的土豆园开张
- Windows系统查询硬盘序列号
- 黑苹果appstore下载软件报错,不能下载解决方法
- WZOI.CC基础题库答案向导
- 详细的 win10+VS+Cuda10 环境配置,图文
- 数据分析最有用的25个Matplotlib图表
- FDTD PDMS光学参数txt文档
- 图解域名解析DNS过程
- pdf工具类 (pd4ml)
- 【高考往期真题】—— 2022高考数学全国 I 卷参考答案