Linux 支持多个spi-nor flash

  1. 需求

通常在嵌入式开发过程中可能会遇到需要再同一个SPI总线上挂载多个spi nor flash才能满足存储需求。

  1. 技术简介

对于spi-nor flash驱动通常不需要驱动开发人员手搓,一般内核会有一套固定的驱动,而且走的是内核的MTD子系统那一套,市面上常见的spi-nor flash芯片都支持这套驱动。

驱动开发人员需要关注的是如何获取spi-nor flash对应的id并将其补充到对应型号的驱动里面。注意这里有些驱动开发人员会产生疑问,不是说它们使用一套通用的驱动吗?那这里的独立芯片驱动怎么回事?解答:这个不是flash驱动,这里的驱动主要是用来记录flash id用的,原因是不同厂家的芯片id肯定是不一样的,下述以常用的两款flash为例。


GD25WQ128E:

drivers/mtd/spi-nor/gigadevice.c

w25q128:

drivers/mtd/spi-nor/winbond.c

2.方案

首先SPI协议是支持一主多从结构的,也就是在同一条SPI总线下可以挂载多个SPI从设备。学习过SPI的都知道,SPI master都是通过cs片选的方式选中要通信的slave设备进行通信,这个是本质。因此对于挂载多个spi-nor flash道理是一样的。

对于SPI协议这里不展细说,常见的就有单线、双线、四线、八线等模式,本案例演示的是四线模式的。

通常对于SOC的硬件SPI控制器,其都会有专用的片选引脚,以AM64x平台为例,其OSPI控制器就有4个硬件片选引脚:OSPI0_CSn0、OSPI0_CSn1、OSPI0_CSn2、OSPI0_CSn3,可以通过不同的片选引脚挂载多个SPI从设备。

3.配置设备树

修改设备树重新编译测试报错:看似片选不支持多个

分析驱动:发现驱动也没有解析设备树的相关片选属性(例如num-cs)

去官方论坛搂一下看看有没有其它开发人员也遇到相似的的问题:

补丁

其它开发人员遇到相似的问题

通过一番资料排查,TI官方在这个版本的内核并不支持多个片选,需要修改驱动、设备树,添加对应的支持。

编译内核、设备树测试:至少可以识别两个SPI从设备了,但是有一个id无法识别

解决方案:补充id到驱动里面参考:这篇帖子

测试可以识别到了两个spi-nor flash设备

这里可能会有一个疑问,问什么只有其中一个spi从设备可以被识别为mtd设备,另外一个没有被识别?解答:原因是u-boot命令行参数默认配置了spi0.0设备作为mtd设备。

修改u-boot配置文件,重新编译进行测试

切换为spi.1了

当然也可以同时配置多个:

注:更改环境变量需要重新恢复u-boot默认环境变量,命令:u-boot# env default -fa

相关推荐
凡人叶枫6 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
云栖梦泽6 小时前
玩转RK3506SDK
linux·嵌入式硬件
Java面试题总结7 小时前
Linux-Ubantu-贴士-apt的地盘
linux·运维·服务器
kong@react7 小时前
Rocky Linux 10.2 全面解析:企业级 CentOS 替代方案及保姆级docker安装
java·linux·运维·docker
凡人叶枫8 小时前
Effective C++ 条款07:为多态基类声明 virtual 析构函数
linux·c语言·开发语言·c++
凡人叶枫8 小时前
Effective C++ 条款10:令 operator= 返回一个 reference to *this
java·linux·服务器·开发语言·c++·effective c++
|_⊙9 小时前
Linux 中断
linux
程序猿玖月柒9 小时前
ubuntu22.04.2安装英伟达驱动
驱动开发·驱动·英伟达·端侧ai
Championship.23.249 小时前
Linux 3.0 音频机制深度解析:ALSA基础架构与传统音频驱动模型
linux·运维·音视频·alsa
Tian_Hang9 小时前
Linux基础知识(四)
linux·ide·驱动开发·计算机视觉·硬件工程·动画