最近在研究OK6410开发板;但windows下的rvds真是不好用,烧写程序到开发板还需要dnw,而这各种软件都要在win下搞,很是憋屈,而且64位的win7还出各种问题。我要移植的是Linux系统呢,咋的就不能在linux完成所有步骤呢?
昨晚到处查找资料,总算找到了dnw可在linux成功运行的消息;
又遇到了linux下的串口连接终端minicom和kermit; 不断折腾和测试,总算搞定了dnw和usb下载的问题;后面的路就开阔多了!记下各种资源和心得,和大家分享。
可以网上搜索dnw4linux,下载QQ2440版本的源码,或者直接下载我整理后的,可以适用于OK6410及类似开发板的dnw源码和驱动包;
详情查看: https://github.com/Qunero/dnw4linux 该页面的说明,或者直接下载压缩包:
https://github.com/Qunero/dnw4linux/downloads
直接查看该软件包的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<[email protected]>;
驱动安装好后,在用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软件准备就绪;
dnw2使用libusb来实现对该USB的操控,但是不如dnw来的直接:/dev/secbulk0 ,前者更加系统但是使用传输数据的时候经常出现如下错误:
Target usb device found!
Cannot claim interface: Device or resource busy
后续有时间详细分析以下在处理;
参考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
在开发板处于接收数据的状态下,在该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都已成功完成;