This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM335X nor flash启动设计注意要点

Other Parts Discussed in Thread: SN74AVC32T245, SN74LVC16374, AM3359, AM3352

各位好!在支持客户的过程中,一些客户在设计nor flash启动应用时,遇到一系列问题。现在AM335X上设计nor flash启动的相关要点总结如下,供大家参考。

1. 关于nor flash启动的信息

可以参考TRM的26.1.7.2 XIP Memory章节,在这里就不详述了。

2. 设计时注意点

由于AM335X的管脚有限,所以在应用中许多客户会考虑采用GPMC数据线/地址线复用的方式连接外部的nor flash。这样可以将GPMC_AD[15:0]即作为16bit数据线,又作为低16bit的地址线。

那在这种情况下,针对具体设计,需要注意哪些地方?

在上述应用中,GPMC_AD会从即作为16bit数据线,又作为低16bit的地址线;从TRM的Table 7-5. GPMC Pin Multiplexing Options表格中可以知道,GPMC_A[10:1]会作为nor flash的高位地址线。而GPMC_A[10:1]存在两种复用方式,即可以将AM335X的pinmux mode0的这一组pin复用为GPMC_A[10:1],也可以将另一组复用为GPMC_A[10:1]。

Signal

ZCZ Pin Map(Pinmux mode0 )

ZCZ Pin Map (Pinmux mode1 )

GPMC_A1

V14

R2

GPMC_A2

U14

R3

GPMC_A3

T14

R4

GPMC_A4

R14

T1

GPMC_A5

V15

T2

GPMC_A6

U15

T3

GPMC_A7

T15

T4

GPMC_A8

V16

U5

GPMC_A9

U16

R5

GPMC_A10

T16

V5

针对上述的两种连接,设计原理图时,需注意。

(1)采用pinmux mode0组的连接时,需注意

    (a)latch需要采用上升沿锁存的,而不能使用电平锁存的。这是由于AM335x内的ROM CODE在nor flash启动时,有一组固定的GPMC时序。

    (b)高位地址线需要作下拉处理。由于ROM CODE在nor flash启动时,只对GPMC_AD[15:0]进行了初始化,而未对GPMC_A[10:1]进行。如果需要ROM CODE在启动初期时能够正确看到nor flash的地址空间,需要对高位地址线作下拉处理。

(2) 采用pinmux mode1的连接时,需注意

由于此时GPMC_A[10:1]与LCD_DATA复用,而LCD_DATA又在启动初期作为SYSBOOT管脚使用,在其管脚上会根据启动序列的选择存在相应的上下拉。这就与(1)中要求的nor flash启动初期需要对GPMC_A[10:1]一直保持下拉存在冲突。所以在这种应用下,需要增加一个bus transceiver对两者进行隔离。见下图。

