Ubuntu12.10 使用DNW傳數據 進行ARM開發板燒寫


Part1前言

最近在研究OK6410開發板;但windows下的rvds真是不好用,燒寫程序到開發板還需要dnw,而這各種軟件都要在win下搞,很是憋屈,而且64位的win7還出各種問題。我要移植的是Linux系統呢,咋的就不能在linux完成所有步驟呢?

昨晚到處查找資料,總算找到了dnw可在linux成功運行的消息;

又遇到了linux下的串口連接終端minicom和kermit; 不斷折騰和測試,總算搞定了dnw和usb下載的問題;后面的路就開闊多了!記下各種資源和心得,和大家分享。

 

Part2工具准備

2.1 串口終端kermit

這個直接命令安裝就可以了,另外需要簡單熟悉一下他的配置和兩種模式;

2.1.1 安裝kermit

sudo apt-get install ckermit

2.1.2 配置kermit

建立配置文件 ~/.kermrc, 內容如下:

#USB轉串口,所以設備為/dev/ttyUSB0
SET LINE /dev/ttyUSB0
#設置波特率
#set speed 115200

#關閉通信監視,必須關閉才能看到開發板返回的信息
set carrier-watch off

2.1.3 使用kermit連接開發板

在連接好USB轉串口后,該USB能夠被Linux直接識別,對應設備文件為:/dev/ttyUSB0 ;

這里需要注意的是: 先連接好USB串口和開發板,然后再打開配置好的kermit終端;否則kermit會讀取配置文件先占用和鎖定了/dev/ttyUSB0, 那么再插上USB串口后,該設備分配的設備文件就成了/dev/ttyUSB1, 從事出現不匹配,在終端中無法控制開發板的情況;(不過這種情況也很好處理,就是在kermit中設置新的連接對象,如下:)

set line /dev/ttyUSB1 #這個根據實際情況設置,可以通過 ls /dev/ttyUSB* 的方式查找到名字

 2.1.4 kermit的兩種模式

進入后默認進入命令模式,可以執行很多命令,包括連接開發板的connect命令:

C-Kermit 9.0.302 OPEN SOURCE:, 20 Aug 2011, for Linux+SSL+KRB5
 Copyright (C) 1985, 2011,
  Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/media/GoldenResources/arm/src/dnw4linux/) C-Kermit>? Command, one of the following:
 add           check         disable       getc          learn         mmove         push          return        statistics    type
 answer        chmod         do            getok         LICENSE       move          pwd           rlogin        status        undeclare
 apc           clear         echo          goto          lineout       msend         quit          rmdir         stop          undefine
 array         close         edit          grep          log           msleep        read          run           SUPPORT       version
 ask           connect       enable        head          login         open          receive       screen        suspend       void
 askq          copy          end           hangup        logout        orientation   redial        script        switch        wait
 assign        date          evaluate      HELP          lookup        output        redirect      send          tail          where
 associate     debug         exit          http          mail          pause         redo          server        take          while
 authenticate  decrement     file          if            manual        pdial         reget         set           telnet        who
 back          define        finish        increment     message       pipe          remote        shift         touch         write
 browse        delete        for           input         minput        print         remove        show          trace         xecho
 bye           dial          ftp           INTRO         mget          pty           rename        space         translate     xmessage
 cd            directory     get           kcd           mkdir         purge         resend        ssh           transmit
or a macro name ("do ?" for a list) or one of the tokens: ! # ( . ; : < @ ^ { 

隨時出入 問號 ? 可以獲得幫助和代碼補全; 在輸入connect命令連接開發板后(在這之前需要配置連接對象,可以用命令 set line /dev/ttyUSB0 的方式完成),進入到連接后的開發板模式,顯示的為開發板反饋回來的信息,可以控制整個開發板,要返回原來的命令模式使用快捷鍵 Ctrl+ \ , 然后 按C 字母返回;

 

2.2 DNW和USB驅動准備

2.2.1 下載源碼

可以網上搜索dnw4linux,下載QQ2440版本的源碼,或者直接下載我整理后的,可以適用於OK6410及類似開發板的dnw源碼和驅動包;

詳情查看: https://github.com/Qunero/dnw4linux 該頁面的說明,或者直接下載壓縮包:

https://github.com/Qunero/dnw4linux/downloads

2.2.2 編譯安裝和使用

直接查看該軟件包的README,按步執行即可:

1、源碼說明:
    本源代碼收集自網絡,經過整理和加入宏定義,使其適用於OK6410開發板;對
    源碼進行了適當的注釋和錯誤糾正;同樣以GPL協議發布;

