request_firmware_nowait和request_firmware的区别以及各自的用法
时间: 2024-02-06 12:03:54 浏览: 31
`request_firmware_nowait` 和 `request_firmware` 都是 Linux 内核中的函数,用于请求加载固件文件。它们的主要区别在于是否使用异步方式加载固件:
- `request_firmware_nowait` 函数使用异步方式加载固件,即请求后立即返回,固件加载完成后会通过回调函数通知调用者。这种方式适用于不需要等待固件加载完成就可以继续执行的场景。
- `request_firmware` 函数使用同步方式加载固件,即请求后会一直等待固件加载完成后才会返回结果。这种方式适用于需要等待固件加载完成后才能继续执行的场景。
它们的用法如下:
```c
int request_firmware_nowait(struct firmware **firmware_p, const char *name,
struct device *device, gfp_t gfp_flags,
void *context, size_t size,
void (*cont)(const struct firmware *fw, void *context));
int request_firmware(struct firmware **firmware_p, const char *name,
struct device *device);
```
其中,`firmware_p` 是输出参数,用于获取加载后的固件数据;`name` 是固件文件名;`device` 是请求加载固件的设备;`gfp_flags` 是内存分配标志;`context` 是传递给回调函数的上下文参数;`size` 是固件数据的长度(仅在异步方式下有效);`cont` 是回调函数,用于在异步方式下通知固件加载完成。
需要注意的是,请求加载固件文件需要在 Linux 内核中的进程上下文中进行,因此在中断上下文中无法使用这两个函数。如果需要在中断处理程序中加载固件,可以使用 `request_firmware_direct` 函数。