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

linux下GEC210开发环境搭建(工具链、kermit、dnw)

2014-11-01 00:24 246 查看
主机平台:Linux CentOS 6.5
arm平台:粤嵌GEC210开发板(S5PV210)

一、开发环境搭建

1.安装交叉工具连

因为想先把环境搭出来,就直接用了现成的:

下载地址:http://download.csdn.net/detail/qq_17509307/7620365

解压后放到某个位置,如/usr/local/arm/,添加环境变量使其可以在任何路径下使用。:PATH=$PATH:/usr/local/arm//arm-cortex_a8-linux-gnueabi-4.7.3/bin。最好在/etc/profile加入export PATH=$PATH:/usr/local/arm//arm-cortex_a8-linux-gnueabi-4.7.3/bin ,这样不用每次登录时都设置环境变量。

可以通过arm-linux-gcc -v 命令来查看是否成功:

# arm-linux-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gcc
COLLECT_LTO_WRAPPER=/usr/local/arm/arm-cortex_a8-linux-gnueabi-4.7.3/bin/../libexec/gcc/arm-cortex_a8-linux-gnueabi/4.7.3/lto-wrapper
Target: arm-cortex_a8-linux-gnueabi
...


2.安装kermit串口工具

下载地址:http://download.csdn.net/download/aljdf/3404970

进入kermit文件夹:

sudo   make linux

sudo make install

mv wermit /usr/local/bin/kermit


#写这篇博客的时候发现我没有做最后一步,但之前一直使用正常,不知道作用是什么

然后是创建配置文件:vim ~/.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
保存退出。

执行kermt启动:

#kermit
C-Kermit 9.0.303 OPEN SOURCE:, 23 Aug 2011, for Linux
Copyright (C) 1985, 2011,
Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
<C-Kermit>
输入connect连接开发板,
若出现: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 来查看设备名称,并根据实际情况更改配置文件。

3.安装dnw工具

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

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

(1)安装secbulk

查看USB设备的ID,修改secbulk.c文件(这一步网上都没有看到有提及,卡在这里很久)

先用USB线连接开发板与电脑,打开开发板电源

在PC上执行dmesg命令:

找出最后的一部分信息:(可以先执行dmesg -c 清除之前的记录信息,上电,再dmesg,可以避免以前的信息的影响)

usb 2-2: new high speed USB device number 56 using ehci_hcd
usb 2-2: New USB device found, idVendor=04e8, idProduct=1234
usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 2-2: Product: SEC S5PC110 Test B/D
usb 2-2: Manufacturer: System MCU
usb 2-2: configuration #1 chosen from 1 choice


找到: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

出现错误:make: *** /lib/modules/2.6.25-14.fc9.i686/build: 沒有此一档案和目录

sudo yum install kernel-devel 再make -C /lib/modules/`uname -r`/build M=`pwd` modules

执行成功在当前目录会出现secbulk.ko

加载模块:

执行:insmod secbulk.ko

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

lsmod | grep secbulk
secbulk                 2270  0


用USB线连接开发板和电脑,打开开发板电源,执行:$dmesg,若出现

secbulk:secbulk probing...
secbulk:bulk out endpoint found


说明连接成功
如果没有看到上面信息:

1.确保电脑已用USB连接开发板,通过dmesg可查看是否有连接上

2.若确保上一步没有问题,重新检查一下设备的idendor和idProduct与源文件里的设置是否相同,不相同的按以上的步骤重新设置

(2)安装dnw

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

因为一直烧写不成功,所以换了很多个dnw,最后找到了一个不用修改就可以用的,但找不到在哪里下的了,上面给的那个是需要修改一点源代码的。

以上面那个下载地址为例,用这个下载时,总是下载到90%多的时候,下载失败:

load address: 0xD0020010
Writing data...
98%    0x00002AED bytes (10 K)write failed: Bad address


然后我看了一下源代码,找到出现write fail提示的地方:

    size_t remain_size = file_stat.st_size+10;
size_t block_size = remain_size / 100;
size_t writed = 0;
while(remain_size>0)
{
size_t to_write = remain_size > block_size ? block_size:remain_size;//主要是这句
if( to_write != write(fd_dev, file_buffer+writed, to_write))
{
printf("write failed!\n"); //这里提示write failed
return 1;
}
remain_size -= to_write;
writed += to_write;
printf("\r%d%\t %d bytes     ", writed*100/(file_stat.st_size+10), writed);
fflush(stdout);

}


