本文均属自己阅读源码的点滴总结,转账请注明出处谢谢。

欢迎和大家交流。qq:1037701636 email: gzzaigcn2009@163.com,gzzaigcn2012@gmail.com

开发工具CCS5.1,Source Insight。

这篇博客主要和大家分享,AIS文件的制作与使用。什么是AIS,TI对其的定义为Application Image Script,应用镜像脚本,是用来对Image的一种格式定义,从数据源的本质去分析就是一个保存了大量二进制数据的类型存储起来。而AIS中基本的数据大小为一个word 32位bit。包括命令、包括数据等。

AIS文件核心的是由Second boot和APP的两个镜像打包在一个文件当中去,然后自动添加一些命令行信息,数据存储格式为little Endian。

A.如下所示是AIS中命令字。称之为Opcode。在前面所说到的RBL中,内部固件会都下面的一系列Opcodes进行解析,然后做进一步处理。

上诉的命令字使用频率最高,且最为重要的是Section Load,Request CRC,Enable CRC,Jump Close,Function Execute。

1.Section Load:加载段,Dsp中往往在cmd中生成各种类型的段,包括数据,代码,未初始化数据,自定义段等。这些在AIS文件中都是在Section load命令字的后面存在。如下所示:

图中的address指定了数据加载到存储空间的地址,SIZE指定数据大小,接着的是有效的raw data。所有单元格都占据一个word的空间。

2. CRC相关的命令字

CRC Request和Enable等分别用于对加载的数据进行CRC校验,比如1中的Load Section完成时,会对加载的数据包括SIZE,ADDRESS做CRC校验,最终得到一个数据,而这个crc数据,将会和AIS指定的expected CRC value做比较,查看是否读取的内容完全正确,保证数据的读取无误。

3.Jump close command.跳转关闭指令

跳转关闭指令,该指令是意味着AIS文件 结束。用户可以跳入到自己的APP程序去执行,其后的一个字代表跳入的程序空间所在的位置。

4. Function Execute Command 函数执行命令

在AIS的解析文件读取到该命令字时,会继续读取,往往这些命令字是在AIS文件的最开头,比Second Boot还要先执行。完成的比如dm6437的包括PLL,DDR,EMIFA三个功能。这些全部在RBL中被执行。为Secnod Boot打好硬件的配置。具体内容将会在后面介绍。

B .基于SPI24 boot的AIS文件

在第一篇博文中,说到boot的方式为SPI24 norflash启动。那么如何在AIS文件中体现出来,并反馈给RBL呢?

上图就是典型的一种SPI AIS文件的数据格式。第一个word代表SPI的位长,即操作的flash的地址位大小,这里24位的需为0x00000003。然后第二个word为固定的幻数,大小固定0x41504954。

C.AIS文件的制作与生存。

AIS文件作为一个镜像文件,那他是如何生成的呢。主要包括以下内容:

1.Second_boot源码。

该源码开源,下载的网址为http://processors.wiki.ti.com/index.php/DM643x_24-bit_SPI_Secondary_Boot_Loader

主要包括对norflash的读、写操作以及核心的boot代码。

2.Second boot代码解析。

阅读过代码后,初步发现该代码的功能其实也体现出RBL的一些功能。SPI通过32位的包,读取每一个Command命令字,然后对命令字做解析。

void main(void) {      //RBL加载Second_UBL后,跳入这里执行用于加载APP

    /* Enable caching. */
enable_L1_cache(); initBoot();
performNandBoot();//读取并解析APP的AIS文件,读取相关section到指定区域 /* Disable Caching */
disable_L1_cache(); /* Jump to application start point */
TARGET_BOOT_STATUS.applicationStart(); //PC跳入到APP的main入口所在的地址处,开始运行应用程序
}

TARGET_BOOT_STATUS.aisStreamPtr = (Uint32) SPI_APPLI_IMAGE_ADDRESS;//偏移10Kb,AIS Image APP的地址
TARGET_BOOT_STATUS.status = parseAisData();//解析并且加载APP AIS Image到指定位置。

SPI_APPLI_IMAGE_ADDRESS这个地址,指定了APP Image在AIS文件中的存储位置,用户可以根据自己的需求进行修改。这里默认的10KB之前的代码称之为Second boot。即RBL会读取到DDR中执行。Second boot启动后运行上面的main函数,开始对APP部分的镜像做解析。主要是把几个核心的Section加载进来。并对每个数据段都要做CRC的校验,以免数据由误差。

最后是如何跳入APP的程序入口的呢?我们知道一旦读到Jump close命令,将会把APP的地址传入到函数指针,调用该函数指针后,就会跳入APP所在的程序开始运行(一般也就是main所在的地址空间)。如下:

TARGET_BOOT_STATUS.applicationStart(); //PC跳入到APP的main入口所在的地址处,开始运行应用程序

这样就实现了一个完整的RBL+SBT+APP的完整启动过程。而所有的镜像都以AIS文件存在,体现了其的重要性。

AIS文件的制作命令:

AIS文件的制作需要用到一直叫perl的脚本命令,一般需要在window上进行手动安装,Linux有专门的命令安装。

准备好Second boot和APP的2进制镜像文件(需要通过专门的软件将CCS编译出来的out文件),依次按照如下步骤执行:

a.编写perl的window 批处理文本.bat:

C:\Perl\bin\perl.exe genAIS.pl -otype bin -i led.out -o led.hex -bootmode spimaster -memwidth 8  -datawidth 8 -addrsz 24 -cfg evmdm6437.cfg
pause

先要写入perl的命令,整个是基于perl的system()函数来执行的。后面的配置内容含义如下所示:

但是有如下几点要注意:-otype貌似最新版本的genAIS.pl只支持bin不能写成binary ,bootmode后面spi要写成spimaster,不然写成spi是无效的

上述的配置命令在批处理文件中体现出来,这里不在讲述。

根据以上内容,genAIS.pl分别最终生成bin格式的Second boot和 APP两个AIS文件。类似如下数据包:

00000000h: 03 00 00 00 54 49 50 41 0D 59 53 58 00 00 03 00 ; ....TIPA.YSX....
00000010h: 15 00 00 00 00 00 00 00 00 00 00 00 0D 59 53 58 ; .............YSX
00000020h: 01 00 05 00 FC FF FF 3F FC FF FF 3F FC FF FF 3F ; ....??????
00000030h: FC FF FF 3F 00 00 00 00 0D 59 53 58 02 00 09 00 ; ??.....YSX....
00000040h: 17 00 00 00 01 00 00 00 0B 00 00 00 00 00 00 00 ; ................
00000050h: 05 64 00 50 22 88 13 00 48 21 49 16 02 C7 0C 00 ; .d.P"?.H!I..?.
00000060h: EF 04 00 00 03 59 53 58 01 59 53 58 00 00 FF 87 ; ?...YSX.YSX..?
00000070h: A0 10 00 00 C6 11 47 03 20 41 12 30 58 23 90 01 ; ?..?G. A.0X#?

可以看到基本的数据结构和上面所述的基本相同,0x00000003表示是SPI24位的操作。只是这里添加啦一部分function函数头,用于配置PLL,DDR2,EMIF等,这部分内容就在-cfg中的文件,这部分内容直接拷贝到生成的AIS文件,而不会对out文件进行解析生成。只是简单的复制到AIS文件的开头。典型的dm6437.cfg如下所示:

0x5853590D  #Function Execute Command
0x00030000 # Selects PLL configuration function, with 3 arguments
0x00000015 # PLLM value
0x00000000 # PLLDIV 0
0x00000000 # Clock source
0x5853590D #Function Execute Command
0x00050001 # Selects EMIFA configuration, with 5 arguments
0x3FFFFFFC # AB1CR control register mask
0x3FFFFFFC # AB2CR control register mask
0x3FFFFFFC # AB3CR control register mask
0x3FFFFFFC # AB4CR control register mask
0x00000000 # NANDFCR control register mask
0x5853590D #Function Execute Command
0x00090002 # Selects DDR memory configuration, with 9 arguments
0x00000017 # DDR PLLM
0x00000001 # PLL SRC
0x0000000B # DDR CLLK DIV
0x00000000 # VBPE CLK DIV
0x50006405 # DDR Control register mask
0x00138822 # SDRAM Config register mask
0x16492148 # SDRAM Timer 0 register mask
0x000CC702 # SDRAM Timer 1 register mask
0x000004EF # SDRAM Refresh control register mask 

