固件升级相关接触与request_firmware

本文探讨了固件升级的几种方法,重点介绍了Linux内核中的request_firmware函数,该函数用于请求用户空间提供固件映像。通过request_firmware,设备驱动可以与用户空间交互,实现固件的加载和验证。文章提到了固件加载的异步方式request_firmware_nowait,并解释了固件子系统如何利用sysfs和热插拔机制协同工作。最后,强调未经制造商许可不应发布设备固件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

产品在送样调试后,测试发现的问题需要解决和优化,可以调试单样品,也可以整机调试(整机升级固件)。

作为一个驱动作者, 你可能发现你面对一个设备必须在它能支持工作前下载固件到它里面. 硬件市场的许多地方的竞争是如此得强烈, 以至于甚至一点用作设备控制固件的 EEPROM 的成本制造商都不愿意花费. 因此固件发布在随硬件一起的一张 CD 上, 并且操作系统负责传送固件到设备自身.

我不清楚有多少种固件升级方法,接触的几个是 *.h、*.i、*.bin、*.img 等。前两个放入驱动中,后两者提供接口由应用层调用执行(不知是否正确)。

有人说高通平台采用img方式,去了解了一下,发现此乃较严谨的商业做法趋向。

前两种的思路大致如下:

你可能想解决固件问题使用这样的一个声明

static char my_firmware[] = { 0x34, 0x78, 0xa4, ... }; 
但是, 这个方法几乎肯定是一个错误. 将固件编码到一个驱动扩大了驱动的代码, 使固件升级困难, 并且非常可能产生许可问题. 供应商不可能已经发布固件映象在 GPL 之下, 因此和 GPL-许可的代码混合常常是一个错误. 为此, 包含内嵌固件的驱动不可能被接受到主流内核或者被 Linux 发布者包含.


后两者在实际中得到了大力赏识和“正道”之称,便

`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、付费专栏及课程。

余额充值