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.

[参考译文] AM4377:AM4377 uboot 通过 SPI 读取闪存的速度很慢

Guru**** 2552050 points
Other Parts Discussed in Thread: AM4377

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/794109/am4377-am4377-uboot-reading-flash-through-spi-is-slow

器件型号:AM4377

AM4377通过 spi0访问闪存 IS25LP256D、命令行执行 SF 读取80000000 100000 700000
将7MB 封装读至存储器地址0x8000000需要120秒、测量 SPI 的时钟和数据线、时钟为48M、
但一次只传输1B、每个 B 之间有15us 的间隔
如何提高读取速度、或者如何持续输出 SPI 时钟?

此外、测量内存时钟频率为100M。 DDR MT41K256M16为1866M。 应如何设置 DDR 的输入时钟?
是否设置为0x5AC[18:8]? 但现在设置为50|2或400|23、实际测量 DDR 输入侧仍然是100M 时钟、
该寄存器已成功设置、M2为2分频。 设置值为
const 结构 DPLL_params DPLL_DDR ={400、23、1、-1、1、 -1、-1};或{50、2、1、 -1、2、-1、-1};

[代码路径]:ti_uboot_201605sdk3205\drivers\SPI
static int omap3_spi_read (struct omap3_spi_priv* privt、unsigned int len、
void * RXP、unsigned long 标志)

int i、chconf;
超长启动;
int cnt;//CRSC 调试

/*SF:RD 0x80000000、L73650032 (W8)、0x4803012c、4803013c;*/
printf ("SF:RD 0x%x、L%d (w%d)、0x%x、%x;\n"、RXP、len、priv->wordlen、
&priv->regs->channel[priv->cs].chconf、&priv->regs->channel[priv->cs].rx);//crSC 调试

chconf = readl (&priv->regs->channel[priv->cs].chconf);

/*启用通道*/
OMAP3_SPI_SET_ENABLE (priv, OMAP3_MCSPI_CHCTRL_EN);

chconf &=~(OMAP3_MCSPI_CHCONF_TRM_MASK | OMAP3_MCSPI_CHCONF_WL_MASK);
chconf |=(criv->wordlen-1)<<7;
chconf |= OMAP3_MCSPI_CHCONF_TRM_RX_ONLY;
chconf |= OMAP3_MCSPI_CHCONF_FORCE;
OMAP3_SPI_WRITE_chconf (priv, chconf);

writel(0),&priv->regs->channel[priv->cs].tx);

