1. 总论
2. 启动过程
3. 各模块实现
1. 总论
FCT作为Android的一个外来测试程序,位于源码的external文件夹内,其目的是作为产品在PCBA装配生产线中的一个制程,对外围硬件设备驱动进行测试,通过对硬件的一些基本操作,如读芯片地址,来判断硬件是否能够正常工作。
2. 启动过程
系统由bootloader启动,解压并加载内核,完成系统各模块初始化,最后执行init.c脚本。
可以通过对init.c配置,比如,可以通过同时按下两个按键,选择进入FCT模式。
3. 各模块实现
FCT测试程序的实现过程,就是通过一个while(1)死循环,监听来自触摸屏的input事件,根据用户点击的区域执行对应的测试,测试完后给出pass或fail的结果。
3.1 按键
通过select()监听用户来自按键的事件,通过input子系统得到键值,判断键值是否正确。
struct input_event t;
int keys_fd = open ("/dev/input/event1", O_RDONLY |O_NONBLOCK);
if (read (keys_fd, &t, sizeof (t)) == sizeof (t)) {
if (t.type == EV_KEY && t.value == 1) {
switch (t.code)
{
case 4: //page up
case 2: //page down
… …
}
3.2 显示屏
根据驱动提供的接口,对5张图片作全屏刷处理。
3.3 电池
电源驱动将电量值写进/sys/class/power_supply/battery/uevent文件里,FCT模式下只需要读取该文件的数据,就能得到电量值。
3.4 LED
直接控制GPIO,就能控制LED灯。
3.5 录音
打开录音功能,执行录音测试
system("/bin/echo f > /proc/driver/sound");
system("/system/bin/arecord -D hw:0,1 -t wav -d 3 -c 1 -r 32000 -d 10 -f S16_LE /record.wav");
3.6 系统时间
直接读/dev/rtc0设备。
int rtc_read(struct rtc_time * rtc_tm) {
fd=open("/dev/rtc0",O_RDWR);
ioctl(fd,RTC_RD_TIME, rtc_tm);
… …
}
3.7 外围设备
通过读取驱动里注册的相关文件,判断设备是否插入。
check_arephone("/proc/driver/earphone");
check_bat("/sys/class/power_supply/usb/online");
check_sd("/dev/block/mmcblk0");
3.8 G-sensor
通过system("echo on > /proc/driver/gsensor");打开重力感应功能,翻转屏幕看是否正常。