编译开发主机:Debian6
硬件开发平台:RT5350平台 (可以点击到这里购买)
1、搭建开发环境
1.1 连接硬件
通过串口线连接板子的调试串口(DB9)与电脑的串口(如电脑没有串口,可用USB转串口线连接)。可在电脑上打开串口工具,winxp上可打开超级终端,或者其它的如SecureCRT/putty等工具,选择串口号(如果电脑串口,一般是COM1,如果是USB转串口线,那么打开设备管理器,根据实际的串口号进行选择),设置波特率为57600,8位数据位,1位停止位,无流控制。那么,那这个串口工具实际上就是板子的LINUX终端。 上电后,就可以在串口终端里看到linux的启动信息。
1.2 制作固件
解压固件制作包makeimg.tar.gz,并进入该目录:
vmlinux为内核固件
Makefile为制作固件镜像的规则文件
romfs为根文件系统目录,生成的文件系统为squash只读文件系统。
其它文件是制作镜像的工具
根据工具链(GCC编译器安装路径),需要对Makefile进入修改:
CUR_DIR = $(shell pwd)
IMAGEDIR = $(shell pwd)
KERNELZ = $(IMAGEDIR)/zImage
RAMDISK = $(IMAGEDIR)/ramdisk
IMAGE = $(IMAGEDIR)/$(USER)_uImage
ROMFS_DIR = $(CUR_DIR)/romfs
COMP = lzma
CROSS_COMPILE=/opt/buildroot-gcc342/bin/mipsel-linux-
OK,下一步,拷贝文件(需要保存在固件镜像里的文件)到romfs。
然后,在当前目录下的命令行make,则可产生固件镜像文件USER_uImage,其中USER是用户名。
1.3 升级固件
升级固件的方式有两种,一种是在uboot的环境下升级固件,另外一种是通过网页来升级。
在开发过程中,往往常用uboot进行烧写固件,uboot下载固件的方法是通过TFTP。
1.3.1 搭建TFTP环境
在linux主机下,搭建TFTP环境可参照网络相关文章,在windows环境下话,可以使用tftp-win32。
1.3.2 uboot烧写固件
在uboot启动时选择操作2,进入烧写固件菜单,选择Y确认操作。
如实填写好板子的IP地址(设置板子的IP地址),服务器IP地址(即开发主机IP地址,保存有要烧写的固件文件)。
最后填写固件文件的文件名,按回车确定后,则板子开始从主机上下载固件文件,然后再完成烧写。
注意填写正确网络IP地址,主机与板子的IP地址需在同一网段。
1.3.3 网页上传升级固件
这里板子的IP地址为192.168.10.123,板子与电脑连接在同一路由器上或者直接相连。
在电脑上打开浏览器,输入板子的IP地址:
在“固件更新”那一栏选择文件,然后点击确定则可,不过升级过程需要等待一段时间,直接最后升级成功,板子会自动重启。
1.4 有线网络与WIFI无线网络
系统启动后,进入linux命令行,运行ifconfig命令,可以看到板子的网络参数如下:
其中br0为网桥,eth2为有线网络,ra0为无线网络。
1.4.1 有线网络
由于使用的是网桥的连接方式,所以板子的网卡IP地址设置只需要设置br0则可。
ifconfig br0 192.168.10.123
这样就给板子设置了新的IP地址。
当然系统启动后会有个默认的IP地址,保存在flash里,可以通过nvram工具查看或修改:
# nvram_get 2860 lan_ipaddr
192.168.10.123
# nvram_set 2860 lan_ipaddr 192.168.10.122
可以通过ping工具测试有线网络是否配置正确,如下情形为网络测试通过(192.168.10.102为主机地址):
或者,在主机电脑上打开网页浏览器,在地址栏输入板子的IP地址192.168.10.123,如能进入网页界面则网络是通的。
具体的网页界面如网页升级固件所示。
1.4.2 无线wifi网络
使用无线wifi网络需要正确配置与使用wpa_supplicant无线管理工具。
首先需要一个配置文件wpa_supplicant.conf(默认的romfs里在etc_ro目录下),在该文件里正确填写无线路由名称(SSID)和密码:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="FAST_316A22"
scan_ssid=1
key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE
pairwise=TKIP CCMP
group=CCMP TKIP WEP104 WEP40
psk="1234567890"
}
在板子终端命令行里输入启动wpa_supplicant命令:
# wpa_supplicant -B -Dralink -bbr0 -ira0 -c /etc_ro/wpa_supplicant.conf
通过wpa_cli来搜索周边的无线wifi信号:
通过iwpriv工具查看板子是否连接上无线路由:
使用无线网络时把网线拔掉,然后通过ping测试网络或通过网页浏览器测试是否可以登陆板子。
1.5 挂载NFS网络文件系统
首先在主机上搭建NFS网络环境,可参照网络资料搭建,然后在板子上通过mout命令来挂载网络文件系统:
# mount -t nfs -o nolock 192.168.10.106:/home/nfspart /mnt
然后进入/mnt目录就可以看到主机上的文件数据了。
在应用程序开发中常常用这种文件来实现主机与板子的文件传输。
1.6 编写我们的hello,world程序
1.6.1 安装交叉工具链
把gcc工具链解码到/opt目录下:
tar -jxvf buildroot-gcc342.tar.bz2 -C/opt/
导出编译工具路径:
export PATH=/opt/buildroot-gcc342/bin:$PATH
注意,路径设置一定要正确。
执行完以上两步,可以在命令行里运行mipsel-linux-gcc -v,则可看到编译器版本信息。
1.6.2 编译运行程序
编写helloworld程序hello.c:
#include <stdio.h>
int main()
{
printf("hello,world!\r\n");
return 0;
}
编译生成可执行文件hello:
mipsel-linux-gcc hello.c -o hello
通过NFS网络文件系统,拷贝hello可执行文件到/home/nfspart目录下(该目录为NFS的映射目录)
在板子终端上,可以进入/mnt查看到hello这个文件,运行:
2、wifi转串口
2.1 串口通信
int setserial(int s,struct termios* cfg, int speed,int data,unsigned char parity,int stopb)
{
cfmakeraw(cfg);
cfg->c_cflag |= CLOCAL | CREAD;
switch(speed){
case 50 : { cfsetispeed(cfg,B50) ; cfsetospeed(cfg,B50) ; break; }
case 75 : { cfsetispeed(cfg,B75) ; cfsetospeed(cfg,B75) ; break; }
case 110 : { cfsetispeed(cfg,B110) ; cfsetospeed(cfg,B110) ; break; }
case 134 : { cfsetispeed(cfg,B134) ; cfsetospeed(cfg,B134) ; break; }
case 150 : { cfsetispeed(cfg,B150) ; cfsetospeed(cfg,B150) ; break; }
case 200 : { cfsetispeed(cfg,B200) ; cfsetospeed(cfg,B200) ; break; }
case 300 : { cfsetispeed(cfg,B300) ; cfsetospeed(cfg,B300) ; break; }
case 600 : { cfsetispeed(cfg,B600) ; cfsetospeed(cfg,B600) ; break; }
case 1200 : { cfsetispeed(cfg,B1200) ; cfsetospeed(cfg,B1200) ; break; }
case 1800 : { cfsetispeed(cfg,B1800) ; cfsetospeed(cfg,B1800) ; break; }
case 2400 : { cfsetispeed(cfg,B2400) ; cfsetospeed(cfg,B2400) ; break; }
case 4800 : { cfsetispeed(cfg,B4800) ; cfsetospeed(cfg,B4800) ; break; }
case 9600 : { cfsetispeed(cfg,B9600) ; cfsetospeed(cfg,B9600) ; break; }
case 19200 : { cfsetispeed(cfg,B19200) ; cfsetospeed(cfg,B19200) ; break; }
case 38400 : { cfsetispeed(cfg,B38400) ; cfsetospeed(cfg,B38400) ; break; }
case 57600 : { cfsetispeed(cfg,B57600) ; cfsetospeed(cfg,B57600) ; break; }
case 115200 : { cfsetispeed(cfg,B115200); cfsetospeed(cfg,B115200); break; }
case 230400 : { cfsetispeed(cfg,B230400); cfsetospeed(cfg,B230400); break; }
}
switch(parity|32){
case 'n' : { cfg->c_cflag &= ~PARENB; break; }
case 'e' : { cfg->c_cflag |= PARENB; cfg->c_cflag &= ~PARODD; break; }
case 'o' : { cfg->c_cflag |= PARENB; cfg->c_cflag |= PARODD ; break; }
}
cfg->c_cflag &= ~CSIZE;
switch(data){
case 5 : { cfg->c_cflag |= CS5; break; }
case 6 : { cfg->c_cflag |= CS6; break; }
case 7 : { cfg->c_cflag |= CS7; break; }
case 8 : { cfg->c_cflag |= CS8; break; }
}
if(stopb==1)cfg->c_cflag&=~CSTOPB;
else cfg->c_cflag|=CSTOPB;
return tcsetattr(s,TCSANOW,cfg);
}
2.2 wifi转串口-udp模式
while(1){
if(st[i]&2)n=read(s[i],buf,MAXMESG);
else{
n=recvfrom(s[i],buf,MAXMESG,nonblock[i]*MSG_DONTWAIT,
(struct sockaddr*)&addr[i][st[i]],&clen[i]);
nonblock[i]=1;
}
p=buf;
while(n>0){
if(st[!i]&2)w=write(s[!i],p,n);
else w=sendto(s[!i],p,n,0,
(struct sockaddr*)&addr[!i][st[!i]],clen[!i]);
if(w>0){
n-=w;
p+=w;
}else{
fprintf(stderr,"%s: write error\n",pname);
break;
}
}
i=!i;
}