一直在Windows下開發,某些bug總是使我不能全心全意的信任Windows,從開發嵌入式開始,一直就想把開發環境轉移到Linux環境下,特别是下載下傳程式的時候,不過确實有Linux的開發環境,就拿下載下傳程式來說,Linux下的minicom和dnw真的是很好用,同時也可以學習源代碼。下面教你如何下載下傳、安裝、使用dnw。
1. dnw由兩部分構成:USB驅動和下載下傳工具,USB驅動便是secbulk檔案夾,下載下傳工具是DNW檔案夾
下載下傳位址:http://files.cnblogs.com/lixiaoming90/dnw_linux.rar
檔案名:DnwLinux.rar
2. 安裝dnw
解壓縮,之後會看到dnw_linux檔案夾,進入該檔案夾
$ cd dnw_linux
$ ls
$ /dnw /secbulk
2.1 首先修改、編譯和安裝驅動
進入secbulk檔案夾,輸入編譯指令,編譯成子產品。(我自己修改了Makefile,是以大家隻需make就可編譯,make clean 就可清除編譯。修改後的Makefile如下:
obj-m := secbulk.o
KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
rm -rf *.order *.symvers
在修改secbulk.c中代碼,将0x5432改為0x04e8(不同的flash要在那個表單中加入一些裝置相關的資訊類似ID号,在程式加載的時候自動讀取晶片内部ID和這個相比較,沒有注冊的裝置是不會被系統支援的,可以通過lsusb獲得idProduct和idVendor,需要在插上闆子,并準備下載下傳時此時裝置連上時lsusb,0x04e8:0x1234),代碼如下:
static struct usb_device_id secbulk_table[]= {
{ USB_DEVICE(0x04e8, 0x1234)},
{ }
};
至此,代碼修改完畢!
$ make
之後在檔案夾中會有secbulk.ko子產品檔案,如下圖所示:

加載該子產品到核心(注意:需要root權限)
$ sudo insmod secbulk.ko
加載後用dmesg指令可以看到子產品已經成功加載
[ 238.007970] secbulk:secbulk loaded
[ 238.009101] usbcore: registered new interface driver secbulk
常見問題: can not open /dev/secbulk0, 則表示該子產品沒有加載成功或者dnw沒有root權限
通過lsmod可以看看加載成功沒。
$ lsmod | grep secbulk
2.2 編譯和安裝dnw
進入dnw檔案夾
$ cd dnw
修改dnw.c,找到如下代碼處:
printf("Writing data...\n");
size_t remain_size = file_stat.st_size+10;
在其前面加上下面兩句:
/*****************************/
file_buffer [file_stat.st_size + 8] = sum & 0xff;
file_buffer [file_stat.st_size + 9] = sum >> 8;
/*****************************/
代碼修改完畢,像一般的程式一樣程式設計為可執行性檔案
$ gcc –o dnw dnw.c
可能會有一些警告,不過可以忽略。在dnw下生成dnw工具
将dnw複制到/bin目錄下,這樣就可以在任意檔案目錄下調用dnw指令。
溫馨技巧: 因為要用dnw的話,要確定secbulk驅動加載到核心,為了避免每次都要手動加載,是以修改/etc/init.d/rc.local檔案(root權限),在後面加上下面一句:
insmod /….你的secbulk.ko檔案目錄/secbulk.ko
儲存退出完事。
3. dnw運用
我用dnw的主要目的是用來下載下傳裸機程式,還有其他檔案,根本沒有Windows下的藍屏現象,dnw的用法也很簡單。
3.1 打開兩個終端,一個輸入minicom指令,打開序列槽調試,當開發闆加載uboot時按下PC上的空格鍵,使其停在下載下傳模式,輸入以下指令:
SMDK6410# dnw 0x50008000
此時終端列印以下資訊,說明USB連接配接成功,就等待你下載下傳傳輸了。情況如下:
3.2 在另外一個終端輸入以下指令,下載下傳檔案:
$ dnw /你要下載下傳的檔案路徑/檔案名
下載下傳過程和結果如下:
到此為止,dnw的介紹結束,因為之前研究過Linux下的dnw使用,好長時間沒用了,現在寫此博文來記錄,友善以後回顧,同時也希望給新手一個指導。
我現在在用dnw來下載下傳裸機程式,但是因為好久沒用了,出現以前從來沒有遇到過的問題:
1. 首先是出現“can not open /dev/secbulk0”,後來想想原來是dnw時沒有使用root權限,在後面又出現這個問題,我又重新編譯了一次secbulk驅動,這個問題解決了。
2. 這次是沒有出現上面的問題了,但是新問題又出現了:在writing data…期間,寫到10%的時候就出現failed!,我試好多次都是這個問題。現在正在解決中。。。情況如下:
3.3 下載下傳到NandFlash
現在你的程式已經下載下傳到記憶體當中了,如果你想在記憶體中運作你的程式,隻需要輸入下面一句指令即可:
SMDK6410# go 0x50008000
如果你想下載下傳到NandFlash中(好處就是掉電了程式還是在NandFlash當中,而且比較原味,可以測試一下你寫的啟動代碼)
我的步驟如下:
(1)首先制作燒寫Uboot的SD卡,具體在飛淩使用者手冊中有(注意:SD卡中除了燒寫外,裡面一樣檔案都沒有,我之前一直搞不明白,現在終于清楚了)
(2)設定開發闆為SD卡啟動,啟動後按PC上的空格鍵停在Uboot下載下傳調試界面,下面的就跟上面的步驟一樣,将程式通過USB燒寫到記憶體中
(3)将NandFlash中的0~1M的空間擦除,再把下到記憶體位址中的程式燒寫到NandFlash的0~100000空間中(uboot中預設的是16進制)
SMDK6410# nand erase 0 100000
SMDK6410# nand write.e 0x50008000 0 100000
(4)設定開發闆為NandFlash啟動即可。
目前,已經調試成功了,原來是開發闆中的uboot好久沒用,可能出現了問題,現在重新燒寫一次,成功下載下傳!情況就是上面那一張圖了,終于又能在Linux下開發程式了。
原文:http://www.cnblogs.com/lixiaoming90/archive/2013/03/21/2973837.html