1. 程式人生 > >Android韌體加載出錯(load failed with error -2)

Android韌體加載出錯(load failed with error -2)

         在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