上段时间一直在调试LS1046A,先是开发板的熟悉,然后是自主开发板卡的调试测试。中间遇到了很多的问题和障碍,幸运的是最后都一一解决了。准备写一个系列的调试过程记录,希望通过这些记录能为大家提供一些帮助,粗知浅见也希望大家不吝赐教!~
初识LS1046A(一) QorIQ LS1046A是NXP LS系列中的一款高端ARM,具有4个ARM V8 Cortex A72核,最高可以跑到1.8GHz主频。同时高速口很丰富,如支持2路XFI的万兆网口、3个PCIE3.0控制器,其中一个可以配置为X4模式、一个SATA3.0控制器等等,所以LS1046A在高速数据传输和数据存储方面具有很好的接口支持。同时,采用DPAA进行数据链路的加速,这样对数据包、消息信息的多核处理进行了支持。
尽快掌握一款芯片,最好的方法就是先玩一下它的开发板。LS1046A的官方开发板为LS1046ARDB,在设计自主板卡的时候,也可以参照开发板做一些设计,因为软件系统开发主要是以开发板为蓝门进行的。软件开发平台,可以选择NXP V2.0以上的SDK或者LSDK,官方都提供了对LS1046ARDB的支持,不过V2.0版本的SDK需要安装1703的补丁。SDK和LSDK代码很相似,基本上大部分可以无缝移植,不过针对LS系列ARM,官网推荐LSDK,个人也推荐采用最新版的LSDK进行开发,因为亲测了一下,LSDK比SDK编译的时间要少很多~。在虚拟机上(vmware)安装linux系统(ubuntu16.4),之后安装lsdk1803完成软件开发环境的搭建,具体步骤参见:《LSDK-KC-REV0.pdf》。
LS1046A开发相关的工具:
1.
CodeWarrior for ARMv8,安装源为《CodeWarrior Networked Applications Windows Hosted-Offline v2017.03.exe》
2.
CodeWarrior仿真器。
开发板有很多烧写文件:
而对我们开发比较重要的是1. RCW、2. UBOOT、3.FMAN微码、4.itb文件。
RCW(复位配置字)共有512bit,是芯片复位之后执行的必要的硬件配置信息,包括系统时钟、DDR时钟、serdes配置、启动方式、GPIO复用配置等等重要配置。RCW是很重要的,如果RCW配置的不对,则UBOOT是无法启动的,直观表现就是没有打印信息。
RCW需要注意如下几点:
1.
HARD-CODE RCW:主要通过拨码开关或者脚本控制,在板卡初次烧写,或者RCW出错的情况下使仿真器能够正确连接的RCW配置,HARD-CODE RCW配置的定义见datesheet。一般是初次烧写用HARD-CODE模式,之后拨成相应的启动方式启动即可。之后只要
RCW和PBI没有出错,则在其他模式也是可以连接仿真器的。
2.
RCW烧写地址:如果是QSPI的,则启动地址为0x0,文档里面有该地址的定义;
3.
PBL:PBL(pre-boot loader)是加载RCW(和PBI),实现接口配置和初始化的固化代码,如果RCW或者PBI有误,则上报错误代码,错误代码上报到DCFG_CCSR_RSTRQPBLSR[ERR_CODE]寄存器,含义参见《26.4.7 Error codes》。可以通过CodeWarrior的Configure工程进行PBL的调试和错误码的读取:
4.
PBI:PBI(pre-boot initialization command)主要是进行加载接口配置作用的。注意,如果是localbus接口的nor flash是不需要PBI的;而如果是其他接口,如EMMC、SDHC、QSPI等就需要PBI了,它一般位于RCW之后。
5.
RCW生成:在lsdk中修改相应的rcw文件,之后编译生成即可。
根据自己的硬件实际情况,增加、删减或修改RCW文件,如:
#include
SYS_PLL_RAT=6
MEM_PLL_RAT=21
CGA_PLL1_RAT=16
CGA_PLL2_RAT=14
SRDS_PRTCL_S1=4403
SRDS_PRTCL_S2=21849
SRDS_PLL_REF_CLK_SEL_S1=1
SRDS_PLL_REF_CLK_SEL_S2=0
SRDS_DIV_PEX_S1=1
SRDS_DIV_PEX_S2=1
DDR_FDBK_MULT=2
DDR_REFCLK_SEL=1
PBI_SRC=4
IFC_MODE=37
HWA_CGA_M1_CLK_SEL=6
DRAM_LAT=1
SPI_EXT=1
UART_BASE=7
IFC_GRP_A_EXT=1
IFC_GRP_D_EXT=1
IFC_GRP_E1_EXT=1
IFC_GRP_F_EXT=1
IRQ_OUT=1
TVDD_VSEL=1
DVDD_VSEL=2
EVDD_VSEL=2
IIC2_EXT=1
SYSCLK_FREQ=600
HWA_CGA_M2_CLK_SEL=1
.pbi
// QSPI flash clock
write 0x57015c, 0x40100000
write 0x570600, 0x00000000
write 0x570604, 0x40100000
.end
#include
#include
#include
.pbi
// QSPI END_CFG 64 bit LE
write 0x550000, 0x000f400c
.end
前面的字段是RCW字段的配置,与手册上RCW描述是一样的,具体见ls1046a.rcwi文件。下面的部分是PBI的定义和描述。注:未定义字段默认为0.
6. RCW结构:举个例子来说见下图:
其中SYS_ADDR1是RCWSR0的地址0x01ee0100,帧头是0xaa55aa55,之后是RCW配置、PBI配置,SYS_ADDR2是0x61_0040是CRC的检测地址,最后是CRC字段。注意,大小端和自序的关系,例如该RCW是8字节小端模式。
与T2080的RCW对比:
首先,T2080是IFC(localbus)启动,所以不需要PBI。其次,从自序可以看出,T2080为4字节大端模式!在开发时,只需要打开生成的分析一下即可~