裝置模型7之韌體開發(例項)

2021-06-16 20:00:58 字數 3296 閱讀 6248

這個主題主要說的就是韌體檔案的讀寫,它為我們提供了乙個把使用者檔案讀入核心的機制。

前面的例項**在實際的一些驅動中可能很少見到,但這一節所說的東西就比較實用了。

首先說一下韌體檔案。

ldd3:

件到它裡面. 硬體市場的許多地方的競爭是如此得強烈, 以至於甚至一點用作

裝置控制韌體的 eeprom 的成本製造商都不願意花費. 因此韌體發布在隨硬體

一起的一張 cd 上,並且作業系統負責傳送韌體到裝置自身.

這裡的意思是韌體檔案是為了節省成本,當然我覺得韌體檔案也將底了公升級難度。

韌體檔案的格式:

有很多種——

trx\usr\bin等

韌體檔案儲存會因為

cpu的不同,

資料儲存的方式分為

big—

endian

和little

—endian

我們看bin

bin是c1~20

子公司linksys

公司無線路由器韌體檔案所採用的格式。檔案有

60位元組頭部,前32

位元組是linksys

公司無線路由器韌體檔案

bin格式特有的頭部,後

28位元組是

t r x

格式檔案頭部。

bin有兩個頭,

先看前32位

struct bin_header ;

後28位

trx

是cisco

公司無線路由器

wrt54g

系列韌體檔案所採用的格式。檔案格式開頭是

2 8位元組的頭部,下面是資料部分。檔案頭部資料結構:

struct trx_header ;

這一段我真是在班門弄斧。我根據這個頭說明做乙個

test.bin

test.bin(test.bin

是大端,

csc32

是瞎寫的)

我的bin:

如果是小端cpu的linux下用hexdump看,資料是反的。

你可以在

linux

的firmware

下看到很多韌體檔案,我不知道為什麼加

.ihex。

還要說一下mdev

韌體檔案的讀寫要用uevent,具體我就不分析了,mdev的話要在/lib下

#cd /lib

#mkdir firmware

把test.bin放入/lib/firmware下。不然找不到檔案。用udev的兄弟自己解決吧!

對之前my_dvr.c中的修改 …

+#include

#include

"my_bus.h"

#include

"common.h"

+#define test_bin "test1.bin"

module_author("ww***xll");

module_license("dual bsd/gpl");

+module_firmware(test_bin);

//把special_init改為下面的

//特殊器件初始化

static

int special_init(struct device *dev)

size = (binp->size > 60) ?size = 60 : binp->size;

memcpy(bin_data, binp->data,size);

//我只是列印,*如果要把資料放入到暫存器要考慮大小端的問題

my_debug("bin_header:\nproduct: %c%c%c%c\ndate: %d-%d-%d\nversion:%d.%d.%d\nmagic: %c%c%c%c\n",\

bin_data[0],bin_data[1],bin_data[2],bin_data[3],\

bin_data[8],bin_data[9],bin_data[10],\

bin_data[11],bin_data[12],bin_data[13],\

bin_data[14],bin_data[15],bin_data[16],bin_data[17]\

);my_debug("trx_header:\nmagic: %c%c%c%c\nlen: %ld\ncsc32: %lx\nversion:%lx\noffsets1: %ld\noffsets2: %ld\noffsets3: %ld\n", \

bin_data[32],bin_data[33],bin_data[34],bin_data[35], \

(unsigned

long)(bin_data[36] << 24 | bin_data[37]<< 16 | bin_data[38] << 8 | bin_data[39]),\

(unsigned

long)(bin_data[40]<< 24 | bin_data[41] << 16 | bin_data[42] << 8 | bin_data[43]),\

(unsigned

long)(bin_data[44]<< 24 | bin_data[45] << 16 | bin_data[46] << 8 |bin_data[47]),\

(unsigned

long)(bin_data[48]<< 24 | bin_data[49] << 16 | bin_data[50] << 8 |bin_data[51]),\

(unsigned

long)(bin_data[52]<< 24 | bin_data[53] << 16 | bin_data[54] << 8 |bin_data[55]),\

(unsigned

long)(bin_data[56]<< 24 | bin_data[57] << 16 | bin_data[58] << 8 |bin_data[59]));

release_firmware(binp);

out_init:

returnretval;除錯

#insmod my_bus.ko

#insmod my_dvr.ko

#insmod my_dvc.ko

#dmesg

看到最後有這些資訊

下期是裝置模型的最後一篇——電源管理

寫完之後,我就開始寫一些實際的驅動。

Linux驅動開發之字元裝置驅動例項

1 驅動標頭檔案mem dev.h ifndef memdev h define memdev h ifndef memdev major define memdev major 238 預設的mem的主裝置號 endif ifndef memdev nr devs define memdev nr...

misc裝置驅動模型及例項解析

1 misc裝置驅動模型 本節我們來看一下misc裝置驅動模型的有關內容,首先是看看它的裝置結構體,定義在include linux miscdevice.h中 cpp view plain copy struct miscdevice 結構體中的部分成員我們是一目了然的,主要是來看看有疑惑的幾點 ...

misc裝置驅動模型及例項解析

1 misc裝置驅動模型 本節我們來看一下misc裝置驅動模型的有關內容,首先是看看它的裝置結構體,定義在include linux miscdevice.h中 cpp view plain copy struct miscdevice 結構體中的部分成員我們是一目了然的,主要是來看看有疑惑的幾點 ...