上面的代码意思为:每次写入一个block,每个block的大小为写入数组总大小/100,当剩余数据量不足一个block时,只写入剩下的数据。既然在90%多时下载失败,我就猜想是写入最后不足一个block的数据时出错了。因此我读取了最后一次写入时write函数的返回值,发现为-1,证明读取错误。
同时,我与可以成功下载的dnw.c作对比,发现它的block大小为:1024*1024,也就是说一次下载整个文件,于是我照这样子修改:将上面代码中:

size_t block_size = remain_size / 100;
改为

size_t block_size = remain_size;
保存编译:gcc -o dnw dnw.c,下载,发现成功了。
我也将可以正常下载(block大小为1024*1024)的那个文件里的block改为小于文件长度,结果为write fail。

因此结论就是,当下载最后一次数据,数据量小于block时,write函数会写入失败。

但我想不明白为什么会出现这种状况。

这里还有个地方需要注意一下,就是如果你下载的dnw是允许通过-a 选项来指定下载地址的话,注意它可取值的范围,我下载的其中一个dnw的-a选项最大地址为0x7FFFFFFF,如果地址大于此也会将下载地址设定为0X7FFFFFFF,这时你只能通过修改源代码文件中的load_addr的值来指定下载地址了。

以上就是环境的配置,下面简单的测试一下:

1.交叉工具链

#vim led.S

.global _start				/* 声明一个全局的标号 */
_start:
ldr r0, =0xE0200280		/* GP<span style="font-size:14px;">J2</span>CON寄存器 */
ldr r1, =0x00001111
str r1, [r0]			/* 设置GPJ2_<span style="font-size:14px;">0-3</span>为输出 */

ldr r0, =0xE0200284		/* GP<span style="font-size:14px;">J2</span>DAT寄存器 */
ldr r1, =0x0000000a
str r1, [r0]			/* 设置GP<span style="font-size:14px;">J2</span>_0-3=1010<span style="font-size:14px;">B,<span style="font-size:14px;">低电平亮</span></span> */

halt:
b halt


#vim Makefile
led_on.bin: led_on.o
arm-linux-ld -Ttext 0xD0020010 -o led_on.elf $^
arm-linux-objcopy -O binary led_on.elf $@
arm-linux-objdump -D led_on.elf > led_on.dis

led_on.o : led_on.S
arm-linux-gcc -c $< -o $@

clean:
rm *.o *.elf *.bin *.dis


执行:#make
若没有报错,且生成了.bin等文件,则说明交叉工具链配置正确。

(2)通过kermit和dnw下载数据

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

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

2.打开一个终端,执行kermit,再输入connect

# kermit
C-Kermit 9.0.303 OPEN SOURCE:, 23 Aug 2011, for Linux
Copyright (C) 1985, 2011,
Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/home/star/) C-Kermit>connect
Connecting to /dev/ttyUSB0, speed 115200
Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.


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

load address: 0xD0020010
Writing data...
100%	0x00002BAA bytes (10 K)
speed: 0.217555M/S


重新修改dnw.c,load_addr为0x23e00000,保存,编译,执行
# dnw  ~star/GEC210开发板光盘V2.0/images/Linux_image/u-boot-yaffs-7Inch.bin
load address: 0x23E00000
Writing data...
100%	0x0006C00A bytes (432 K)
speed: 0.239980M/S


若烧写成功,回到第一个终端,并立刻按空格,会出现一些信息和#GEC210提示字符:

OK**********************************************************
*************   U-Boot 1.3.4 for SMDKV210   *************
******************   www.gec-edu.org    ******************
******************   TEL : 020-61038927    ***************
**********************************************************

CPU:  S5PV210@1000MHz(OK)
APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz
MPLL = 667MHz, EPLL = 96MHz
HclkDsys = 166MHz, PclkDsys = 83MHz
HclkPsys = 133MHz, PclkPsys = 66MHz
SCLKA2M  = 200MHz
Serial = CLKUART
Board:   GEC210
DRAM:    512 MB
Flash:   8 MB
SD/MMC: Card init fail!
0 MB
NAND:    256 MB
*** Warning - using default environment

In:      serial
Out:     serial
Err:     serial
checking mode for fastboot ...
Hit any key to stop autoboot:  0
GEC210 #


此时表明uboot已经成功运行,可以输入help查看相关指令。

到这里都没有问题的话,那整个环境的搭建就算是结束了,如果出现问题就回头仔细检查一下哪里是错了。

本来还打算把烧写裸机程序也写上的,但不知不觉越写越长,那就放到下一篇吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: