Linux内核模块使用固件程序时,正确的做法是使用request_firmware_nowait()一类固件接口来获取固件数据。
在使用firmware前,必须对内核做如下配置。
Device Drivers —>
Generic Driver Options —>
<*> Userspace firmware loading support
否则会出现: Unknown symbol release_firmware 和: Unknown symbol request_firmware 的错误。
下面是request_firmware_nowait函数的原型
int
request_firmware_nowait(
struct module *module, bool uevent,
const char *name, struct device *device, gfp_t gfp, void *context,
void (*cont)(const struct firmware *fw, void *context))
如果一切正常,request_firmware_nowait 开始固件加载过程并返回0。随后会调用驱动程序的回调函数cont并将保存有firmware的fw作为函数cont的参数。
如果找不到对应位置的文件,过了一段时间后(默认60秒),将用fw=NULL作为参数调用cont。
其中struct firmware定义如下:
struct firmware {
size_t size;
u8 *data;
};
这个结构包含实际的固件,它现在可被下载到设备中。但是请注意:在发送它到硬件之前,必须检查这个文件以确保它是正确的固件映象(设备固件常常包含标识字符串、校验和等等)
跟踪request_firmware_nowait的实现过程:
request_firmware_nowait