b.使用combineAIS.pl 将两个AIS文件打包成为最终 的一个合成的AIS文件

perl combineAIS.pl SPI_Secondary_boot.bin myAppAIS.bin finalAIS.bin 10

这里的10表示,APP偏移10kb在AIS文件中。

到这里整个AIS的文件制作的过程就结束。

总的来说dm6437基于这种AIS文件的启动方式,简单方便,有利于开发,对其深入理解有好处,可以自由的设置AIS文件。

DM6437 dsp系列之启动过程全析(2)—AIS文件解析的更多相关文章

  1. nand烧写分析/内核在启动过程中式如何将这个文件映射成/目录及各子目录的?

    我用的是ramdisk.image.gz,烧写在flash的0x10140000处 我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的? 如果ramdisk.image.gz在flas ...

  2. 【凯子哥带你学Framework】Activity启动过程全解析

    It’s right time to learn Android’s Framework ! 前言 学习目标 写作方式 主要对象功能介绍 主要流程介绍 zygote是什么有什么作用 SystemSer ...

  3. Android 启动过程简析

    首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...

  4. 【转载】【凯子哥带你学Framework】Activity启动过程全解析

    It's right time to learn Android's Framework ! 前言 一个App是怎么启动起来的? App的程序入口到底是哪里? Launcher到底是什么神奇的东西? ...

  5. 专家揭秘:STM32启动过程全解

    电子发烧友网核心提示:本文主要阐述了STM32启动过程全面解析,包括启动过程的介绍.启动代码的陈列以及深入解析. 相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方 ...

  6. Linux进程启动过程简析

    朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 今天,我们将通过 ...

  7. Activity启动过程全解析

    几个系统关键对象: ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期 ActivityThread,App的真正入口.当开启App之后, ...

  8. Tomcat启动过程(二):EndPoint解析

    EndPoint提供基础的网络IO服务,用来实现网络连接和控制,它是服务器对外I/O操作的接入点.主要任务是管理对外的socket连接,同时将建立好的socket连接交到合适的工作线程中去.里面两个主 ...

  9. 【STM32H7教程】第13章 STM32H7启动过程详解

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章       STM32H7启动过程详解 本章教 ...

随机推荐

  1. Oracle 中按条件过滤重复记录

    在数据处理中,经常会遇到类似这样的情况:数据库中存在多条记录,其中某些字段值相同,其他字段值不同.实际的业务需要针对这样的情况,只保留一条数据,其他数据删除.如何做到呢?在sql中有top关键字相对容 ...

  2. Ubuntu下访问SSH

    ssh程序分为有客户端程序openssh-client和服务端程序openssh-server.如果需要ssh登陆到别的电脑,需要安装openssh-client,该程序ubuntu是默认安装的.而如 ...

  3. Laravel Eloquent ORM

    Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...

  4. linux core dump学习

    1. core dump是什么? core dump又叫核心转储,当操作系统收到特定的signal时, 会生成某个进程的core dump文件.这样程序员可以根据 已经生成的core dump文件来d ...

  5. .net中将DataTable导出到word、Excel、txt、htm的方法

    dt:DataTable strFile:fileName strExt:type private void GridExport(DataTable dt, string strFile, stri ...

  6. Linux目录结构及文件基础操作

    一.Linux目录结构 windows系统中主要以存储介质为主(磁盘). UNIX和Linux系统中主要是以目录为主(以树形目录结构的形式构建整个系统). 1. FHS(Filesystem Hier ...

  7. ios9API基础知识总结(二)

    UIAlertView(警告框) UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"标题" message:@&qu ...

  8. 7 Hbase put方式插入数据

    package com.hikvision.hbase.vertify.test; import org.apache.hadoop.conf.Configuration; import org.ap ...

  9. linux打开80端口及80端口占用解决办法

    linux打开80端口天客户那边有台服务器同一个局域网中都无法访问,排除lamp环境问题,发现时服务器中的防火墙没有开启80端口. 代码如下 复制代码vi /etc/sysconfig/iptable ...

  10. OpenGL ES 2.0 混合

    混合技术 混合技术就是将俩个片元调和,主要用于将通过各项测试准备进入帧缓冲的片元(源片元)与原有片元按照设定的比例加权计算出最终片元的颜色值. OpenGL ES 2.0中是通过设置混合因子来指定两个 ...