安卓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方式相关推荐

  1. 【Linux】部署Springboot项目到Linux服务器以及linux服务器下载文件的三种方式详解

    Linux学习之路 初识Linux Linux内核 由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写 Linux 是一套免费使用和自由传播的类Unix操作系 ...

  2. Android,linux常用资源下载链接

    1 uboot 源码下载: http://www.denx.de/wiki/U-Boot,该网址上有关于uboot的源码和文档 2 交叉编译工具下载: GNU Toolchain for ARM Pr ...

  3. 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译

    本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:http://item.jd.com/12212640.html 试读地址:http:/ ...

  4. 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译...

    本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:item.jd.com/12212640.ht- 试读地址:www.epubit.com ...

  5. Android/Linux设备有线无线 双网共存(同时上内、外网)

    目录 Shell脚本实现嵌入式Android/Linux有线和无线网卡双网共存 一.网络环境及问题再现 二.命令行方式实现双网共存 实现结果: 三.Shell脚本自动实现双网共存(根据网络环境动态配置 ...

  6. 【Android 安装包优化】p7zip 源码交叉编译 Android 平台可执行程序 ( 下载 p7zip 源码 | 交叉编译 Android 中使用 7z 可执行程序 )

    文章目录 一.下载 p7zip 源码 二.交叉编译 Android 中使用 7z 可执行程序 三.参考资料 一.下载 p7zip 源码 下载 7zip 源码 , 下载页面 https://source ...

  7. Android Linux内核编译调试

    对于在Windows上写代码写习惯的人,调试是必不可少的手段,但是转到Android以后,发现调试手段异常简陋,跟Windows简直不是一个级别,特别是Android的内核调试,网上资料也相对较少,不 ...

  8. android源码下载方式

    android源码下载方式: 方式一: repo init -u git://android.git.kernel.org/platform/manifest.git repo sync 这是官方提供 ...

  9. Android/Linux boot time分析优化

    如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...

最新文章

  1. webpack 项目使用--转换为React项目(4)
  2. echarts瀑布图_ECharts · Example
  3. 合并Spark社区代码的正确姿势
  4. mysql cluster 设置单向复制_mysql单向主从配置
  5. 职教云自动签到PHP接口版
  6. c语言中分数的类型,用C语言编程平均分数
  7. asp.net DataGridTree表格树控件 下拉树 DropTree c# .net
  8. CentOS 8,凛冬将至
  9. PHP设计模式——状态模式
  10. Perl语言入门14-17
  11. 【WordPress】小卡的土豆园开张
  12. Windows系统查询硬盘序列号
  13. 黑苹果appstore下载软件报错,不能下载解决方法
  14. WZOI.CC基础题库答案向导
  15. 详细的 win10+VS+Cuda10 环境配置,图文
  16. 数据分析最有用的25个Matplotlib图表
  17. FDTD PDMS光学参数txt文档
  18. 图解域名解析DNS过程
  19. pdf工具类 (pd4ml)
  20. 【高考往期真题】—— 2022高考数学全国 I 卷参考答案

热门文章

  1. 计算机网页设计与制作论文,网页设计与制作论文
  2. Codevs 1222 信与信封问题 二分图匹配,匈牙利算法
  3. win7滑轮滚动excel就停止工作的解决方法
  4. 双旗科技亮相2010年上海国际数字标牌展
  5. html防止数字解析成电话号码,全方面解析手机号码数字吉凶磁场!
  6. 《老妈语录》 读后感
  7. 校企合作 | 重庆工商大学派斯学院与芝诺数据签订校企合作协议
  8. uniapp 微信小程序发布版本提示珊瑚运营平台、uniAD 有新版本怎么解决?
  9. 架构-“12306”的架构
  10. android消除屏幕锁