76 lines
5.4 KiB
Markdown
76 lines
5.4 KiB
Markdown
# smc测试例程说明文档
|
||
|
||
本测试程序用于测试smc基础功能,包括对smc寄存器读写、通过smc api或者cache访问外部psram数据等例程。
|
||
|
||
## smc简介
|
||
|
||
smc全程为spi psram controller,从属于EMC(external memory controller)模块,是芯片内部封装的用于访问外部psram的功能模块,简化了软件访问外部psram的逻辑和时序,其主要特点如下:
|
||
|
||
* 支持软件访问和cache访问。
|
||
* smc内部具有的512字节ram(此ram空间和sfc共用,且不能同时使用),提高软件访问psram的效率。
|
||
* DP(data path)逻辑实现spi和控制器之间的时钟跨域处理以及数据支持自动加密、解密(AES)。
|
||
* 支持io map逻辑,实现spi接口信号的remapping操作,方便适配不同flash芯片接口。
|
||
* 支持io share,实现sfc和smc io分时复用。
|
||
* 支持spi接口任意波形发生器(可配置posedge或者negedge收发,可增加dummy cycle来改善io timing)。
|
||
|
||
smc常规用法是配置为cache访问,即访问psram时不通过smc api进行,而是直接通过cache访问psram映射到总线上的地址空间。
|
||
|
||
## 测试例程说明
|
||
|
||
sfc测试例程使用到的外设包含smc、uart、gptimer、cache。
|
||
|
||
* smc:测试对象,用于测试smc对外部psram的访问和控制。
|
||
* uart:使用uart0,实现调试信息打印,接收case配置信息等与PC的交互功能。
|
||
* gptimer:使用gptimer0,用于计算全片读写psram时用时情况。
|
||
* cache:通过cache高效的读写psram。
|
||
|
||
smc测试例程遵循自动化测试框架,在例程执行之后,初始化串口0,通过串口发送“start”字段到PC,并等待PC发送“config”字段来获取本次需要执行的测试case,如果在规定时间内(9s)没有收到测试case信息,则默认测试所有的case。
|
||
|
||
在获取到case组合之后,初始化emc、smc,cache以及gptimer,并根据case组合开始执行测试case。
|
||
|
||
### case0:获取psram大小测试
|
||
|
||
该功能通过在ram.bin程序中使用,用于判断模块拥有的psram是否和烧录固件中定义的一致。
|
||
|
||
其实现的原理是运用的psram所具有的写环回机制实现的,当写指令发送到psram时,psram芯片会判断地址是否合法,如果地址超出psram本身大小,则截断高位地址,并将数据写入低位地址中,例如psram大小为4m,当smc写入的地址为0x400000时,地址会被截断为0x000000,当地址为0x500000时,地址会被截断为0x100000。利用该原理,从0地址开始,增量为0x100000,对地址进行写入操作,并在0地址读取数据,当发现0地址数据和写入数据一致时,则认为发生写环回,当前写入的地址则为psram实际大小。
|
||
|
||
**cache具有的space寄存器,主要功能是拦截地址非法的指令发送到flash\psram**,如配置smc_space为4,表示最大允许访问的psram地址为4m,超出4m的读写操作将直接被抛弃,不会发送到psram中。
|
||
|
||
在实际的测试中,能正确的测试出psram大小。
|
||
|
||
### case1:通过smc api读写psram数据测试
|
||
|
||
【注】kl3的smc取消了内部的buffer,改为和sfc共用同一个buffer,但是同一时刻,仅能有一个外设使用该buffer,sfc是固定要使用该buffer的,因此smc的驱动中,使用buffer的trans mode仅用于测试。
|
||
|
||
smc读写API主要有两个方式:
|
||
|
||
1. 使用内部buffer,配置smc为trans_mode,将数据将拷贝到buffer中,一次性发送到psram,读取时硬件自动将数据保存到buffer中,等读取完成后,只需要将数据从buffer中拷贝出来即可。
|
||
2. 使用寄存器方式,配置smc为reg_op_mode,每次写4个字节数据到wdata寄存器中,每次发送地址重新配置地址,通过循环发送的方式将数据发送到psram。读取同理。
|
||
|
||
然而在测试的过程中遇到如下问题:
|
||
|
||
1. 使用上述两种发送方式,即使wdata寄存器和buffer都存在有效数据的情况下,每次发送的数据都是0x00。
|
||
2. asic提示要将soft_smc_mode置1,在置1之后重新测试,两种发送发送均出现发送完地址之后,cs信号拉高,结束了本次发送。
|
||
|
||
针对以上两个问题,asic建议smc先保证cache读写psram正常,smc api读写psram的方式后续asic进行仿真,查找异常原因,目前先禁用该测试。
|
||
|
||
### case3:cache读写psram测试
|
||
|
||
本测试相对简单,主要验证所有cache访问psram的有效性。测试步骤如下:
|
||
|
||
1. 使用icache0在psram 0x00地址写入4k数据。
|
||
2. 轮流使用所有cache读取该地址,并判断读出的数据和写入数据是否一致,不一致则判定测试失败。
|
||
|
||
为了确保cache中的数据被写入到psram中,需要使用flush函数和invalidata函数将数据刷新到psram或者同步psram数据到cache中。
|
||
|
||
测试结果OK。
|
||
|
||
### case4:psram全片读写测试
|
||
|
||
本测试相对简单,主要验证psram芯片完整性,测试步骤如下:
|
||
|
||
1. 使用icache0对psram全片写入0x55。
|
||
2. 使用icache0读出全片数据,读的过程中对比数据是否和写入数据一致,如果不一致,则认为测试失败。
|
||
3. 将写入数据更改为0xaa,重复步骤1和步骤2。
|
||
|
||
这里为了缩短本测试时间,将cache_wr_auto_load寄存器位置0,即当cache miss时不自动同步数据(事实上本例程独立执行,此时cache没有其他人,基本很少发生cache miss),测试读写4m psram所用时间为14678us。 |