一、 移植环境
【移植环境】
1、 主机:Ubuntu 10.10发行版
2、 目标机:FS_S5PC100平台
3、 交叉编译工具:arm-none-linux-gnueabi-4.5.1
4、wifi模块:marvell-8686
5、Linux文件系统:rootfs.3g.wifi.tar.bz2
6、内核:linux-2.6.35-farsigt
二、 在linux下的移植
1. 平台代码修改
driver/mmc/host/sdhci.c
屏蔽以下代码
629行 printK (KERN_WARING "%s: too large timeout requested!\n", mmc_hostname(host_>mmc));
2. 内核驱动支持
因为S5PC100平台上SDIO功能已经支持,所以只需要内核驱动支持marvell-8686即可。
[*] Networking support --->
[*] Wireless --->
cfg80211 - wireless configuration API
{*} common routines for IEEE 802.11 drivers
Device Drivers --->
[*] Network device support --->
Wireless LAN --->
Marvell 8xxx Libertas WLAN driver support
Marvell Libertas 8385/8686/8688 SDIO 802.11b/g cards
Generic Driver Options --->
(sd8686.bin sd8686_helper.bin) External firmware blobs to build into the kernel (firmware) Firmware blobs root directory
3. 内核的修改
文件arch/arm/mach-s5pc100/mach-smdkc100.c有内核的分区, 把第2个分区改成8M。
因为生成的文件系统太大,大于4M。
4. 固件准备
将固件sd8686.bin和sd8686_helper.bin拷贝到linux-2.6.35/firmware下。编译时会自动编译进内核。
$ make zImage
$ sudo cp zImage /tftpboot
三、 文件系统的制作
1. wpa_suppicant的移植
源码版本选择:
wpa_supplicant-0.7.2
openssl-0.9.8e
openssl移植:
a、补丁安装
openssl源码编译需要打wpa_supplicant提供的补丁,我们选择的openssl版本为openssl-0.9.8e所以我们需要wpa_supplicant-0.7.2/patches/openssl-0.9.8e-tls-extensions.patch拷贝到openssl源码下。
patch -p1 < openssl-0.9.8e-tls-extensions.patch
b、配置编译安装
./Configure linux-elf-arm -DL_ENDIAN linux:'arm-none-linux-gnueabi-gcc' shared --prefix=/home/linux/workdir/wifi/openssl
make
make install
wpa_supplicant移植:
在/wpa_supplicant-0.7.2/wpa_supplicant目录下
a、makefile修改
添加
CC=arm-unknown-linux-gnueabi-gcc//自己的交叉编译工具
在
CFLAGS += -I../src
CFLAGS += -I../src/utils
下添加:
CFLAGS += -I/home/linux/workdir/wifi/openssl/include
修改
LIBS += -lssl
为
LIBS += -lssl -L/home/linux/workdir/wifi/openssl/lib/
修改
LIBS_p += -lcrypto
为
LIBS_p += -lcrypto -L/home/linux/workdir/wifi/openssl/lib/
b、编译
cp deconfig .config
make
编译后将生产的wpa_supplicant和wpa_cli拷贝到根文件系统的bin目录下
2. 文件系统的制作
由于2.6.35的内核不支持yaffs文件系统,而cramfs是只读文件系统,所以选择了jffs文件系统,命令如下:
$ mkfs.jffs2 -r /source/rootfs -o rootfs.jffs2 -e 0x20000 --pad=0x600000 -n
$ sudo cp rootfs.jffs2 /tftpboot
考虑到终生成的文件系统比较大(5M多),--pad用的600000
四、 测试
1. 移植u-boot
关闭开发板电源,将拨码开关SW1调至0001(usb启动模式)后打开电源
a) 加载运行USB Installer_DDR2.bin
USB Port → Transmit → Transmit,选中image目录下的USB Installer_DDR2.bin
b) 加载运行u-boot-v45.0.bin
USB Port ? Transmit ? Transmit,选中FS_S5PC100光盘v4.5\Linux-Android\image目录下的u-boot-v45.0.bin
串口终端下能看到如下内容(如果有倒计时数字,按任意键出现提示符)
c)设置并保存环境变量
# printenv // 查看环境变量的值并按如下设置
# setenv baudrate 115200
# setenv ethaddr 11:22:33:44:55:66
# setenv gatewayip 192.168.1.1
# setenv serverip 192.168.1.237 // serverip要和虚拟机的ip相同
# setenv ipaddr 192.168.1.223 // ipaddr也可以是192.168.1.x其他值
# setenv netmask 255.255.255.0
保存环境变量
# saveenv
d) 烧写u-boot-v45.0.bin到nand flash起始地址
# tftp 20008000 u-boot-v45.0.bin
# nand erase 0 40000;
# nand write 20008000 0 40000
2. 移植内核
# tftp 20008000 zImage
# nand erase 100000 300000
# nand write 20008000 100000 300000
3. 移植jffs2文件系统
# tftp 20008000 rootfs.jffs2
# nand erase 400000 800000
# nand write 20008000 400000 800000
4. 设置启动参数
# setenv bootdelay 3
# setenv bootcmd nand read 20008000 100000 300000\; bootm 20008000
# setenv bootargs root=/dev/mtdblock2 init=/linuxrc rootfstype=jffs2 rw
console=ttySAC0,115200
# boot
五、 WIFI模块的测试
1. 在根文件中添加/etc/resolv.conf,域名解析。
内容为:
# Generated by NetworkManager
nameserver 8.8.8.8
2. 在根文件系统/etc下添加wpa_supplicant配置文件wpa_supplicant.conf内容为:
# WPA-PSK/TKIP
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="XXXX" #无线路由ssid
key_mgmt=WPA-PSK
proto=WPA
pairwise=TKIP
group=TKIP
psk="XXXXXXXX" #无线路由密码
}
3. 创建目录/var/run/wpa_supplicant
mkdir /var/run/wpa_supplicant -p
4. 启动开发板完成如下操作
● 配置无线网卡ip
ifconfig wlan0 192.168.1.200
● 配置默认网关
route add default gw 192.168.1.1
● 启动wpa_supplicant连接无线网络
wpa_supplicant -B -iwlan0 -c /etc/wpa_supplicant.conf
● 查看连接状态
wpa_cli status
ping 220.181.111.147
ping www.youku.com.cn