昨天终于拿到了MarS Board。本来上周就应该到的,结果销售人员给我发了块BeagleBone Black... 要是给我的是Sabre Lite也就算了。发错货总是消费者吃亏,好像没怎么听说过占便宜的,这种现象不知有没有人专业研究的可以探讨下哈。不过MarS Board看上去很cool,红色的板子小巧只有巴掌大。本人对嵌入式系统无任何经验,只是为了建造『家用多用途变形机器人』的伟大目标而开始进入这一领域。MarS Board的ARM核心是Freescale i.mx6, 性能比较强劲。虽然在单板微型电脑市场流行树莓派(Raspberry Pi),但是树莓派的性能达不到我的性能设计要求。另一款Cubieboard性能不错,只是它的核心是全志的A10,由于厂商的限制很多资料都不开放,造成了很多问题,例如对高清视频硬解码的困难。相比之下,Freescale就上路多了。Mars Board发挥了i.mx6的大部分功能,没暴露SATA接口是一个遗憾,不过只有Sabre Lite一半的价钱应该很超值了。树莓派的一大优势是有强大的用户社区,有什么困难都能很方便的找到帮助。Mars Board基本上就没有社区,只有自己摸索了。
首先是用Mini USB线连接PC和调试端口。运行终端仿真程序,选择串口,设置波特率为115200,然后连接MarS Board。把电源线插入插座,这时板子开始运行u-boot。默认u-boot会装载mmc上的Linux映像完成引导。MarS Board支持多种显示输出,包括LCD并行,LDB(LVDS),以及HDMI。不过我把HDMI线连接我的显示器到板子的HDMI口,却没有看到任何信号。调试窗口却有如下信息:
mxc_hdmi mxc_hdmi: PHY PLL not locked
mxc_hdmi mxc_hdmi: PHY PLL not locked
mxc_hdmi mxc_hdmi: same edid
mxc_hdmi mxc_hdmi: PHY PLL not locked
mxc_hdmi mxc_hdmi: PHY PLL not locked
说明书很简略,只能自行研究如何在Linux配置。
板子上有个reset按钮,按一下重启系统,等出现倒计数按任意键可以进入u-boot设置。使用printenv可以显示所有环境变量。其中bootcmd和bootargs是我所关心的。
setenv bootcmd 'mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'
bootcmd是启动命令。分号是命令的分隔符。mmc dev #用来选择mmc设备。板子上只有1号设备。mmc read把mmc上的Linux启动映像装载到内存。bootm开始boot。
setenv bootargs console=ttymxc1,115200 root=/dev/mmcblk0p1 rootwait rw video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 fbmem=10M vmalloc=400M
bootargs是传递给kernal的参数。console=ttymxc1,115200用来设置kernal信息发往哪个console,ttymxc1是调试终端。root=/dev/mmcblk0p1设置文件系统在哪个分区。rootwait表示要到设备就绪后才挂载。video参数设置视频输出,这里我设置hdmi端口到fb0。
设置好环境变量后可以使用saveenv来保存变动。boot后应该HDMI信号就有了,虽然还是黑屏的状态。要测试HDMI是否工作,可以往/dev/fb0中随意写入一些数据,例如:dd if=/dev/urandom of=/dev/fb0 。然后就可以看到屏幕上出现一些点点...
接下来的任务就是让屏幕上输出有意义的信息,有待进一步研究。
把console改成tty1,这样kernal信息会输出到第一个终端:
setenv bootargs console=tty1 consoleblank=0 video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 fbmem=10M vmalloc=400M video=mxcfb1:off video=mxcfb2:off root=/dev/mmcblk0p1 rootwait rw
saveenv
boot
果然HDMI显示器上输出了boot信息。我把无线键鼠的usb接收器插入MarS Board的USB插槽,这样就可以在终端进行输入了。