第5章 搭建S3C6410开发板的测试环境
开发板是开发和学习嵌入式技术的主要硬件设备,尽管可以在PC上开发Linux驱动,然后重新编译成ARM架构的Linux驱动模块。但最终都是要在开发板上进行测试的。这主要是因为ARM架构的开发板可基于X86架构的PC在CPU指令以及二进制格式上都有所不同。而且如果Linux驱动需要访问硬件(如LCD、Wi-Fi、蓝牙等),并且这些硬件很难在PC上进行模拟,那么就要在带有这些硬件的开发板上进行调试和测试。
开发板从技术上说与我们经常用的手机类似,也包含显示屏、键盘、Wi-Fi、蓝牙等模块(可能有的是选配)。但与手机不同的是在开发板上安装嵌入式系统要比手机容易得多。而且一般开发板都有很多扩展的端口,可以很容易开发定制的硬件,并与开发板链接。因此,开发板相对于手机来说,更适合对程序进行测试,尤其适合对底层的Linux程序(如Linux驱动)进行测试。当然,一般开发板可没有手机那么漂亮和小巧(尽管有的大屏手机看上去并不小巧,但仍然很顺眼),开发板的很多电路都是暴露的,看上去就像一块集成电路板。
目前市面上的开发板型号和种类很多。但目前最流行的是基于三星S3C6410 ARM11架构的开发板。国内很多厂商在S3C6410 ARM11架构的开发板的基础上进行了扩展,开发了扩展板。本书采用的是飞凌生产的OK6410-A开发板。本书后面的章节所使用的“开发板”如无特殊说明,都是指OK6410-A开发板。本书的示例也可以运行在其他基于S3C6410的开发板上,但可能需要重新进行编译。读者在运行本书示例时要注意这一点。本书主要介绍开发板的调试环境的搭建,以及如何将Android系统安装在开发板上。本书的Linux驱动示例都会提供Ubuntu Linux、Android模拟器和开发板3种运行方式(涉及特殊硬件,只能在特定平台上运行的Linux驱动除外)。
5.1 S3C6410开发板简介
S3C6410是由三星公司推出的一款低功耗、高性价比的RISC(reduced instruction set computer,精简指令集计算机)处理器,它基于ARM11内核(ARM1176JZF-S),可广泛应用于移动电话和通用处理等领域。
S3C6410为2.5G和3G通信服务提供了优化的硬件性能,内置强大的硬件加速器,包括运动视频处理、音频处理、2D加速、显示处理和缩放等,同时还集成了一个MFC(Multi-Format video Codec),支持MPEG4 /H.263/H.264编解码和VC1解码,能够提供实时的视频会议以及NRSC和PAL制式的TV输出。除此之外,该处理器内置一个非常先进的3D加速器,支持OpenGL ES 1.1/ 2.0和D3DM (Direct3D Mobile)API,能实现4M triangles/s的3D加速。同时S3C6410包含了优化的外部存储器接口。该接口能满足在高端通信服务中的数据带宽要求。
由于只用一块S3C6410 ARM11的处理器芯片还无法测试Linux驱动,因此,还必须在S3C6410 ARM11 处理器的基础上进行一些列的扩展,如加上适当的接口,以便可以和 PC 链接进行调试。当然,我们可以自己制作集成电路板,不过这不仅需要软件的知识,还需要硬件的相关知识,而且这已经超出本书的范畴。所以本书会采用已经集成好的 S3C6410 开发板来测试程序。目前,基于S3C6410 ARM11处理器的开发板有很多。本书采用的是飞凌OK6410开发板。读者也可以使用其他的基于S3C6410 ARM11处理器的开发板。不同开发板的区别主要在烧录嵌入式系统的方式上。读者在使用其他开发板时需要参考官方的说明文档进行操作。
OK6410开发板基于三星公司最新的ARM11处理器S3C6410,拥有强大的内部资源和视频处理能力,可稳定运行在667MHz主频以上,支持Mobile DDR和多种NAND Flash。OK6410开发板上集成了多种高端接口,如复合视频信号、摄像头、USB、SD 卡、液晶屏、以太网,并配备温度传感器和红外接收头等。这些接口可作为应用参考帮助用户实现高端产品级设计。
OK6410开发板采用“核心板+底板”结构,如图5-1所示。核心板尺寸规格为“5cm×6cm”,底板尺寸为“10.5cm×14cm” ,核心板与底板之间采用4组高质量进口连接器(镍金工艺,接触好、抗氧化),共计320个引脚(80×4),方便用户进行二次开发,进行各种形式的扩展应用。OK6410开发板的设计严格按照CE、CCC等国内外电子产品认证标准。充分考虑高速信号的完整性等电磁兼容措施,确保OK6410开发板在严酷电磁环境下的可靠运行。
▲图5-1 OK6410开发板
目前可在OK6410开发板上安装WinCE 6.0、WinCE 7.0、Linux 2.6.28及以上版本、Android 2.1及以上版本、uC/OS-II。由于本书主要介绍的是Linux驱动开发和Android HAL开发,因此只考虑Android的安装。感兴趣的读者可以使用OK6410尝试安装其他的系统。
注意
由于 OK6410 开发板是在基于 S3C6410 开发板的基础上开发的,理论上基于S3C6410 开发的其他型号开发板也可测试本书的例子。为了统一,也为了表示本书的例子并不是只能在OK6410开发板上运行,本书将开发板统称为S3C6410。但随书光盘和虚拟环境带的是基于OK6410开发板提供的Linux内核编译的,如果读者使用其他的基于S3C6410的开发板,可能得重新编译Linux内核源代码和驱动模块源代码。
5.2 安装串口调试工具:minicom
开发过Android应用程序的读者应该很清楚通过LogCat视图可以查看调试信息。但开发Linux驱动程序无法像开发Android应用程序直接在Eclipse中开发,并在LogCat视图中显示调试信息。不过使用OK6410开发板也可以使用其他方式显示Linux驱动程序输出的调试信息,这就是串口通信。
OK6410开发板带了一个串口。可以通过串口线与PC连接。Linux驱动在输出调试信息的同时会通过串口线将调试信息发送到PC上,这样Linux驱动程序员就可以直接在PC上查看调试信息了。
注意
由于目前很多新的 PC 和笔记本电脑并没有串口,因此建议读者购买一根 USB转RS232串口线(一定要买质量好的,否则可能接受数据时会出现乱码或干脆无法接受数据)。串口一端接在OK6410上,USB一端接在PC上。并且要安装必要的驱动。不过经笔者测试,很多USB转RS232串口线在Ubuntu Linux10.04及以上版本并不需要安装驱动就可以识别。
既然PC需要与串口设备通信,就需要在PC上安装接收和发送串口数据的程序。本书选用的是minicom,一款Linux版的串口管理软件。在使用minicom之前需要安装该软件。如果读者使用的是Fedora Linux,minicom已经包含在了Fedora Linux安装包中,因此可以省略如下的安装步骤。但Ubuntu Linux需要按照如下的步骤安装、配置和测试minicom。
第1步:检测当前系统是否支持USB转串口
# lsmod | grep usbserial
执行上面的命令后,如果输出如图5-2所示的信息,说明当前的Linux系统支持USB转串口。
▲图5-2 检测当前Linux系统是否支持USB转串口
第2步:安装minicom
# apt-get install minicom
第3步:配置minicom
# minicom –s
执行上面的命令后,会在Linux终端显示如图5-3所示的菜单。
▲图5-3 minicom的配置主菜单
进入“Serial port setup”菜单项,会显示如图5-4所示的子菜单。读者需要按照如图5-4所示的内容配置minicomm。
▲图 5-4 配置串口设备和传输速率
注意
如果读者的PC上有串口,可以直接使用串口线。在这种情况下Serial Device要设为/dev/ttyS0。
设置完后,先后选择如图5-3所示的“Save setup as dfl”和“Exit from Minicom”。
第4步:测试minicom
# minicom
执行上面的命令后,minicom 就会进入等待接收数据状态。如果正确连接串口线或 USB 转串口线,并且将OK6410开发板电源接通,并打开开关,如果OK6410开发板已经安装了系统(任何系统都会输出信息),minicom就会接收到从OK6410发出的信息,如图5-5所示。如果读者成功接收到与图5-5所示类似的信息说明成功安装和配置了minicom ,并且OK6410开发板至少在串口和数据传输方面没有问题。
▲图5-5 启动Android接收到的信息
5.3 烧写Android系统
OK6410开发板默认安装的是WinCE 6.0,为了安装Android,需要先把WinCE 6.0卸载,然后,再安装Android。
在烧写Android之前,务必启动 Eboot 擦除 NandFlash。这是因为微软在设计WinCE时有一个约定,就是把前 4 个块都标记成了坏块,也就是说,把 bootloader 分区都标记成坏块,以防止bootloader被WinCE应用程序擦掉。这就需要在将开发板换成Android系统的时候,需要把这几个“假坏块”恢复过来。
使用Eboot擦除NandFlash的方法如下。
第1步:准备工作
用串口线或USB转串口线连接开发板和PC,并启动minicom。
第2步:进入Eboot状态
打开OK6410开发板的电源开关,过一会出现如下等待5秒的提示信息,按PC键盘的空格键使开发板停留在 Eboot 状态。
Initiating image launch in 5 seconds.
第3步:擦除NandFlash
进入Eboot状态后会出现如图5-6所示的菜单,输入“A”即可擦除NandFlash。
▲图5-6 Eboot菜单
下面看看烧写Android的步骤。下面所涉及的工具和文件都可以在<光盘根目录>/resources/tools/ok6410目录中找到。
第1步:准备工作
准备一个2GB或4GB的SD卡,要求FAT32分区格式。插入读卡器并连接PC。
第2步:向SD卡写入mmc.bin和zImage-sd.bin
这一步需要在Windows XP下完成(因为官方只提供了Windows下的工具)。读者可在Ubuntu Linux下安装使用VMWare来运行Windows XP。现在运行SD_Writer,OS Type选择“Android”,并在Select Root和Select Kernel中分别选择mmc.bin和zImage-sd.bin文件,如图5-7所示。单击“Scan”按钮,如果 SD 卡已连接 PC,会自动扫描到 SD 卡的盘符。最后单击“Program"按钮将mmc.bin和zImage-sd.bin文件写入SD卡。如果写入成功,会显示“It's ok”对话框。
▲图5-7 向SD卡写入mmc.bin和zImage.bin
第3步:烧写Android前的准备工作
首先将android_fs.tar、mmc.bin和zImage文件复制到SD卡上,然后按照表5-1所示的规则设置OK6410开发板上的启动开关。
表5-1 OK6410启动开关规则
在图5-1所示的OK6410开发板电池上方有8个可以拨动的开关。最靠近电池的开关为Pin8,依次递减。通过设置这8个开关可以控制OK6410开发板的启动方式。表5-1是两种启动方式的设置规则。这8个开关可以来回拨动。从图5-1的方向,向左拨动为off,向右拨动为on。表中的“×”表示忽略该开关。OK6410烧写Android比较容易,但需要使用SD卡启动,烧写完成后再用Nandflash启动Android。根据表5-1的描述,用SD卡启动需要将Pin4至Pin8都向右拨动。当烧写完成后,再将Pin6和Pin7向左拨动即可。要注意的是,在波动开关之前要关闭开发板,拨动完后再打开开发板。
注意
本书使用的是OK6410-A,如果使用OK6410-B或其他型号的开发板,设置启动方式请参考官方文档的说明。
第4步:开始从SD卡烧写Android
现在将SD卡插入OK6410开发板的插槽,并设置成SD卡启动,打开开发板。这时开发板就开始从 SD 卡烧写 Android。首先会向开发板内存写入一些用于启动 Android 的数据。相当于将boot.img刷到手机上,如图5-8所示。
▲图5-8 向开发板写入启动数据
写完启动数据后,会进行系列的检测,然后会出现#提示符,输入如图 5-9 所示的 yjsx命令。
▲图5-9 输入yjsx命令
输入.yjsx命令后开始复制SD卡中的数据(主要是system目录中的文件),如图5-10所示。
▲图5-10 开始复制系统文件
如果最后出现如图5-11所示的“great!!! all jobs is over”信息,说明已成功将Android安装到OK6410开发板上。
▲图5-11 成功安装Android
第5步:校准屏幕
安装完 Android 后别忘了关闭开发板,然后将开关恢复到Nandflash启动状态,否则启动后会再安一遍。
重新启动开发板,Android系统会在第一次启动时要求校准屏幕。最好使用随开发板一起带的触摸笔。校准界面如图5-12所示,共左上、右上、左下、右下,中心 5 个校准点。用触摸笔点中一个校准点后会出现下一个校准点。5个校准点都处理完后Android会继续启动。
▲图5-12 校准屏幕
如果读者感觉屏幕的触摸位置不准确,可以在minicom中输入如下的命令删除屏幕校准文件,再次启动时会重新要求校准屏幕。
# rm /data/pointercal
成功启动后的Android主界面如图5-13所示。
▲图5-13 Android主界面
5.4 配置有线网络
开发板与其他设备连接的常用方式包括串口线、USB数据线、蓝牙、Wi-Fi和网线。串口线和USB数据线直接插在PC的相应接口上就直接可以连通(很多Android手机也可以使用USB数据线和PC连接),蓝牙和Wi-Fi需要相应的配件(一般开发板的标配并不带蓝牙和Wi-Fi模块,需要单独购买)才能使用。设置方式和手机完全一样。而大多数开发板都会有一个以太网口,可以直接使用网线和外部设备连接。但并不是使用网线将开发板和路由或 Hub 连接,开发板就可以连接进网络。因为很多开发板带的Android系统(如本书使用的OK6410-A)都不会自动分配IP以及设置子网掩码和网关,所以在用网线连接后,需要手工设置开发板的IP、子网掩码和网关。
由于Android本质上是Linux系统,因此可以使用Linux命令ifconfig设置IP和子网掩码,用route命令设置网关。ifconfig命令默认会将子网掩码设为255.255.255.0,因此,如果读者的子网掩码是255.255.255.0,可以不用指定子网掩码。下面的命令(需要在开发板上执行)可以将开发板的IP设为192.168.17.166,子网掩码设为255.255.255.0,网关设为192.168.17.254。
# ifconfig eth0 192.168.17.150 netmask 255.255.255.0 up # route add default gw 192.168.17.254 dev eth0
其中“netmask 255.255.255.0”可以省略。
如果设置成功,使用如下的命令可以查询开发板当前的 IP 配置和路由表(查看信息要使用busybox中的ifconfig和route命令)。
# /system/busybox/sbin/ifconfig # /system/busybox/sbin/route
执行上面的命令后,会显示如图5-14所示的信息。
▲图5-14 查看IP地址和路由表
前面的设置方式只能将结果保存在内存中,一旦重启开发板,所有的设置将消失。当然我们可以编写一个脚本文件,将上面的命令放到脚本文件中,当开发板每次重启后执行该脚本文件。但这样比较麻烦。很多开发板都提供了一个开机自动执行的脚本文件。OK6410-A的文件名为linuxrc(也可能叫类似的名字,具体信息请咨询客服),位于 Android 系统的根目录。通过 vi 命令打开 linuxrc文件,找到如图 5-15 所示白框中的内容,将前面的井号(#)去掉,并将 IP、子网掩码和网关改成直接的值,然后保存linuxrc文件。现在重启开发板,就可以自动连接进网络了。如果IP和网关可以连入Internet,那么开发板就可以通过网线上网了,速度要比Wi-Fi快得多。
▲图5-15 修改linuxrc文件的内容
如果读者不想修改linuxrc文件的内容,在随书光盘提供的虚拟环境中的/root/drivers目录中有一个netconfig.sh脚本文件。将开发板通过USB数据线连接到PC后(有时需要将USB数据线拔下来重新插上),并执行如下的代码来设置IP和网关(子网掩码是255.255.255.0)。
# sh netconfig.sh 192.168.17.166 192.168.17.254
由于很多开发板的MAC地址相同,所以当多台开发板共处于同一个网络时,就只能有一台开发板可以上网了。因此,当有多台开发板连接进同一个网络,并且它们的MAC地址相同时,需要使用ifconfig命令修改当前开发板的MAC地址,为了一劳永逸,可以在linuxrc文件中加入如下几行代码,其中08:90:00:A0:90:80是新的MAC地址。
# 关闭网卡设备 /system/busybox/sbin/ifconfig eth0 down # 设置新的MAC地址 /system/busybox/sbin/ifconfig eth0 hw ether 08:90:00:A0:90:80 # 打开网卡设备 /system/busybox/sbin/ifconfig eth0 up
5.5 小结
本章只介绍了如何在OK6410-A开发板上安装Android。当然,读者可以选择其他的开发板,也可以直接在手机上测试Linux驱动程序。由于不同的开发板和手机安装Android的方法有一定的差别,所有无法介绍得面面俱到。如果读者使用本书未介绍的硬件测试本书的例子,需要仔细阅读相应的官方说明文档以便了解如何使用这些设备。