linux firmware,使用firmware

我们在使用Ralink芯片的WiFi时,很多型号是需要在加载模块时也加载固件的,这样做是有好处的,一可以省成本(少了保存固件的存储芯片和生产烧录),二是解决硬件BUG(通过更新固件来解决批量硬件存在的严重BUG),三是功能升级。总之好处多多,怎么都可以挖掘到。

在Linux中关于固件常用到如下函数,其在include/linux/firmware.h声明,在drivers/base/firmware_class.c实现,相应的函数原型如下:static inline int request_firmware(const struct firmware **fw, const char *name, struct device *device) ;

static inline void release_firmware(const struct firmware *fw) ;

其中firmware结构体定义如下:struct firmware {

size_t size;

const u8 *data;

struct page **pages;

/* firmware loader private fields */

void *priv;

};

而相应的device结构体在include/linux/device.h中定义,我们等会只是构建一个临时的device,该部分在后期的内核模型中再说明,其使用device_initialize函数来初始化,在drivers/base/core.c中定义。 接下来上代码吧:#include

#include

#include

#define SLAM_TEST_FIRMWARE "rt73.bin"

static const struct firmware * fwp;

static struct device slam_device = {

.init_name = "slam0",

};

static void print_firmware_data(char * fw, int size)

{

u8 buf[size+1];

memcpy(buf, fw, size);

buf[size] = '\0';

printk("firmware data:%x\n", buf);

}

static __init int firmware_operate_init(void)

{

int ret = 0;

device_initialize(&slam_device);

ret = request_firmware(&fwp, SLAM_TEST_FIRMWARE, &slam_device);

if (ret) {

printk("Load firmware failed!\n");

return -1;

}

print_firmware_data(fwp->data, fwp->size);

release_firmware(fwp);

return 0;

}

static __exit void firmware_operate_exit(void)

{

printk("%s\n", __func__);

}

module_init(firmware_operate_init);

module_exit(firmware_operate_exit);

MODULE_AUTHOR("xinu");

MODULE_LICENSE("GPL");

MODULE_FIRMWARE(SLAM_TEST_FIRMWARE);

相应的Makefile文件内容如下:obj-m += firmware_operate_example.o

CUR_PATH:=$(shell pwd)

LINUX_KERNEL_PATH:=/home/xinu/linux-3.13.6

all:

make -C $(LINUX_KERNEL_PATH) M=$(CUR_PATH) modules

clean:

make -C $(LINUX_KERNEL_PATH) M=$(CUR_PATH) clean

对应的源码文件目录树如下:/home/xinu/xinu/linux_kernel_driver_l1/firmware_operate_example/

├── firmware_operate_example.c

└── Makefile

在源码里我读取并打印了rt73.bin的内容,具体请查看你的/lib/firmware目录,可换成你的目录里其他文件试试看。从源码里我们看到对固件操作很简单,其实现在只是涉及到读取固件,读完后还需要使用其来初始化对应芯片呢,这个可以找下Ralink的WiFi源码研究研究。

参考网址:

http://blog.csdn.net/xxxxxlllllxl/article/details/9391449

http://lxr.free-electrons.com/source/samples/firmware_class/firmware_sample_driver.c?v=2.6.30

http://blog.clanzx.net/2013/11/26/linux-firmware-load.html

http://lwn.net/Articles/198461/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值