2、使用說明:
2.1 編譯
    直接在解壓后的目錄中make即可;然后在對應的子目錄中可以找到編譯好的文件;
    更方便的做法:make install 會直接將相關文件編譯好,然后放到當前目錄下,
    編譯好的文件為:
    dnw     ---     用於傳輸數據的軟件,用法: dnw filename
    secbulk.ko  --- 識別下載用USB的驅動; 用法: sudo insmod secbulk.ko

2.2 自動化
    在編譯成功后,完成下列步驟方面以后使用:
    2.2.1 將dnw放到系統路徑: sudo cp dnw /usr/sbin/ 
    2.2.2 將secbulk.ko驅動設為自動加載:
        先在住目錄建立mydriver目錄:mkdir ~/mydriver 
        將驅動放入自定義mydriver中:cp secbulk.ko ~/mydriver/
        修改/etc/rc.d/rc.local文件,末尾加入: sudo insmod $HOME/secbulk.ko
        注意: 將上面的$HOME替換成實際的絕對路徑,比如: /home/qulory 
2.3 清理
    直接執行make clean, 讓你的源碼目錄干干凈凈;
2.4 使用 
    注意,當前編譯好的dnw在32位linux可用,但是secbulk.ko驅動文件需要自己編譯
    必須同當前使用的內核的版本一致,內核版本升級后也需要重新編譯;

3、移植幫助:
要成功移植到類似的開發板,需要以下2步:
3.1 驅動處理:
    進入secbulk_driver子目錄,修改文件secbulk.c中的關於DOWNLOAD_USB_ID_MAJOR
    和DOWNLOAD_USB_ID_MINOR的宏定義,讓其與你的usb對應,可以通過lsusb命令查看
    獲得該id的信息;
3.2 dnw下載地址的處理:
    進入dnw_src目錄,修改dnw.c文件中DOWNLOAD_ADDR的定義,將其設為你的開發板
    的下載地址;

3.3 有疑問可以聯系 Qulory<Quner612@qq.com>;

驅動安裝好后,在用kermit連接好開發板,然后重啟開發板,讓其停留在u-boot階段;然后在kermit中輸入dnw 50008000, 這個地址要和dnw軟件編譯時指定的下載地址一致,然后功過lsusb命令可以檢查到該usb線,如3.2 中所示;並且在正常執行了 : sudo insmod secbulk.ko 后,可以檢查到如下信息:

less /var/log/kern.log
Nov 16 13:21:21 qunengrong-Studio-1450 kernel: [139476.958530] secbulk:secbulk probing...
Nov 16 13:21:21 qunengrong-Studio-1450 kernel: [139476.958534] secbulk:bulk out endpoint found!

至此驅動安裝和dnw軟件准備就緒;

2.2.3 關於dnw2

dnw2使用libusb來實現對該USB的操控,但是不如dnw來的直接:/dev/secbulk0 ,前者更加系統但是使用傳輸數據的時候經常出現如下錯誤:

Target usb device found!
Cannot claim interface: Device or resource busy

后續有時間詳細分析以下在處理;

 

2.3 minicom終端的使用

minicom是基於字符菜單的,不太好用,而且經常快捷鍵不響應和出現亂碼;不過附加使用方法如下:

2.3.1 使用minicom -s 啟動並配置

使用sudo啟動:

sudo minicom -s

主要設置好串口,如下藍色部分:

                                                                             
            +-----[configuration]------+                                     
            | Filenames and paths      |                                     
            | File transfer protocols  |                                     
            | Serial port setup        |                                     
            | Modem and dialing        |                                     
            | Screen and keyboard      |
            | Save setup as dfl        |
            | Save setup as..          |
            | Exit                     |
            | Exit from Minicom        |
            +--------------------------+

在該菜單中輸入A,修改串口設備為 /dev/ttyUSB0,如下:

    +-----------------------------------------------------------------------+
    | A -    Serial Device      : /dev/ttyUSB0                              |
    | B - Lockfile Location     : /var/lock                                 |
    | C -   Callin Program      :                                           |
    | D -  Callout Program      :                                           |
    | E -    Bps/Par/Bits       : 115200 8N1                                |
    | F - Hardware Flow Control : Yes                                       |
    | G - Software Flow Control : No                                        |
    |                                                                       |
    |    Change which setting?                                              |
    +-----------------------------------------------------------------------+
 

退出並保存,然后可以開始使用了:

Welcome to minicom 2.6.1

OPTIONS: I18n 
Compiled on May  1 2012, 10:55:27.
Port /dev/ttyUSB0

Press CTRL-A Z for help on special keys


exit not allowed from main input shell.
SMDK6410 #

 

Part3燒寫測試

3.1 連接好USB串口並打開kermit終端

