一直在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下開發程序了。