上一篇文章《图像识别DM8127开发攻略——开发环境搭建》介绍了DM8127的开发环境搭建,按本人开发攻略思路,本篇是要先写《图像识别DM8127开发攻略——软件架构浅析及编译》的,但发现如果没有搞清楚DM8127的板子如何启动,就不太好解析整个RDK的编译过程,所以本人这里先把DM8127板子的启动过程先描述一下,让大家从硬件上和软件运行角度了解整个DM8127的工作过程,然后再去学习IPNC_RDK里面的开发包架构以及开发包的移植工作。

 

上电——→DM8127内部片上的ROM CODE运行——→ROM CODE读取SYSBOOT PINS电平状态决定是从NAND FLASH BOOT还是 UART0串口 BOOT或者SD卡BOOT或者PCIe BOOT或者EMAC BOOT或者XIP BOOT——→读取ubootmin并运行ubootmin(ubootmin取得ARM控制权)——→读取u-boot并运行u-boot(u-boot取得ARM控制权)——→读取linux内核BIN并运行linux 内核(linux-2.6.37取得ARM控制权一直到板子复位或者断电)——→挂载文件系统(可以是存放在NAND FLASH的ubifs,squashfs,或者NFS)——→运行文件系统的脚本——→运行IPNC_RDK整个DEMO应用程序system_server,boalive555等,启动VPSS M3核,启动VIDEO M3核,启动浮点DSP C674X核。

 c320ced85a572ae3dd9e78825c745c61.jpg-wh_

 

整个过程可以通过上图直观了解。

一、运行ubootmin

一开始上电,DM8127主芯片内部有ROM CODE,这个是使用片上的内部RAM运行的,还没用片外的DDR3,如果新做的板子什么程序也没有,只要TPS659113电源管理芯片的供电时序正常,主晶振正常工作,那么ROM CODE就会正常运行,先读取SYSBOOT PINS(就是BOOT MODE那几个外接上拉下拉电阻的管脚状态),如果对应的那些NAND FLASH或者SD 卡或者PCIe等接口没有程序,那么DM8127这时会通过UART0 不断输出C C C C C C ……..的打印字符,试图通过UART0进行通讯下载UBOOT-OPTI BIN文件(这个UBOOT-OPTI后面介绍UBOOT移植的时候再分析)。

至于运行ubootmin这第2步骤,可以用两种方式运行方式说明一下:

1、就是在第1步没上电之前,通过TF卡(SD卡),TF卡预先COPY两个文件:MLO 和u-boot.bin到卡上,TF卡格式化成FAT32,并且是8倍速以下的卡。这个两个文件就是后面要提到的ubootmin编译和uboot-2010.06编译。其中ubootmin编译得到就是MLO文件,uboot-2010.06编译得到就是u-boot.bin。TF(SD卡)先插上到板子上面,然后给板子上电,这样就会从SD卡BOOT,运行MLO,也就是运行ubootmin。ubootmin这里就会去做很多底层驱动的初始化工作,包括DDR3初始化,这里提到一点,ubootmin还是运行在片内的RAM,并没有运行在外部DDR3。

2、还有一种超大规模工厂生产的时候,NAND FLASH可以预先烧写ubootmin BIN文件和 uboot-2010.06 BIN文件,内核BIN文件,文件系统BIN文件,然后再给SMT工厂贴片,那么这时从工厂拿回来的DM8127板子在没有硬件短路的情况下,根据硬件电路默认设置SYSBOOT PINS为NAND BOOT,那么一上电就会运行NAND FLASH 里面的ubootmin。

 

在没有程序的情况下,其实绝大部分都是使用第一种方式SD卡BOOT的方式去运行ubootmin。等到烧写好ubootmin和UBOOTBIN到NAND 的时候,我们才不需要SD卡 BOOT。所谓通过SYSBOOT PINS外接上拉电阻和下拉电阻的电平状态来BOOT ubootmin:

09335386e3e25d093d7efdf846145003.jpg-wh_

只能说是优先从哪种方式BOOT,而TI 内部ROM CODE会自动从优先的BOOT MODE去找对应的ubootmin,比如从NAND 优先BOOT,但是NANDFALSH没ubootmin,那么ROM CODE会去找SD卡BOOT(又叫MMC BOOT),如果SD卡里面没有MLO 和u-boot.bin,ROM CODE 继续找SPI BOOT,如果SPI BOOT 不成功,继续找UART0 口去BOOT,ROM CODE会一直列举完几种BOOT 模式。

 

二、运行完整uboot

ubootmin初始化结束后,会去读取uboot-2010.06 BIN文件并运行完整的uboot,即uboot-2010.06。完整的uboot-2010.06正常运行,那么可以通过网络TFTP等操作去烧写,然后就去运行linux内核了。这个完整的uboot运行是在DDR3了(代码映射到DDR3存储地址段不能和kernel冲突),有关uboot-2010.06的移植后面再单独写写,这里不累赘。

 

三、运行linux内核

 uboot-2010.06 会通过各种方式(读取NAND 里面的BIN文件或者TFTP 下载内核)并运行内核,ARM控制权交给内核,这个linux内核也是运行在DDR3。

 

四、内核挂载文件系统

   这个也不需要累赘,做过linux嵌入式开发都知道,研发先使用NFS调试通,然后再制作ubifs BIN文件或者squashfs BIN文件烧到板子NAND FLASH去。

 

五、执行文件系统的脚本

首先会去运行文件系统etc里面的一大堆脚本,最后再运行/etc/init.d/finish_ubifs.sh的脚本:

cd/opt/ipnc

./init.sh

./system_server

sleep7

./autorun_ipnc.sh

这些脚本的内容可以去对应的NFS文件系统目录打开看看。

运行DEMO程序这些都会在system_server这个应用程序去打开,或者并行去打开。都是LINUX 应用层面的程序。

 

六、其他3个核的启动

启动VPSS M3核(ipnc_rdk_fw_m3vpss.xem3),启动VIDEO M3核(ipnc_rdk_fw_m3video.xem3),启动DSP 核(ipnc_rdk_fw_c6xdsp.xe674)都有对应的load脚本。见下面2张图:

da8ff9998c4c0e4e0c46497836b39d72.jpg-wh_

 

9fe6e7175631325ae920adc8f6f251c1.jpg-wh_

 

注意上面两张图的路径,知道这些程序和脚本放在什么地方。

其实在system_server应用程序可以使用类似以下方法执行这些脚本:

              system("./scripts/load_vpss.sh&");

       system("./scripts/load_video.sh&");

system("./scripts/load_c6xdsp.sh&");

 

 

好了,有关DM8127的启动过程就写到这里,要深入了解,建议还是拿板子进行调试,理论的东西不如手动去验证,通过实际操作,才更好掌握DM8127 这个ARM+浮点DSP的开发方法。

   (题外话,有些网友通过本人QQ2505133162了解DM8127是否可以做深度学习算法,本人通过很多方面得到个人结论:DM8127不适合复杂的深度学习算法,只能做车牌识别,人脸识别,智能安防IVS这些产品,TI DAVINCI 平台有适合自动驾驶的DM505解决方案,可以做一些深度学习算法,我们目前还没有这个平台。)