request_firmware 的用法,struct firmware,内核,固件,usb

【转帖请注明出处:blog.csdn.net/lanmanck】

 

网上有许多说明,ldd3也有:http://www.deansys.com/doc/ldd3/ch14s08.html。

对于刚使用的人来说,上面都说的笼统,说了等于没说,我总结一下:

1、request_firmware在内核使用,需要文件系统支持,就是说,启动的时候如果在驱动里面的probe函数调用request_firmware ,那么系统将等待30s左右,因为文件系统还没有挂载,当然找不到固件了,所以最好在中断里面启动tasklet,然后request_firmware 。如果不想等待,就用request_firmware_nowait,好像是这样写的。

 

2、那么用户层怎么用?这是初学者最易迷惑的,网上的基本都没有讲到。

实际上这个分x86和嵌入式,比如arm,平台。x86的用到了udev,我没有试。我说说arm平台的,用的是busybox的mdev。

比如你要请求固件 fw.hex,那么必须在文件系统中导出环境变量,比如 export FIRMWARE=/lib/firmware,而且目录/lib/firmware不能少,因为busybox要用到。然后把固件fw.hex放到/lib/firmware目录下即可。内核request_firmware的时候,busybox就知道去FIRMWARE找了。这实际上用到了mdev的热插拔功能:

echo /sbin/mdev > /proc/sys/kernel/hotplug

 

3、对linux来讲,所谓的固件什么也不是,他只是按fopen()返回二进制文件给你,看看busybox的处理就知道了。所以你的文件随便定义,比如一个mp3文件,你也可以称为固件:request_firmware("xxx.mp3"),那么你文件系统里面也要有这个xxx.mp3文件,只不过系统给你返回二进制数据,具体的处理要在内核进行。

 

讲到这大家应该都会用了,不对请指正。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`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` 函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值