基于Ubuntu系统的Tiny4412使用dnw下载程序

下载工具链接:http://download.csdn.net/detail/jzxcumt/9350931

使用方法:

        将Tiny4412的USB线、串口线与电脑连接,在win7+虚拟机Ubuntu的环境下,在win7环境中用驱动精灵装上串口的驱动,在虚拟机中应该就能检测到串口,我这里采用的是USB转串口驱动,在Ubuntu中用lsusb命令可以查询到是否检测到串口,如下图:基于Ubuntu系统的Tiny4412使用dnw下载程序_第1张图片

此外还可以使用ls /dev | grep tty 命令,我这里查询到的是ttyUSB0,然后再配置minicom就可以是使用了。至于USB口我比较头疼,在Ubuntu中用dnw装完USB驱动后,采用lsusb命令感刚开始还可以查到相关信息,内容大致是“Sansung   Electric....”,具体也记不清了,但是到后来就查不到该USB口了,但是依然可以用来下载,目前我不太清楚原因,但是能用就OK,如果实在不能用的话,可以先用SD-Flsher向SD卡烧写Superroot,改为SD卡启动,在配置文件中为UsbMode =Yes, 打开MiniTools查看USB是否连接,在Ubuntu中配置dnw步骤:

解压缩,之后会看到dnw_linux文件夹,进入该文件夹

         $ cd dnw_linux

         $ ls

         $ /dnw   /secbulk

 

 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),这个信息本来在用lsusb命令下可以查询到USB口的详细信息,但正如上面所说现在已经查不到了,代码如下:

static struct usb_device_id secbulk_table[]= {
	{ USB_DEVICE(0x04e8, 0x1234)},
	{ }
};


    至此,代码修改完毕!

     $ make

     之后在文件夹中会有secbulk.ko模块文件,如下图所示:

     基于Ubuntu系统的Tiny4412使用dnw下载程序_第2张图片

     加载该模块到内核(注意:需要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 编译和安装dnw

     进入dnw文件夹

    $ cd dnw

    $ gcc –o dnw dnw.c

    可能会有一些警告,不过可以忽略。在dnw下生成dnw工具

    将dnw复制到/bin目录下,这样就可以在任意文件目录下调用dnw命令。

   

    温馨技巧: 因为要用dnw的话,要确保secbulk驱动加载到内核,为了避免每次都要手动加载,因此修改/etc/init.d/rc.local文件(root权限),在后面加上下面一句:

     insmod /….你的secbulk.ko文件目录/secbulk.ko

      保存退出完事

提高下载速度

   将secbulk.c中的
 
  #define BULKOUT_BUFFER_SIZE32
 
改为
 
#define BULKOUT_BUFFER_SIZE 512

3. dnw运用

    我用dnw的主要目的是用来下载裸机程序,还有其他文件,根本没有Windows下的蓝屏现象,dnw的用法也很简单。

   3.1 打开两个终端,一个输入minicom命令,打开串口调试,当开发板加载uboot时按下PC上的空格键,使其停在下载模式,输入以下命令:

   dnw  0x50008000

  此时终端打印以下信息,说明USB连接成功,就等待你下载传输了。情况如下:

   基于Ubuntu系统的Tiny4412使用dnw下载程序_第3张图片

   3.2 在另外一个终端输入以下命令,下载文件:

  进入到dnw的路径下, $sudo  ./dnw /你要下载的文件路径/文件名   ,该终端可以显示出Wirting Data OK 的提示信息,直接进行下部也可以运行,但是另一个Minicom的界面并没有出现校验和的信息,只有再执行$sudo  ./dnw /你要下载的文件路径/文件名    一遍才会出现校验和信息如下基于Ubuntu系统的Tiny4412使用dnw下载程序_第4张图片

   

但若使用  $ dnw /你要下载的文件路径/文件名

新问题又出现了:在writing data…期间,写到10%的时候就出现failed!,我试好多次都是这个问题。现在正在解决中。。。

  3.3

   现在你的程序已经下载到内存当中了,如果你想在内存中运行你的程序,只需要输入下面一句命令即可:

     go 0x50008000



出现的问题及解决方法:

3.1 用#sudo dnw 命令下载文件时,提示can not open /dev/secbulk0

一种解决方法是:

      有时候由于内核的升级,运行时会提醒Can not open/dev/secbulk0的错误,此时需要重新到secbulk目录执行$make-C /lib/modules/`uname -r`/build M=`pwd` modules,然后加载模块$sudo insmod./secbulk.ko即可!



还有参考网友的解决方法:是否有执行权限,是否加载成功

基于Ubuntu系统的Tiny4412使用dnw下载程序_第5张图片

经过dmesg查看和权限检查,发现问题都不在这!根据提示信息,是否该检查一下是否有/dev/secbulk0 这个设备!!??

通过查看/dev/ 下的设备,发现我的电脑secbulk的从设备号是1。如下图

基于Ubuntu系统的Tiny4412使用dnw下载程序_第6张图片

打开dnw.c源码 看见如图


基于Ubuntu系统的Tiny4412使用dnw下载程序_第7张图片

修改从设备号为1后如下,

基于Ubuntu系统的Tiny4412使用dnw下载程序_第8张图片

在这里我还修改了默认下载地址为0x3000 0000,友善提供的dnw是带地址参数。

经过这样的修改,然后重新编译dnw , 运行结果如下:



3.2#$sudo insmod ./secbulk.ko 为加载模块进内核
开机的时候不会自动加载,这样每次都要先加载才可以使用,此时将其加入开机脚本,
使其得到自动加载,编辑/etc/init.d/rc.local 在最后加上 insmod /所在路径/secbulk.ko。

gedit  /etc/init.d/rc.local
insmod/home/haozi/桌面/dnw_linux/secbulk/secbulk.ko

3.3#调用dnw时只能在当前目录使用./dnw执行,对此情况,将dnw添加到/usr/local/sbin中,这样可以在
任何目录,使用  sudo dnw filename来调用。





你可能感兴趣的:(Linux开发)