内核模块在Android设备上找不到固件文件; 应该在哪里?

gny*_*his 5 android firmware linux-device-driver linux-kernel

我无法在Android设备上正确放置固件,我不断得到:

<3>[ 3590.997375] usb 3-1.4: ath9k_htc: Firmware - htc_7010.fw not found
Run Code Online (Sandbox Code Playgroud)

如果在运行Ubuntu的标准linux机器上,我将htc_7010.fw放在/ lib/firmware中,那么我不会收到此错误.

但是,如果我将此固件放在Android上的/ lib/firmware中,我仍然会收到错误消息.我已经尝试了以下所有目录,但仍然收到错误:

/lib/firmware
/etc/firmware
/system/lib/modules
/system/lib/firmware
/system/etc
Run Code Online (Sandbox Code Playgroud)

没有这样的运气......什么决定固件应该在哪里,以及如何确定它正在扫描固件的目录?

Rus*_*ltz 7

在Android(无论如何ICS)上,它有自己的守护进程/服务(或任何你想要的名称)来管理热插拔事件,包括固件请求.在<android>/system/core/init/devices.c,有两个#defines指定将检查固件的位置:

#define FIRMWARE_DIR1   "/etc/firmware"
#define FIRMWARE_DIR2   "/vendor/firmware"
Run Code Online (Sandbox Code Playgroud)

在我初始构建的ICS文件系统时,/etc/firmware不存在(并且etc目录似乎是在启动/初始化时创建的符号链接).我必须将固件放在我的NFS挂载的rootfs上的目录是<mount point>/system/etc/firmware

执行此操作后,我的模块中的request_firmware()调用已成功完成.


小智 1

内核执行用户空间脚本来加载固件。检查脚本是否位于正确的位置。

  1. 检查内核在哪个位置查找脚本。/ # cat /proc/sys/kernel/hotplug. 默认位置是“/sbin/hotplug”。
  2. 检查此位置是否有内核正在寻找的脚本。在 Android 上,脚本应该是“/system/busybox/sbin/mdev”,因此如果不是,您可以将“/proc/sys/kernel/hotplug”设置为此。