Linux驱动使用request_firmware固件子系统

背景

在使用外围模块器件时,经常有时候会进行固件的启动加载和升级,比如LCD,TP;之前的方式是把固件转换为十六进制放在代码的数组中,在需要加载固件时传入数组名即可;但是这种数组方式不够灵活,不方便后面的固件升级,也会导致内核镜像文件变大;最近发现还有一种高级的方式:使用request_firmware固件子系统,驱动在遇到需要加载固件时,使用request_firmware接口向用户空间请求文件数据。

驱动

Device Drivers  --->
	Generic Driver Options  ---> 
		[*] Select only drivers that don't need compile-time external firmware                                             
		[*] Prevent firmware from being built                                                                              
		{*} Userspace firmware loading support                                                                             
		[*]   Include in-kernel firmware blobs in kernel binary                                                            
		()    External firmware blobs to build into the kernel binary                                                      
		[*] Fallback user-helper invocation for firmware loading        	

代码

#if defined(CONFIG_FW_LOADER) || (defined(CONFIG_FW_LOADER_MODULE) && defined(MODULE))
int request_firmware(const struct firmware **fw, const char *name,
             struct device *device);
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));
int request_firmware_direct(const struct firmware **fw, const char *name,
                struct device *device);
int request_firmware_into_buf(const struct firmware **firmware_p,
    const char *name, struct device *device, void *buf, size_t size);

void release_firmware(const struct firmware *fw);

使用

在驱动中使用request_firmware方式,需要把驱动编译成ko模块,待跟文件系统挂载后加载模块,才能正常的加载固件;

固件需要放在跟文件系统的/lib/firmware下面,然后把文件路径传给name指针。

调试

# USB Support
    CONFIG_PACKAGE_kmod-usb-core=y
    CONFIG_PACKAGE_kmod-usb3=y

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,可以使用request_firmware函数来加载并使用固件文件。request_firmware函数的函数原型如下: ``` int request_firmware(const struct firmware **fw, const char *name, struct device *dev); ``` 其中,fw是返回的固件结构体指针,name是需要请求的固件文件名,dev是使用这个固件的设备结构体指针。 使用request_firmware函数的步骤如下: 1. 通过设备名获取设备结构体指针,如果不需要使用固件的设备可以传入NULL。 2. 调用request_firmware函数,传入固件文件名和设备结构体指针。 3. 如果request_firmware返回0,则表示固件文件加载成功,可以使用返回的固件结构体指针fw来访问固件数据。如果返回错误码,则表示固件文件加载失败。 4. 使用固件之后,需要通过release_firmware函数释放固件结构体占用的内存。 以下是一个示例代码: ``` #include <linux/firmware.h> #include <linux/device.h> struct device *dev; const struct firmware *fw; int ret; dev = device_get(&platform_bus_type, "my_device"); if (!dev) { printk(KERN_ERR "Failed to get device\n"); return -ENODEV; } ret = request_firmware(&fw, "my_firmware.bin", dev); if (ret) { printk(KERN_ERR "Failed to request firmware\n"); device_put(dev); return ret; } // 使用固件数据 ... release_firmware(fw); device_put(dev); ``` 注意,在使用request_firmware函数时,需要保证固件文件位于正确的位置。通常情况下,固件文件应该存放在/lib/firmware目录下。如果固件文件位于其他位置,需要在调用request_firmware函数之前将搜索路径添加到内核的firmware_class路径中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值