由于SYSBOOT的管脚状态只有在PORz的上升沿才会读取。而warm reset的输入管脚nRESET_OUT会在PORz完成后持续一段时间低电平,可参考TRM的Figure 8-19. PORz。所以可以通过此信号来作为Bus transceiver的控制信号。当nRESET_OUT为低时,根据SN74AVC32T245的逻辑,连接在总线上的信号会是A到B,期间PORz信号的上升沿触发时段,可以读取SYSBOOT的管脚状态。当nRESET_OUT持续一段时间低电平后,其电平会变为高,此时Bus transceiver则会将A侧的GPMC_A[10:1]与B侧SYSBOOT的上下拉隔离开。

  • 软件方面:

    在SDK-05.06.00.00及之后的版本的U-boot中已经添加了Nor flash启动的代码。在使用时,需要注意

    nor flash为XIP memory,其启动时不需要将SPL拷贝到RAM中运行,而可以直接在nor flash进行。由于nor flash启动,ROM CODE只对低16位地址进行了初始化,所以启动时只能访问0x08000000起始的64K x 16bit的地址空间。在此初始化中,u-boot.bin会执行对nor flash高位地址的初始化,以便后续AM335X能访问nor flash的整个地址空间。

    在u-boot/board/ti/am335x/board.c中的s_init函数中有对高地址线进行初始化的代码:

     

    #ifdef CONFIG_NOR_BOOT

    asm("stmfd      sp!, {r2 - r4}");

    asm("movw       r4, #0x8A4");

    asm("movw       r3, #0x44E1");

    asm("orr        r4, r4, r3, lsl #16");

    asm("mov        r2, #9");

    asm("mov        r3, #8");

    asm("gpmc_mux:  str     r2, [r4], #4");

    asm("subs       r3, r3, #1");

    asm("bne        gpmc_mux");

    asm("ldmfd      sp!, {r2 - r4}");

    #endif

     

    在选择上述表中的pinmux mode 1时,即nor flash的高位地址线连接的GPMC_A[10:1]是pinmux mode1组对应的管脚,则u-boot中不需要做修改。而如果连接的是表中的pinmux mode 0组对应的管脚,即需要修改代码如下:

    #ifdef CONFIG_NOR_BOOT

    asm("stmfd      sp!, {r2 - r4}");

    asm("movw       r4, #0x844"); Start point Change from LCD_DATA1 to GPMC_A1

    asm("movw       r3, #0x44E1");

    asm("orr        r4, r4, r3, lsl #16");

    asm("mov        r2, #8"); Change #9 to #8, GPMC_A1 to GPMC_A11 as mode0

    asm("mov        r3, #11"); Change #8 to #11, because there are 11 lines.

    asm("gpmc_mux:  str     r2, [r4], #4");

    asm("subs       r3, r3, #1");

    asm("bne        gpmc_mux");

    asm("ldmfd      sp!, {r2 - r4}");

    #endif

    另外,对应上述两组不同的连接时,SYSBOOT对应的设置也不相同。如选择pinmux mode0组的连接,则需要配置SYSBOOT,选择XIP(mux1)或者XIP(mux1) w/WAIT0启动。而选择pinmux mode1时,则需要配置SYSBOOT,选择XIP(mux2)或者XIP(mux2) w/WAIT0启动。

  • 事实上,我所在团队可能是国内比较早的使用Nor Flash启动方案的(2012.06)

    我们用的数据地址非复用模式.

    我们没有用地址锁存器.

    所以实际的Boot地址空间只有4K,而且受高位地址线的SYSBOOT以及内部上拉的影响,理论上启动地址0x08000000变成了0x08741000.

    我们的做法是将错就错,将第一级的Boot压缩在4K以内,并且烧写到0x08741000.如此,CPU启动后将会在0x08000000载取到Boot代码.

    不知是否理解我的表述.

  • 用的是16bit的nor flash吗?

    boot的地址空间只有4K?

  • Y tck,请教一下,高位地址线在不拉低的情况下启动地址为0x08741000是怎么算出来的?

  • 16-bit,数据地址非复用,所以实际可用地址线只有A0~A11,也就是只有4KBYTE

  • 首先,0x08000000,不用解释

    0x00700000,这三根地址线内部上拉,你可以查一下数据手册

    0x00041000,这两根线用于SYSBOOT config

  • 同样的这个问题会不会影响nand的启动呢,谁有这方面的经验

  • NAND的连接没有此类问题。

    根据连接的是8bit还是16bit,选择GPMC_AD的8条线或者16条线连接即可。

    另外,需要提醒的是,需要NAND启动,选择的NAND flash会有要求。可以知道,NAND的种类千差万别,所以在芯片内部的ROM CODE只能有限支持部分,有

    (1)支持ONFI标准的NAND

    (2) DEVICE ID在所支持的表格内的NAND。表格可参看TRM的Table 26-14. Supported NAND Devices

  • Hi Gary

    关于上述方式有如下问题请教:

    1. 一般D-Latch都为电平锁存的,上升沿锁存的比较少,能否推荐一下。 如果是ROM code导致,不知道现在是否有更新,能否用电平触发Latch。

    2. 该方案为异步模式下工作,如果需要burst mode不是是否有限制。

    谢谢

     

  • 1. SN74ALVCH162601GR 或者SN74LVC16374

    2. 关于NOR FLASH启动,支持哪些可以查看TRM的26.1.7.2 XIP Memory

    只支持异步模式启动

     

  • 从AM3359的schematic的第8页看到NOR FLASH的A18和A19连接到GPIO2_12和GPIO2_13上去了,GPIO2_12和GPIO2_13是GPMC_A6和GPMC_A7,这样与AM335X的Technical reference manual的第520页的表对应不上,请问这是怎么回事情,谢谢!

  • 你参考的是ICEv2 EVM板吧,不建议这样使用,如果像那个板子用的话,是要改driver的,相当于把原来的flash划分成了四块同样大小的区域,通过两个GPIO进行区域间的访问控制。

    如果可以的话,还是参考这篇帖子中标准的设计来。

  • 你好,
         我是参考的ICE V2.1版本的图纸。如果按您的帖子还是发现一个问题。
      GPMC_A[10-1]对应着A[26-16],10根地址线怎么对应11根地址线呢?
     我想从Nor Flash boot,TI是否有Nor Flash下载工具,另外,我想用NOR Flash,同时要用1024*768的LCD,请问这样是否可行?谢谢
  • Hi Gary Wu,

       最近我有一个项目也是需要用到NorFlash进行设计,由于需要使用LCD屏,故只能采用GPMC_AD复用的形式,因此也需要用到锁存器,但是根据你这个框图的内容,锁存器是使用在数据线上的,这个我就不太明白设计方式了,因为数据是双向的,锁存器是单向的,这样子我怎么读取内容呢,按我的理解,锁存器应该是锁存地址吧,然后GPMC_AD转换成数据模式,读或者写数据进去。即GPMC_AD和GPMC_A选输出地址内容,然后低16位地址由锁存器锁存,之后GPMC_AD去读数据。不知道我这样的理解在哪里有问题呢?期待你的回复。

  • Steven:

           你好,咨询您一个NOR Flash启动的问题。

           我们的AM3352所接的外设很少(没有LCD),用并行Nor flash启动,总共需要26根地址线,我们打算用非复用模式

           1)TI PinMux tools里面,作为启动设备有两个选项,XIP_MUX1和XIP_MUX2,如下图所示,这两个明明都是非复用模式(27个地址线和16个数据线分开的),为什么名字都是以“Multiplexed”开头的?如红框所示,会不会有问题

               

           2)这两个模式我应该选择哪个?看上去无论地址线还是数据线,管脚分配都是一模一样的,只是MUX1多了一个CLK,但是异步的不需要clk啊!

           3)您说的高位地址线下拉以及和boot cfg的隔离,我会follow,但是这张非复用模式下,应该对哪些管教做下拉?

                reference manual里面有一段文字“Specially, external logic is needed to isolate the upper address lines(A12-A27) of the NOR flash from the device pins and drive the low during non-muxed NOR boot”,但是有的人说,把高16为地址线,即A16-A27下拉就可以了

            以上,非常感谢!

  • 您好

        我最近在研究am335x nor flash启动,遇到了一些问题,能加个好友交流一下吗? 

    我的QQ:1144685461,谢谢

  • 您好:

      采用am335x工业引擎ICEv2 EVM,怎么从norflash 启动? (开发环境采用的是ti-processor-sdk-linux-rt-am335x-evm-03.01.00.06-Linux-x86)

     目前测试情况如下:

    1)AM335x EVM am335x_evm_nor生成MLO和u-boot.img,放入SD FAT区,启动,串口无数据输出,这是什么问题?

    2)AM335x EVM am3335x_evm_norboot生成u-boot.bin,通过CCS烧写至nor flash的0扇区,串口仍无数据输出?

    3)采用sysBISO提供的样例,uboot_NOR.bin,通过CCS烧写至nor flash的0扇区,无法运行SDK卡中的app程序?

    以上三种情况,是我测试的不合理的情况,请问 am335x工业引擎ICEv2 EVM,是如何从norflash 启动的,有测试样例?

  • 你好:

         采用ICEv2 EVM板,把u-boot.bin 写入nor flash后,无法运行,对比0x8000000开始的数据,flash 被重复复制了4分,导致u-boot.bin 无法运行? 

         您说要改driver,请问有相关文档说明吗?