天天看點

Linux環境下DNW工具的使用(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子產品檔案,如下圖所示:

Linux環境下DNW工具的使用(OK6410)

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

Linux環境下DNW工具的使用(OK6410)

   3.2 在另外一個終端輸入以下指令,下載下傳檔案:

   $ dnw /你要下載下傳的檔案路徑/檔案名

    下載下傳過程和結果如下:

Linux環境下DNW工具的使用(OK6410)

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

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

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

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

Linux環境下DNW工具的使用(OK6410)

  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

繼續閱讀