闲鱼30包邮购得的摇头机,移动和家亲定制的科大讯飞XFP301-M,全新但是序列号被绑定,代工厂为中山科美视通科技有限公司,连个官网也没有。这里有前人的拆解贴,记录一下折腾和安装OpenIPC的过程

硬件配置

SoC: 君正T31ZX 单核1.5GHz
CMOS:台湾晶相光电 JXQ03P 300万像素
RAM:128MB SoC内置
ROM:16MB NOR
镜头:4mm M12 IR-CUT
其他配置:带红外补光灯,PTZ,WiFi+有线连接,TF卡卡槽,语音对讲

和之前折腾的360 AP6PCM03一样的配置,不过360带有线网口,这台只有WiFi,无线网卡为rtl8188fu,单频2.4GHz

备份原始固件

因为没有网口,在uboot下无法通过tftp备份固件,但是uboot下有mmc命令,且能正确识别到TF卡,所以可以将NOR闪存备份到TF卡内,TF卡block size为512 bytes

sf probe 0
sf read 0x80600000 0x0 0x1000000
mmc erase 0x5000 0x8000
mmc write 0x80600000 0x5000 0x8000

此命令将NOR 16MB内容完整写入到TF卡10MB偏移处。电脑上使用dd命令将之读出

dd if=/dev/mmcblk0 of=xfp301m_fulldump.bin skip=20480 count=32768

然后根据启动日志中的分区表将之分割为独立分区镜像

0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000200000 : "kernel"
0x000000200000-0x000000740000 : "root"
0x000000740000-0x000001000000 : "appfs"

获取root密码

启动完成后登录root用户有密码,bootargs中设置init=/bin/shcat /etc/shadow

root:$1$RVn0gu3y$fUIKeC8F7rWAzyPpoxhl2/:10933:0:99999:7:::

网上没有现成的密码,转换思路,既然不知道密码,那就把密码清空。unsquashfs解包rootfs分区,编辑/etc/shadow,清空root用户密码,mksquashfs重新打包为rootfs_mod.bin,拷贝到FAT文件格式的TF卡内,插入到摄像头,进入uboot

fatls mmc 0 #列出TF卡内FAT文件系统内的文件
fatload mmc 0 0x80600000 rootfs_mod.bin
sf probe 0
sf erase 0x200000 0x540000
sf write 0x80600000 0x200000 0x540000
reset

进入无人之地

[@IFLY_IPC:]# cat /proc/cpuinfo
system type             : Swan
machine                 : Unknown
processor               : 0
cpu model               : Ingenic Xburst V0.0  FPU V0.0
BogoMIPS                : 1391.00
wait instruction        : yes
microsecond timers      : no
tlb_entries             : 32
extra interrupt vector  : yes
hardware watchpoint     : yes, count: 1, address/irw mask: [0x0fff]
isa                     : mips32r1
ASEs implemented        :
shadow register sets    : 1
kscratch registers      : 7
core                    : 0
VCED exceptions         : not available
VCEI exceptions         : not available

Hardware                : isvp
Serial                  : 00000000 00000000 00000000 00000000

[@IFLY_IPC:xpf301m]# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
tmpfs on /dev type tmpfs (rw,relatime)
proc on /proc type proc (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /tmp type tmpfs (rw,relatime)
tmpfs on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755)
sysfs on /sys type sysfs (rw,relatime)
/dev/mtdblock3 on /mnt/mtd type jffs2 (rw,relatime)

尝试修改SN解绑

略,无解

安装OpenIPC

SD卡安装

OpenIPC对君正T31和JXQ03这颗CMOS有完整支持。下载对应固件:openipc-t31zx-ultimate-16mb.bin,放入FAT文件系统的TF卡内,插入摄像头,进入uboot

fatload mmc 0 0x80600000 openipc-t31zx-ultimate-16mb.bin
sf probe 0
sf erase 0x0 0x1000000
sf write 0x80600000 0x0 0x1000000
reset
set bootargs 'mem=${osmem} rmem=${rmem} console=ttyS1,115200n8 panic=20 root=/dev/mtdblock3 rootfstype=squashfs init=/init mtdparts=jz_sfc:256k(boot),64k(env),3072k(kernel),10240k(rootfs),-(rootfs_data)'
save
reset

编译RTL8188FU无线网卡驱动

顺利进入OpenIPC,主程序majestic正常运行,cmos驱动应该没问题,但是无线网卡没有上线。原来T31的OpenIPC固件包内并没有包含rtl8188fu的驱动,但是github的源码内是有对应的package的,可以自己编译

git clone https://github.com/OpenIPC/firmware.git
cd firmware
make br-rtl8188fu-openipc-rebuild BOARD=t31
cp output/per-package/rtl8188fu-openipc/target/lib/modules/3.10.14__isvp_swan_1.0__/extra/8188fu.ko /mnt/sdcard/

SD卡插入到摄像头

modprobe mac80211
insmod /mnt/mmcblk0p1/8188fu.ko
ifup wlan0

wlan0无法上线,提示找不到设备。原来是无线网卡没有供电,需要找到对应的GPIO给网卡供上电才行。

给无线网卡供电

翻看原始固件的启动日志,找到几个可疑的值,依次尝试后终于找到了正确的GPIO值,为10,将之设为1

echo 10 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio10/direction
echo 1 > /sys/class/gpio/gpio10/value

网卡上线了,设置WiFi SSID和密码

fw_setenv wlanssid CMCC
fw_setenv wlanpass 123456

可以正常连上网了

编辑wlan0网卡的配置文件/etc/network/interfaces.d/wlan0

auto wlan0
iface wlan0 inet dhcp
    pre-up echo 10 > /sys/class/gpio/export
    pre-up echo out > /sys/class/gpio/gpio10/direction
    pre-up echo 1 > /sys/class/gpio/gpio10/value
    pre-up  modprobe mac80211
    sleep 1
    pre-up  insmod /lib/modules/8188fu.ko
    sleep 1
    pre-up wlan_addr=$(fw_printenv -n wlanaddr); if [ -n "$wlan_addr" ]; then ip link set dev wlan0 address $wlan_addr; fi
    post-up wpa_passphrase "$(fw_printenv -n wlanssid || echo OpenIPC)" "$(fw_printenv -n wlanpass || echo OpenIPC12345)" > /tmp/wpa_supplicant.conf
    post-up sed -i '2i \\tscan_ssid=1' /tmp/wpa_supplicant.conf
    post-up wpa_supplicant -B -i wlan0 -D nl80211,wext -c /tmp/wpa_supplicant.conf
    post-down killall -q wpa_supplicant

其他GPIO

GPIO 作用
10 无线网卡供电
16 LED Red
17 LED Green
57 IR-CUT 1
58 IR-CUT 2

GPIO16和GPIO17共同控制LED状态指示灯的颜色,组合如下

GPIO16 GPIO17 指示灯颜色
1 1 熄灭
1 0 红色
0 1 绿色
0 0 黄色

遗憾的是没有找到红外补光灯的GPIO值