這個主題主要說的就是韌體檔案的讀寫,它為我們提供了乙個把使用者檔案讀入核心的機制。
前面的例項**在實際的一些驅動中可能很少見到,但這一節所說的東西就比較實用了。
首先說一下韌體檔案。
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 結構體中的部分成員我們是一目了然的,主要是來看看有疑惑的幾點 ...