一直在Windows下开发,某些bug总是使我不能全心全意的信任Windows,从开发嵌入式开始,一直就想把开发环境转移到Linux环境下,特别是下载程序的时候,不过确实有Linux的开发环境,就拿下载程序来说,Linux下的minicom和dnw真的是很好用,同时也可以学习源代码。下面教你如何下载、安装、使用dnw。
1. dnw由两部分构成:USB驱动和下载工具,USB驱动便是secbulk文件夹,下载工具是DNW文件夹
下载地址:https://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模块文件,如下图所示:
加载该模块到内核(注意:需要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连接成功,就等待你下载传输了。情况如下:
3.2 在另外一个终端输入以下命令,下载文件:
$ dnw /你要下载的文件路径/文件名
下载过程和结果如下:
到此为止,dnw的介绍结束,因为之前研究过Linux下的dnw使用,好长时间没用了,现在写此博文来记录,方便以后回顾,同时也希望给新手一个指导。
我现在在用dnw来下载裸机程序,但是因为好久没用了,出现以前从来没有遇到过的问题:
1. 首先是出现“can not open /dev/secbulk0”,后来想想原来是dnw时没有使用root权限,在后面又出现这个问题,我又重新编译了一次secbulk驱动,这个问题解决了。
2. 这次是没有出现上面的问题了,但是新问题又出现了:在writing data…期间,写到10%的时候就出现failed!,我试好多次都是这个问题。现在正在解决中。。。情况如下:
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下开发程序了。