轉:http://blog.csdn.net/zhengmeifu/article/details/8837930
Linux下編譯記錄:
編譯PC端USB驅動和寫入工具
dnw_linux.tgz壓縮包文件結構如下
dnw_linux/
dnw_linux/secbulk/
dnw_linux/secbulk/Makefile
dnw_linux/secbulk/secbulk.c
dnw_linux/dnw/
dnw_linux/dnw/dnw.c
其中secbulk.c是PC端USB驅動, dnw.c是寫入工具
編譯驅動之前先修改secbulk.c
找到#define BULKOUT_BUFFER_SIZE
修改為
#define BULKOUT_BUFFER_SIZE 512
找到
static struct usb_device_id secbulk_table[]= {
{ USB_DEVICE(0x04e8, 0x1234)},
{ }
};
修改為上面的樣子
接下來編譯
$cd secbulk
$make -C /lib/modules/`uname -r`/build M=`pwd` modules
加載編譯好的驅動
$sudo insmod ./secbulk.ko
注意,每次下載前都需要加載驅動,或者可以設置為開機自動加載
Ubuntu中,假設驅動文件在/opt/dnw_linux/secbulk/
則修改/etc/rc.d/rc.local文件,末尾加入
sudo insmod /opt/dnw_linux/secbulk/secbulk.ko
即完成開機自動加載驅動模塊
接下來編譯dnw寫入工具
先打開dnw.c修改
找到
printf("Writing data...\n");
size_t remain_size = file_stat.st_size+10;
size_t block_size = remain_size / 100;
size_t writed = 0;
在它前面加上2行代碼,如下:
file_buffer [file_stat.st_size + 8] = sum & 0xff;
file_buffer [file_stat.st_size + 9] = sum >> 8;
printf("Writing data...\n");
size_t remain_size = file_stat.st_size+10;
size_t block_size = remain_size / 100;
size_t writed = 0;
編譯dnw
$gcc -o dnw dnw.c
編譯成功后生成可執行dnw
使用DNW下載
啟動開發板,進入minicom,並將開發板和PC用USB電纜連接,此時用dmesg命令可以看到secbulk驅動加載:
[ 283.677772] usb 1-1: new full speed USB device using uhci_hcd and address 2
[ 284.084835] usb 1-1: configuration #1 chosen from 1 choice
[ 284.140430] secbulk:secbulk probing...
[ 284.140482] secbulk:bulk out endpoint found!
說明驅動可以使用
重起開發板,別進linux系統,按任意鍵進入uboot界面,
輸入
dnw 50008000
當出現“USB host is connected. Waiting a download.”時,
在PC端Linux上用dnw工具寫入要下載的文件,例如我要寫入/tmp/zImage
$./dnw /tmp/zImage
寫入完成后提示成功
100% 312349 bytes OK
至此,dnw在linux下使用一切正常
dnw下載地址:
https://github.com/Qunero/dnw4linux