|
众所周知,MT7621 的 NAND 跟 SPI-NOR 不能共存,必须通过硬件改造,加入开关进行切换,十分不方便。
而MT7621支持的是并行NAND,且引脚跟SD复用,对于PCB上没有NAND焊盘的路由器来说,想增加NAND支持是难上加难,而NAND跟SD的引脚复用,会导致SD功能无法使用。
那么有没有什么方法能够比较方便地增加NAND支持,又能够保留SD卡支持呢?
答案就是SPI-NAND。
首先要明确一个事实,平时我们说的SPI Flash,绝大多数时候指的都是SPI-NOR flash,而这并不是完全准确的。
闪存有NOR和NAND两种,这里并不细讲它们的区别。
NOR跟NAND是存储器类型,他们需要提供一个接口供外部访问,而接口可以是并行的也可以是串行的。
因此NOR和NAND都有两种常见类型的接口,并行和串行。没错,NAND也有串行接口的。
对于并行接口,NOR使用的是类似于内存的接口,有数据总线、地址总线、ALE/CLE等控制信号;NAND使用的是另一套接口,数据和地址共用一套总线。但是两者的串行接口都是一致的,SPI。
虽然都是SPI接口,但是他们的指令和时序都不同,所以驱动并不通用。
长久以来,MT7621的SPI驱动都处于一种半成品状态。MT7621的SPI控制器设计上只能针对SPI-NOR进行操作,且其FIFO空间很小,一次传输的数据很有限(32字节)。
而Linux的SPI-NOR驱动,动辄要求一次传输上百字节,因此OpenWrt里的做法是修改SPI-NOR驱动,让它一次性只要求传输不超过32字节。
但是这一招对于SPI-NAND就不行了,因为他们的框架完全不同。
在最近,OpenWrt的人发现可以通过一些手段,实现一次传输任意长度的数据。因此我根据这一线索重新开发了一套通用的SPI驱动,解决了最重要的一个难题。
而对于SPI-NAND,Kernel已经在4.19实现了支持。现在的OpenWrt使用4.14,可以很方便地backport下来(同时需要spi-mem框架)。
因为SPI-NAND是SPI总线地,因此其封装一般是WSON8,只有8个引脚,能够很方便地焊在板子上,跟现有的SPI-NOR共享7个引脚,CS引脚焊到MT7621的SPI_CS1引脚进行了。
这里我用的是 @ff94315 的 CreativeBox v1,它自带双SPI焊盘,因此能很方便地加入 SPI-NAND 支持。
得益于之前给 WNDR4500v3 开发 breed 时增加了 SPI-NAND,给 CreativeBox 开发breed就容易了很多
针对这个板子我开发了专用的双Flash版breed,能实现NOR/NAND的固件刷写,以及自由切换启动设备。
如果想针对其他的平台,可以使用upstream u-boot,它已经支持spi-nand了。
对于 OpenWrt,现阶段的trunk时铁定不支持的了,因此我自己backport了相关的代码,做了OpenWrt专用版固件,可以参考我的 Github:
https://github.com/hackpascal/openwrt-dev
固件就只提供一个简单版本。因为这属于DIY范畴,每个人的做法都可能不同。需要根据自己的需求来做修改。
链接:https://pan.baidu.com/s/1vCNwR1WkvKQ3xqiqvclFMw 密码:ix8s
|
评分
-
查看全部评分
|