Dnw下載工具還是Linux下的好(For OK6410)


          一直在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模塊文件,如下圖所示:

     1

     加載該模塊到內核(注意:需要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連接成功,就等待你下載傳輸了。情況如下:

   2

   3.2 在另外一個終端輸入以下命令,下載文件:

   $ dnw /你要下載的文件路徑/文件名

    下載過程和結果如下:

   4

   到此為止,dnw的介紹結束,因為之前研究過Linux下的dnw使用,好長時間沒用了,現在寫此博文來記錄,方便以后回顧,同時也希望給新手一個指導。

   我現在在用dnw來下載裸機程序,但是因為好久沒用了,出現以前從來沒有遇到過的問題:

  1. 首先是出現“can not open /dev/secbulk0”,后來想想原來是dnw時沒有使用root權限,在后面又出現這個問題,我又重新編譯了一次secbulk驅動,這個問題解決了。

  2. 這次是沒有出現上面的問題了,但是新問題又出現了:在writing data…期間,寫到10%的時候就出現failed!,我試好多次都是這個問題。現在正在解決中。。。情況如下:

   3

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM