3 制作流程3.1 MINI-SD卡的准备
EV3 MINI-SD卡的启动需要按照如下的规范:
两个分区
第一个分区50M,文件系统是FAT,用于放置linux内核文件
第二个分区最好大于1G,文件系统是EXT3,用于放置linux根文件系统
具体的操作细节,可以参考如下的网页
[url=]http://www.linuxidc.com/Linux/2011-11/47797.htm[/url]3.2固件处理
从ev3source/lms2012/open_first/script/make_image.pl中分析出ev3固件的文件格式偏移文件说明
0x0uBootmini-sd不用
0x50000uImagelinux内核文件
0x250000EV3.cramfs.bincramfs映像
uImage处理
编写一个小程序将uImage从文件EV3 Firmware V1.06E.bin读出
将linux内核镜像写入mini-sd
mount /dev/sdb1 /mnt/d1 #加载mini-sd卡的fat分区cp uImage /mnt/d1 #拷贝内核镜像文件 umount /mnt/d1
cramfs映像处理
mount -t cramfs -o loop,offset=0x250000 "EV3 Firmware V1.06E.bin" /mnt/d2
目录/mnt/d2内容如下
将linux文件系统写入mini-sd
cd /mnt/d2 tar –zcvf /home/root/ev3.tgz * #将EV3的文件系统打包
umount /mnt/d2 mount /dev/sdb2 /mnt/d2 #加载mini-sd卡的EXT3分区
cd /mnt/d2 tar –zxvf /home/root/ev3.tgz #解压EV3文件系统
umount /mnt/d2
3.3 console线连接
杜邦线仅仅需要三根,红黄蓝
a USB TO TTL上
红-GND
黄-RXD
蓝-TXD
b NTX插座
c 连接图
ps: 原以为需要洞洞板做连接,插口回来后发现不需要,直接使用杜邦线就可以了。当然要小心点,工作时不要碰到就行。
3.4终端显示验证
接好线后,插入mini-sd卡,在mac/linux上面打开一个终端
执行cu -s 115200 -l /dev/cu.SLAB_USBtoUART
打开EV3电源,终端上会显示
EV3进入到官方操作界面,并且终端无响应。
3.5 启动WIFI
按照固件启动的流程,会直接进入到lms2012提供的界面中,而没有启动wifi,我们需要做如下的修改:
a. 修改mini-sd卡
关机,取出mini-sd卡,重新在linux上mount
b. 增加wifi脚本
在/mnt/d2/etc/init.d目录下增加一个可执行脚本wifi.sh,主要是加载无线网卡需要的内核驱动模块,以及启动WIFI,最后通过dhcpcd获得IP。内容如下
#!/bin/sh
echo "load modules compat"
/sbin/insmod /lib/modules/2.6.33-rc4/kernel/compat/compat.ko
echo "load modules cfg80211"
/sbin/insmod /lib/modules/2.6.33-rc4/kernel/net/wireless/cfg80211.ko
echo "load modules mac80211"
/sbin/insmod /lib/modules/2.6.33-rc4/kernel/net/mac80211/mac80211.ko
echo "load modules ath"
/sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath.ko
echo "load modules ath9k_hw"
/sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
echo "load modules ath9k_common"
/sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
echo "load modules ath9k"
/sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
echo "load modules ath9k_htc"
export FIRMWARE_DIRS="/lib/firmware"
/sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
echo "start wifi"
cd /home/root/lms2012/sys
./wpa_supplicant -B -c /etc/wpa_supplicant.conf -iwlan0
echo "requesting IP address"
udhcpc --retries=10 --now -i wlan0 -h ev3
d 将wifi.sh加入启动目录level5中
cd ../rc5.d
ln –s ../init.d/wifi.sh S40wifi
e 修改WIFI密码
修改/mnt/d2/etc/wpa_supplicant.conf
network={
ssid="Bella"
psk=dbc9c6cf6d4d8e9405842d2e4ab726f33f10de62c30254ff19512af0dca1bc0f
key_mgmt=WPA-PSK
proto=RSN
pairwise=CCMP,TKIP
group=CCMP
}
修改为自己wifi的ssid
使用wpa_passwd ssid passwd生成psk。注意,大小写敏感
f 删除rc5.d/S99lms,并卸载/mnt/d2
g 取出mini-sd,插入EV3,开机
如果一切顺利的话,终端的内容如下
另外,可以使用putty,telnet直接连接EV3的ip,192.168.100.10。当然为了后期方便,大家还可以把sshd(dropbear)加入到rc5.d中。
到此为止,目标A,B,C大功告成。
4遗留问题
目前shutdown命令还不能自动关机
5继续折腾之路
其他WIFI网卡的支持
需要使用源码来编译。可以参考[url=]http://icube-avr.unistra.fr/en/index.php/Hacking_the_Lego_EV3[/url]
控制EV3提供的外设
目前EV3的外设包括,马达,传感器等,会在后续的文章中涉及。
其他软件包的安装
主要采用交叉编译的方法,生成自己想要的软件。例如,gdb, strace, http server等,和常规的linux开发差异不大。
6. 附录
提取uImage文件的源码
#include
#include
#include
#include
int main()
{
int ifd,ofd;
int begin = 0x50000;
int end = 0x249999;
struct stat st;
unsigned char* ptr;
char* fname ="EV3 Firmware V1.06E.bin";
char* ofile ="uImage";
ifd = open(fname,O_RDONLY);
if(ifd == -1)
return -1;
ofd = open(ofile,O_CREAT | O_TRUNC | O_RDWR,0664);
if(ofd == -1)
return -1;
fstat(ifd,&st);
ptr = mmap(NULL,st.st_size,PROT_READ,MAP_SHARED,ifd,0);
if(ptr == MAP_FAILED)
return -1;
while(ptr[end] == 0xFF && end > begin )
end--;
write(ofd,ptr+begin, end-begin+1);
munmap(ptr,st.st_size);
close(ofd);
close(ifd);
return 0;
}