高通AR93XX QCA95XX系列CPU上调试32MB SPI Nor Flash

项目需求,需要基于Openwrt BB1407在一款QCA9561上调试一块32MB的SPI Nor Flash芯片(mx25l2563xx)。一开始产品设计的时候,曾经论证过高通9xxx系列CPU能不能支持32MB Nor Flash的问题。那时想当然的认为,SPI Nor Flash不就是基于SPI总线访问的普通设备嘛,只要SPI总线正常,跟容量大小又有什么关系呢?当真正开始调的时候,才发现自己想的太简单了。

1. Flash地址模式问题

16MB以下的flash,在SPI总线上进行命令寻址操作的时候,地址参数共3个byte,即24-bit模式,而超过16M以后,地址参数就变成了4byte,即32-bit模式。超过16MB的SPI Nor Flash,一般都会有地址模式转换命令,比如mx25l2563xx,它的地址转换命令为:EN4B和EX4B,使得Flash可以在两个模式之间自由切换。地址模式除了关乎正确寻址之外,还会关系到重启是否正常。
SPI Nor Flash是不支持普通Nor Flash那样直接寻址读取数据的,要使CPU基于SPI Nor Flash正常启动,需要CPU在启动时能够自动从Flash芯片起始位置读取一定量的内容,方能保证系统可以正常启动。对此,一般CPU会要求SPI Nor Flash处于3byte模式(至少高通这几款是这样的)。
在基于Openwrt bb1407的版本中,Linux内核已经能够支持mx25l2563xx,驱动初始化时,会让Flash进入到4byte模式,当此时执行重启操作,系统将不会正常重启。解决这个问题通常有两种方法:

方法一

在linux的reboot过程中,会去调用Flash驱动的remove操作,所以对于重启不正常的问题,解决方法就是针对32M的Flash执行一个Reset或是EX4B命令,执行完毕后,系统就可以正常重启了。

/* drivers/mtd/devices/m25p80.c */
/* Reset opcodes */
#define OPCODE_RSTEN        0x66    /* Enable reset */
#define OPCODE_RESET        0x99    /* Reset device */

/*
 * Reset whole flash chip. Only be avaliable for chips size >= 32MiB
*/
static inline int flash_4byte_mode_reset(struct m25p *flash)
{
    struct spi_transfer t[2];
    struct spi_message m;
    char command[2];
    int ret;

    if
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值