參考2.1.3 中的說明,連接好開發板, 啟動kermit后,輸入connect命令, 開始在kermit中控制開發板; 讓其停留在u-boot的命令行,選擇2 進行從USB燒寫系統的菜單,然后選擇1燒寫u-boot;

U-Boot 1.1.6 (Nov 16 2012 - 12:23:47) for SMDK6410

****************************************
**    u-boot 1.1.6                    **
**    Updated for OK6410  TE6410 Board  **
**    Version (2012-09-23)          **
**    OEM: Forlinx Embedded           **
**    Web: http://www.witech.com.cn   **
****************************************

CPU:     S3C6410 @532MHz
         Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) 
Board:   SMDK6410
DRAM:    256 MB
Flash:   0 kB
NAND:    2048 MB 
In:      serial
Out:     serial
Err:     serial
Hit any key to stop autoboot:  0 

###################### User Menu for OK6410#####################
[1] Format the nand flash
[2] Burn image from USB
[3] configure the lcd size
[4] Boot the system
[5] Reboot the u-boot
[6] Exit to command line
-----------------------------Select---------------------------------
Enter your Selection:2

##### Select the fuction #####
[1] Flash u-boot
[2] Flash kernel
[3] Flash system
[4] Exit
Enter your Selection:1

NAND erase: device 0 offset 0x0, size 0x200000
Erasing at 0x180000 -- 100% complete.
OK
Insert a OTG cable into the connector!
OTG cable Connected!
Now, Waiting for DNW to transmit data
 

 

3.2 連接好USB數據線並使用DWN傳數據

在開發板處於接收數據的狀態下,在該USB插到linux系統上就能夠識別出該USB的信息,也只有這個時候才能識別到,如下,注意藍色部分(該USB的設備ID,關系到第二部分的驅動程序的對應內容):

$lsusb 
Bus 001 Device 003: ID 0c45:6407 Microdia 
Bus 002 Device 041: ID 04e8:1234 Samsung Electronics Co., Ltd 
Bus 004 Device 002: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)
Bus 008 Device 023: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 003: ID 413c:8161 Dell Computer Corp. Integrated Keyboard
Bus 004 Device 004: ID 413c:8162 Dell Computer Corp. Integrated Touchpad [Synaptics]

在另一個終端中用dnw寫數據,最后狀態提示傳輸成功:

$sudo dnw u-boot.bin
file name : u-boot.bin
file size : 212992 bytes
Writing data...
 100     213002 bytes !OK

 

在kermit中觀察狀態,成功寫入數據:

##### Select the fuction #####
[1] Flash u-boot
[2] Flash kernel
[3] Flash system
[4] Exit
Enter your Selection:1

NAND erase: device 0 offset 0x0, size 0x200000
Erasing at 0x180000 -- 100% complete.
OK
Insert a OTG cable into the connector!
OTG cable Connected!
Now, Waiting for DNW to transmit data
Download Done!! Download Address: 0x50008000, Download Filesize:0x34000
Checksum is being calculated.
Checksum O.K.

NAND write: device 0 offset 0x0, size 0x200000
 1032192 bytes written: OK

##### Select the fuction #####
[1] Flash u-boot
[2] Flash kernel
[3] Flash system
[4] Exit
Enter your Selection:

然后選擇4退出燒寫,然后重啟u-boot看是否可用:

##### Select the fuction #####
[1] Flash u-boot
[2] Flash kernel
[3] Flash system
[4] Exit
Enter your Selection:4

###################### User Menu for OK6410#####################
[1] Format the nand flash
[2] Burn image from USB
[3] configure the lcd size
[4] Boot the system
[5] Reboot the u-boot
[6] Exit to command line
-----------------------------Select---------------------------------
Enter your Selection:5
reset... 

KK

U-Boot 1.1.6 (Nov 16 2012 - 12:23:47) for SMDK6410

****************************************
**    u-boot 1.1.6                    **
**    Updated for OK6410  TE6410 Board  **
**    Version (2012-09-23)          **
**    OEM: Forlinx Embedded           **
**    Web: http://www.witech.com.cn   **
****************************************

CPU:     S3C6410 @532MHz
         Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) 
Board:   SMDK6410
DRAM:    256 MB
Flash:   0 kB
NAND:    2048 MB 
In:      serial
Out:     serial
Err:     serial
Hit any key to stop autoboot: 0 

NAND read: device 0 offset 0x200000, size 0x500000
s3c-nand: 1 bit(s) error detected, corrected successfully
 5242880 bytes read: OK
Boot with zImage

Starting kernel ...

至此,說明重啟進入u-boot已經成功,也就是剛剛我們的ubuntu下dnw傳輸數據和燒寫u-boot都已成功完成;

更多的測試,歡迎關注。


免責聲明!

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



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