Ubuntu 12.10 使用DNW传数据 进行ARM开发板烧写

Ubuntu12.10 使用DNW传数据 进行ARM开发板烧写


原文地址: http://www.cnblogs.com/QuLory/archive/2012/11/16/2773389.html

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;
复制代码

驱动安装好后,在用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都已成功完成;

更多的测试,欢迎关注。


你可能感兴趣的:(arm-ubuntu)