12.7 Linux设备驱动的固件加载
一个外设的运行可能依赖于固件,如某公司的WiFi 模块,在启动前需要加载固件。传统的设备驱动将固件的二进制码作为一个数组直接编译进目标代码,在 Linux 2.6 中,有一套成熟的固件加载流程。
首先,申请固件的驱动程序发起如下请求:
linux/firmware.h
int request_firmware(const struct firmware **fw, const char *name, struct device *device);
fw: 用于保存申请到的固件
name: 固件名
device:申请固件的设备的结构体指针
发起这个调用后,内核的udevd 会配合将固件通过对应的sysfs 结点写入内核。之后内核将收到的firmware 写入外设,最后通过如下API 释放请求:
void release_firmware(const struct firmware *fw);
一个典型的例子drivers/media/video/cx25840/cx25840-firmware.c 的cx25840_loadfw()函数,如代码清单12.24 所示。
代码清单 12.24 Linux 设备驱动申请 firmware 的例子
#define FWDEV(x) &((x)->dev)
static int check_fw_load(struct i2c_client *client, int size)
{