您的位置:首页 > 运维架构 > Linux

linux下安装及使用DNW

2016-11-04 18:29 225 查看
这段时间尝试脱离windows烧写开发板程序,因为笔记本使用的是WIN7 64bit的系统,所以使用不了window下的dnw软件,如果想使用还得虚拟机装个WIN XP。。。。TFTP烧写目前还没学,感觉也还是麻烦,既然有linux这个平台,就用linux来烧写吧。在这里写个笔记,记录一下方法。

1.下载dnw工具

下载地址:http://download.csdn.net/download/plaza02/1011140

包含两个工具:scebulk(USB驱动) 、dnw(下载工具)

解压缩后,进入该文件夹

cd /dnw/dnw_linux/scebulk/


(1)安装secbulk

先用USB线连接开发板与电脑,打开开发板电源,终端执行dmesg命令

找到这样的信息:



(可以先执行dmesg
-c 清除之前的记录信息,上电,再dmesg)

可以得知,开发板
idVendor=04e8, idProduct=1234 , 记住这两个数

打开下载的dnw包,进入secbulk目录,编辑secbulk.c文件,找到这句:

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

将USB_DEVICE里的两个数改成前面的idendor和idProduct,保存退出。

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


执行:make -C /lib/modules/`uname -r`/build M=`pwd` modules  
执行成功在当前目录会出现secbulk.ko。

PS:在secbulk.c中,找到
#define
BULKOUT_BUFFER_SIZE 32
这句,将其修改为
64或512,下载速度会极大提升

加载模块模块到Linux内核:

执行:insmod
secbulk.ko

可以用:lsmod
| grep secbulk 来查看是否加载成功

lsmod | grep secbulk secbulk                2270  0


用USB线连接开发板和电脑,打开开发板电源,虚拟机挂载开发板USB下载端,执行dmesg命令,诺出现:



说明连接成功

开机的时候不会自动加载.ko文件,这样每次都要先加载才可以使用,此时将其加入开机脚本,

使其得到自动加载,编辑/etc/init.d/rc.local 在最后加上 insmod /所在路径/secbulk.ko。

(2)安装dnw

上面给出的dnw下载地址需要进行如下修改:
打开dnw.c文件,找到
printf("Writing data...\n");
size_t remain_size = file_stat.st_size+10;
size_t block_size = remain_size / 100;
size_t writed = 0;
改为
printf("Writing data...\n");
size_t remain_size = file_stat.st_size+10;
size_t block_size = remain_size;
size_t writed = 0;
便可正常在linux下使用dnw。

2.测试

编写一个简单的点亮LED灯程序测试是否可以正常烧写。
#start.S
#define GPJ2CON 0xE0200280
#define GPJ2DAT 0xE0200284

.global _start
_start:
// 第1步:将0x00001111写入0xE0200280位置(GPJ2CON)
// 即设置GPJ2CON0~GPJ2CON3共4个引脚为输出模式
<span style="white-space:pre">	</span>ldr r0, =0x00001111
<span style="white-space:pre">	</span>ldr r1, =GPJ2CON                // ldr伪指令
<span style="white-space:pre">	</span>str r0, [r1]                    // 寄存器间接寻址,把r0中的数写入到以r1中的数为地址的内存中去

// 第2步:将0b00001010写入0xE0200284位置(GPJ2DAT)
// 即设置GPJ2DAT0~GPJ2DAT3为0b00000101
<span style="white-space:pre">	</span>ldr r0, =0b00001010<span style="line-height: 26.6px; font-family: 'Microsoft YaHei';"></span>
<span style="white-space:pre">	</span>ldr r1, =GPJ2DAT
<span style="white-space:pre">	</span>str r0, [r1]

<span style="white-space:pre">	</span>b .                         // 死循环,程序停留在这里,.表示当前指针的地址
// 裸机程序是直接在CPU上运行的,CPU会逐行运行裸机程序直至CPU断电关机
// 如果裸机程序全部被执行完了CPU就会跑飞(跑飞结果未定义)
// 为了不让CPU跑飞即在整个裸机程序执行完后添加死循环
程序参考自:http://blog.csdn.net/rston/article/details/51065661

编写Makefile:
all: start.o
arm-none-linux-gnueabi-ld -Tgecboot.lds -o gecboot.elf $^
arm-none-linux-gnueabi-objcopy -O binary gecboot.elf gecboot.bin

%.o : %.S
arm-none-linux-gnueabi-gcc -g -c $^

%.o : %.c
arm-none-linux-gnueabi-gcc -g -c $^

.PHONY: clean
clean:
rm *.o *.elf *.bin
执行:make
生成 gecboot.bin文件。

通过dnw下载数据

将uboot下载到内存中运行,这里参考了GEC210开发板附带的《GEC210开发板使用快速入门文档》里的下载过程,所以下面的操作可能只适用于GEC210开发板。

1.连接好串口线、USB线,将启动开关拨至SD-BOOT处(但不要插上SD卡,它会自动以USB启动),打开电源;

2.打开另外一个终端,进入dnw.c所在文件夹,修改dnw.c中load_addr的地址为0xd0020010,保存,编译:
gcc -o dnw dnw.c


PS:0xd0020010为gec210_usb.bin文件下载地址,该文件初始化210处理里的相关寄存器;
0x23e00000为uboot、内核、文件系统等文件烧写地址

把gec210_usb.bin复制到linux中,执行:
./dnw gec210_usb.bin

显示结果:



3.重新修改dnw.c,load_addr为0x23e00000,保存,编译,执行
./dnw /gecboot.bin

出现如下结果的同时,可观察到GEC210开发板上2个LED灯亮起。



至此,DNW已可正常在linux下使用。
诺出现“can not open /dev/secbulk0”,可能是未获得root权限,或者尝试重新编译secbulk。

补充:在linux下,可通过kermit串口工具实现串口linux输出。
安装kermit:
sudo apt-get install ckermit
配置:
gedit ~/.kermrc
添加如下内容:
set line /dev/ttyUSB0           //我用的是USB转串口  如果是串口的话是ttyS0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5
c
保存退出。

连接开发板,通电,先
ls /dev/ttyUSB*
找到开发板串口号,如果不是ttyUSB0,则修改~/.kermrc中的相应端口号。

终端中输入kermit,出现



则成功连接,接下来如有什么操作,可以在这个终端上显示串口输出信息。

若出现:SET SPEED has no effect without prior SET LINE ,可能是以下情况

1.没有以root运行,kermit需要以root身份运行。也可以普通用户用sudo来执行,但在我的机子上,普通用户执行sudo kermit会提示“sudo:kermit:command not found”,此时,kermit用绝对路径可解决问题:sudo /usr/local/bin/kermit

2.有另一个终端已经运行了kermit,占用了串口,此时也会出现Locked by process的提示。可以通过ps -aux|grep kermit 来查看是否有其他进程在使用kermit。

3.串口设备名称不匹配。在kermrc配置中的设备名称为ttyUSB0,但有时候可能为ttyUSB1。可通过ls /dev 来查看设备名称,并根据实际情况更改配置文件。

终端当前操作:ctrl + \ + c
退出kermit:

ctrl + \ + z
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  嵌入式系统 linux