Android韌體加載出錯(load failed with error -2)
阿新 • • 發佈:2019-02-19
在Android下移植一個降噪模組的驅動到另一個平臺,載入韌體的時候報錯
[ 137.659357] xxxxx 0-002c: Direct firmware load failed with error -2
[ 137.665773] xxxxx 0-002c: Falling back to user helper
檢視-2代表的錯誤碼可知,-2代表找不到檔案,可是檔案的確在/system/lib/firmware下,為什麼找不到呢?
include/uapi/asm-generic/errno-base.h
#define EPERM 1 /* Operation not permitted */ #define ENOENT 2 /* No such file or directory */ #define ESRCH 3 /* No such process */ #define EINTR 4 /* Interrupted system call */ #define EIO 5 /* I/O error */ #define ENXIO 6 /* No such device or address */ #define E2BIG 7 /* Argument list too long */ #define ENOEXEC 8 /* Exec format error */ #define EBADF 9 /* Bad file number */ #define ECHILD 10 /* No child processes */ #define EAGAIN 11 /* Try again */ #define ENOMEM 12 /* Out of memory */ #define EACCES 13 /* Permission denied */ #define EFAULT 14 /* Bad address */ #define ENOTBLK 15 /* Block device required */ #define EBUSY 16 /* Device or resource busy */ #define EEXIST 17 /* File exists */ #define EXDEV 18 /* Cross-device link */ #define ENODEV 19 /* No such device */ #define ENOTDIR 20 /* Not a directory */ #define EISDIR 21 /* Is a directory */ #define EINVAL 22 /* Invalid argument */ #define ENFILE 23 /* File table overflow */ #define EMFILE 24 /* Too many open files */ #define ENOTTY 25 /* Not a typewriter */ #define ETXTBSY 26 /* Text file busy */ #define EFBIG 27 /* File too large */ #define ENOSPC 28 /* No space left on device */ #define ESPIPE 29 /* Illegal seek */ #define EROFS 30 /* Read-only file system */ #define EMLINK 31 /* Too many links */ #define EPIPE 32 /* Broken pipe */ #define EDOM 33 /* Math argument out of domain of func */ #define ERANGE 34 /* Math result not representable */
找到driver/base/firmware_class.c檔案,可以看到
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");
原來是韌體的位置不對,在Android的檔案系統下,根目錄下並沒有lib資料夾啊,當然通過軟連結的方式實現韌體載入,在init.rc中將/system/lib/軟連結(symlink)到/lib。當然,直接修改原始碼,想從什麼路徑進行載入都行啊。還有一個路徑,fw_path_path就是讀取核心命令列(/proc/cmdline)指定的韌體路徑,將firmware_class.path=$CUSTOMIZED_PATH'新增到核心命令列中就行。其他Android版本的核心韌體路徑可參考http://blog.csdn.net/mike8825/article/details/51841871