=====ConnectCard Wi.MX28/i.MX28和Digi嵌入式Linux系统===== ConnectCard Wi.MX28/i.MX28(以下简称CC28)是Digi的一款微型超薄嵌入式核心板,它大约只有一张名片的三分之一大小,MiniPCIe接口形态,集成有freescale的ARM9处理器和flash,RAM,WiFi/Bluetooth和必要的外围电路,内置U-boot,支持Linux和安卓系统。 Digi的嵌入式Linux系统有两种,Digi Embedded Linux (DEL)是Digi长期以来一直支持和保持更新的嵌入式Linux系统。它具有安装和开发环境简单,上手容易等特点。DEL比较适合第一次接触Linux的开发者,DEL的嵌入式Linux系统是一种传统方式开发的嵌入式Linux系统,它所支持的内核版本比较旧,对硬件支持直接在内核中集成,对于较新的一些开源软件的兼容性比较差。Digi Embedded Yocto(DEY)则是用Yocto编译和定制基于Digi核心板的嵌入式Linux系统。Yocto是一套用于定制Linux系统的开源软件,它提供模板、工具和方法帮你创建定制 Linux 系统。DEY因为采用新的,主流的嵌入式定制技术,内核版本较新,开源软件包的移植也比较容易,因此新的嵌入式项目,通常建议采用DEY来进行开发。 ====Linux中的设备树==== 设备树(Flattened Device Tree )又称FDT或DT,它是一种用来描述系统中的硬件的数据结构。早期嵌入式Linux内核需要包含不同平台的驱动代码,这使得维护Linux内核变成一个艰难的任务。而用设备树描述硬件的方式只需在Linux启动时传导给操作系统,就可以使Linux支持不同的硬件平台,这种方法也代表着Linux发展的趋势。 ====U-Boot 2009和U-Boot 2013==== DEL系统中用到的U-Boot(dub-1.x)是基于U-Boot 2009深度定制的Digi核心板启动器。由于历史的原因它并不能直接支持新的V3.10 Linux内核,为了使旧版的U-Boot支持新内核,需要有一个附带有设备树的特别镜像。 DEY中的U-Boot (dub-2.x)是基于U-Boot 2013深度定制的Digi核心板启动器,它提供了对V3.10以上的Linux内核和设备树的原生支持。 Dub-1.x和Dub-2.x的命令有所差异,根据您所使用的Uboot版本,您需要参考不同的U-Boot手册。 因为Dub-2.x也支持启动DEL的内核,因此对于那些已经使用了DEL,但希望在未来切换到DEY平台下,可以参考本文实现DEL到DEY的切换。 ====从Dub-1.x升级到到Dub-2.x==== 注意:由于DEY的NVRAM定义和DEL不同,所以升级到DEY会破坏DEL中所需要的NVRAM结构,为了使将来有机会回退DEL,您需要做以下一些备份工作: - 在DEL的U-Boot中打印环境变量信息 #printenv #intnvram printall 请将这两条命令的输出保存在文本文件中或云笔记中,并在文件中标记好对应模块标签中的序列号,以便将来恢复。 在tftp服务器上存放有DEY的U-Boot镜像文件,配置好网络接口后,就可以利用update命令直接在Dub-1.x的命令行下升级为Dub-2.x。 #update uboot tftp u-boot-ccardimx28js-2013.01-r0.sb 注意首次启动后,会提示NVRAM尺寸不符,自动调整,这是因为DEY中的NVRAM定义尺寸要比DEL大,用saveenv保存自动调整的参数结果就可以了。 #saveenv 一般地,我们最好还执行一下环境变量恢复默认值的操作 #env default -a #saveenv 在新的Uboot中,需要升级三个分区镜像 update fdt tftp uImage-3.10-r02-imx28-ccardimx28js.dtb update linux tftp uImage-3.10-r02-ccardimx28js.bin update rootfs tftp dey-image-graphical-ccardimx28js.128.rootfs.ubifs 注意,如果tftp服务器上的镜像都改成默认的文件夹名上述命令就可以省略详细的文件夹名。三个文件夹的默认值是: uboot镜像:u-boot-ccardimx28js.sb 设备树区块:imx28-ccardimx28js.dtb Linux内核镜像:uImage-ccardimx28js Rootfs文件夹系统:rootfs-ccardimx28js-128.ubifs ====Dub 2.x和Dub 1.x的区别==== 相比Dub 1.x,新版的U-Boot扩展了很多命令,它和旧版U-Boot相关有以下一些差异: * fdt设备树操作命令集 fdt是用来管理设备树的命令集,可以用help fdt来列出它所有的子命令。其中,最主要的是 fdt addr [] addr子命令告诉U-Boot设备树在内存中的加载位置,执行其它fdt子命令之前需要用这条命令指定好设备树在内存中的区块。 * 设备树相关参数变量 ^ 变量参数 ^ 作用 ^ | fdtimg | 平台二进制设备树文件名 | | fdtaddr | dboot命令加载设备树时,内存的起始位置 | * flash中设备树分区 Dub 2.x中需要有设备树分区来支持设备树,对于第一次从Dub 1.x升级为Dub 2.x的用户,需要用flpart中的reset分区交互命令来重置分区表(flpart->r->l->q)。 重置成功后,典型的flash分区表如下: {{digi:arm-embedded:cc28:dub2-flpart.png?400|}} fdt是个原始分区,不带文件系统,update命令中也支持fdt短分区名以便在需要时可用来更新fdt分区 update fdt tftp * 扩展的dboot命令 dboot命令也支持设备树,当设备树文件名没有作为参数提供时,fdtimg参数定义的文件名就会作为默认值。当直接从RAM启动时,DTB加载位置也作为一个参数值,如果没有提供,则默认是fdtaddr定义的位置。 * 其它区别 **集成bootlets** Bootlets是第二可编程加载器(SPL),它在运行uboot之前用来加载电源轨和i.mx28的SDRAM控制器。在过去SPL代码在U-Boot之外,现在它已经集成到U-Boot的源码树一起编译。 **支持条件脚本** if ; then ; else ; fi; **setexpr表达式计算** **双启动** ====U-Boot环境变量和NVRAM==== 新版的U-Boot分区从8K扩大到16K,升级会自动完成,升级成功后您只需saveenv保存变化。 新版的U-Boot也支持旧版的内核,使用dboot命令您需要注意: 1.tftp启动,需要留意服务器是否有fdt镜像文件,如果有会加载新版内核,如果没有才会加载旧内核 2.内置flash启动,默认是支持设备树,如果要启动旧版内核,需要先删除fdt分区 3.命令行参数。dboot命令会自动生成内核命令行参数bootargs变量,根据所选的启动介质,U-Boot V2013.01为Linux 3.10内核生成一些变量和默认值。旧版内核则需要您传递不同的变量和默认值。   a)Console口变量:V3.10内核是ttyAMA0,115200,而旧版2.6.35内核是ttyAM0,115200 b)旧版内核需传递gpmi到命令行(需要探测NAND驱动),而新版Linux内核不需要,因此旧版内核需要提供gpmi参数(如std_bootarg变量) c)mtdparts参数必须以NAND驱动名打头,在V2.6.35中是gpmi-nfc-nand,而在v3.10中则是gpmi-nand。 ====UBIFS根文件系统==== DEY中默认的文件系统是UBIFS格式,要更新UBIFS分区您首先需要将UBI卷贴到一个MTD分区,然后用UBIFS镜像来update该UBI卷。 比如要更新并加载USERFS分区(/dev/mtd5) # ubiattach /dev/ubi_ctrl -m 5 # ubiupdatevol /dev/ubi1_0 然后就可以用下面命令加载 # mount -t ubifs /dev/ubi1_0 注意,要更新一个UBI卷,MTD分区需要先卸载。因此,当你从flash运行时不可能更新RootFS分区,您需要用update命令或从NFS启动来更新根文件系统。 更多UBIFS资料,请参考http://www.linux-mtd.infradead.org/faq/ubi.html ====从U-Boot 2.x回退到U-Boot 1.x==== 如果您升级到U-Boot 2.x,我们不建议你回退到U-Boot 1.x。如果您打算这么做,您需要在升到到2.x之前已经充分做好了各种备份工作。 降级后需要做的包括: #intnvram reset #intnvram save 重启后 #flpart r-l-q,并保存分区 恢复mac地址等各种参数 #intnvram set module ethaddr1=00:04:F3:XX:XX:XX 对应网口ENET0的ethaddr #intnvram set module ethaddr2=00:04:F3:XX:XX:XX  对应wlanaddr #intnvram set module ethaddr3=00:04:F3:XX:XX:XX  对应ENET1的eth1addr #intnvram set module btaddr1=00:04:F3:XX:XX:XX 对应蓝牙btaddr