【问题标题】:kernel module cannot find firmware file on Android device; where should it be?内核模块在 Android 设备上找不到固件文件;它应该在哪里?
【发布时间】:2011-05-16 15:50:29
【问题描述】:

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

<3>[ 3590.997375] usb 3-1.4: ath9k_htc: Firmware - htc_7010.fw not found

如果在运行 Ubuntu 的标准 linux 机器上,我将 htc_7010.fw 放在 /lib/firmware 中,则不会出现此错误。

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

/lib/firmware
/etc/firmware
/system/lib/modules
/system/lib/firmware
/system/etc

没有这样的运气...什么决定了固件应该在哪里,我如何确定它正在扫描哪些目录来查找固件?

【问题讨论】:

    标签: android linux-kernel linux-device-driver firmware


    【解决方案1】:

    在 Android 上(无论如何是 ICS),它有自己的守护程序/服务(或任何您想调用的名称)来管理热插拔事件,包括固件请求。在&lt;android&gt;/system/core/init/devices.c 中,有两个#defines 指定了将检查固件的位置:

    #define FIRMWARE_DIR1   "/etc/firmware"
    #define FIRMWARE_DIR2   "/vendor/firmware"
    

    在我最初构建 ICS 文件系统时,/etc/firmware 不存在(并且 etc 目录似乎是在引导/初始化时创建的符号链接)。我必须在 NFS 挂载的 rootfs 上放置固件的目录是 &lt;mount point&gt;/system/etc/firmware

    完成此操作后,来自我的模块的 request_firmware() 调用成功完成。

    【讨论】:

      【解决方案2】:

      我的固件也有类似的问题:down3.bin
      (之前,我已经将我的模块 "io_ti.ko" 插入到 # insmod 当然)

      当我将我的设备(USB-RS232 转换器、Digi International EdgeportTI1 端口适配器)插入我的 Android 平板电脑(Samsung Galaxy Tab 2)时,他找不到他在“linux android 改编目录”中的固件。 所以,和你一样,我试着把我的"down3.bin" 放在:

      /lib/firmware
      /etc/firmware
      /system/lib/modules
      /system/lib/firmware
      /system/etc
      

      with :# dmesg 我仍然有错误:

      <6>[00000.00000] io_ti 1-1:1.0 : Edgeport TI 1 port adapter converter detected
      <6>[00000.00000] Failed to load image "edgeport/down3.bin" err-2
      <6>[00000.00000] io_ti:probe of 1-1:1.0 failed with error -5
      
      err -2 = [ENOENT] = No such file or directory.
      

      事实上,就像你提到的:

      &lt;android&gt;/system/core/init/devices.c 中有两个#defines 指定将检查固件的位置:

      #define FIRMWARE_DIR1   "/etc/firmware"
      #define FIRMWARE_DIR2   "/vendor/firmware"
      

      - 所以你必须把你的固件放在这些目录之一。它 希望对我有用。


      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • OP 在没有 udev 的 Android 设备上工作。 Android 的 init 进程处理 uevents。
        猜你喜欢
        • 2017-06-06
        • 2015-03-31
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 2018-03-19
        • 1970-01-01
        • 2020-11-08
        相关资源
        最近更新 更多