对于(i = 0;i < len;i++){
START = GET_TIMER (0);
CNT = 0;
/*等待 RX 寄存器包含数据(RX = 1)*/
while (!(readl (&priv->regs->ch[priv->cs].chstat)&
OMAP3_MCSPI_CHSTAT_Rxs){
if (get_timer (start)> SPI_WAIT_TIMEOUT){
printf ("SPI RX 超时、STATUS=0x%08x\n"、
readl(&priv->regs->channel[priv->cs].chstat));
返回-1;

CNT++;

如果((i%0x80000)==0)
printf ("%d;"、cnt);//CRSC 调试

/*禁用频道以防止收到 furher */
如果(i =(len - 1))
OMAP3_SPI_SET_ENABLE (priv, OMAP3_MCSPI_CHCTRL_DIS);

/*读取数据*/
unsigned int *rx =&priv->regs->channel[priv->cs].rx;
如果(priv->wordlen >16)
(((u32 *) RXP)[i]= readl (Rx);
否则(priv->wordlen >8)
(((U16 *) RXP)[i]=(U16) readl (Rx);
其他
(((u8 *) RXP)[i]=(u8) readl (Rx);

if (flags & SPI_Xfer_end){
chconf &=~OMAP3_MCSPI_CHCONF_FORCE;
OMAP3_SPI_WRITE_chconf (priv, chconf);

返回0;

[uBoot info]:
OMAP3 SPI 速度48000000Hz;
SF:RD 0x9ef16f98、L5 (W8)、0x4803012c、4803013c;
0;SF:9d 闪存不支持锁定操作
SF:RD 0x9ef16f97、L1 (W8)、0x4803012c、4803013c;
0;SF:检测到页大小为256字节的 IS25LP256D、擦除大小为64 KiB、总共32 MIB
:返回0
器件0偏移量0x100000、大小0x700000
SF:RD 0x8000000000、L7340032 (W8)、0x4803012c、4803013c;
0;0;0;0;0;0;0;...

BOOT># MD 0x48030100
48030100:0000002b 00000000 00000000 00000000 +..........
48030110:00000015 00000001 00000000 00000000…
48030120:00000001 00000000 00000004 00060000…
48030130:00000000 00000000 00000000 00000000…
48030140:00060000 00000000 00000000 00000000…
48030150:00000000 00060000 00000000 00000000…
48030160:00000000 00000000 00060000 00000000…

DDR 时钟:
CRSC># MD 0x44DF2D20
44df2d20:00000007 00000001 00000000 0003e817…
44df2d30:00000000 0000022a 00000228… *。。(。
44df2d40:00000024 00000000 00000000 00000000 $..........
44df2d50:00000000 00000000 00000000 00000000…
44df2d60:00000007 00000001 00000000 00025817… 十.
44df2d70:00000201 00000000 00000000 00000000…
44df2d80:00000000 00000000 00000000 00000000…
44df2d90:00000000 00000000 00000000 00000000…
44df2da0:00000007 00000001 00000000 00019017…
44df2db0:00000221 00000000 00000221 00000000!… !…
44df2dc0:00000000 00000000 00000000 00000000…
44df2dd0:00000000 00000000 00000000…
44df2de0:00000007 00000001 00000000 0403c017…
44df2df0:00000285 00000000 00000000 00000000…
44df2e00:00000000 00000000 00000000 00000000…
44df2e10:00000000 00000300 00000000 00000000…

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请发布您使用的 Linux 版本。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [ SPL 和 uboot 版本]
    TI_uboot_201605sdk3205 (u-boot-2016.05+gitAUTOINC+6c5519b6fc_3.2.0.5)
    [SDK]
    ti-processor-sdk-linux-am437x-evm-03.02.00.05-Linux-x86-Install.bin

    VirtualBox:~μ C/ti-processor-sdk-linux-AM437X-EVM-03.02.00.05/board-support/u-boot-2016.05+gitAUTOINC+6c5519b6fc-g6c5519b6fc$ cat /proc/version
    Linux 版本4.10.0-28-generic (buildd@lgw01-12)(gcc 版本5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4))#32~16.04.2-Ubuntu SMP Thu UTC 2017年7月20日10:19:48日
    VirtualBox:~μ C/ti-processor-sdk-linux-AM437X-EVM-03.02.00.05/board-support/u-boot-2016.05+gitAUTOINC+6c5519b6fc-g6c5519b6fc$ uname -a
    Linux x-VirtualBox 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 x86_64 x86_64 x86_64 GNU/Linux
    VirtualBox:~μ C/ti-processor-sdk-linux-AM437X-EVM-03.02.00.05/board-support/u-boot-2016.05+gitAUTOINC+6c5519b6fc-g6c5519b6fc$ lsb_release -A
    没有可用的 LSB 模块。
    分销商 ID:Ubuntu
    说明:Ubuntu 16.04.3 LTS
    发布日期:16.04
    代号:Xenial

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    执行命令行 SF 读取处于 uboot 阶段、使用 TI SDK 编译的 spl 和 uboot 不加载内核、SPI 使用 OMAP3分支。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所有读取被删除(对于(i = 0;i < len;i++))、耗时并未改变(512K + printf =10s)、最后发现'start = get_timer (0);'此行运行时间太长。 删除后、时间为512k + printf <1s、代码路径为 get_tick lib/time.c 是什么导致时间过长? 谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    删除了 GET_TIMERR 并使用 COUNT++模式来计算超时时间、当 SPI 时钟48M 从闪存读取7MB 引导程序包需要10s ~ 12s 时、是否可以改进? 谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    至于输入速度、我想知道您是否在 boot[15:14]引脚上设置了适当的系统时钟。 如果可能、请共享"CTRL_STS 寄存器(偏移= 40h)"的寄存器值。 根据引导引脚、uboot 将选择合适的 PLL 分频器。

    此致、
    Krunal
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复!
    SYSBOOT 引脚[15]设置为低电平、[14]设置为高电平(24M)、寄存器0x44E10040[23:22]=1 (24M)正常
    BOOT## MD 44e10000
    44e10000:4f000100 00000000 00000000 00000000………………………………………………………………
    44e10010:0000002a 00000000 00000000 00000000 *..........
    44e10020:00000000 00000000 00000000 00000000…
    44e10030:00000000 00000000 00000000 00000000…
    44e10040:02400309 00000000 00000000 00000000……@……………………………………………………………

    现在、通过将闪存更改为读取 RX FIFO 以计数等待、通过 SPI 读取5MB 闪存的速率为10s、接近于启动时间要求。
    请问,读数的合理率是多少?
    此外、如何设置 DDR 时钟的时钟和分频器?有一个示例?

    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请参阅以下 TI 文档

    此致、

    Krunal