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

相关推荐
GeW8 小时前
RHCE备考别瞎学!按这个计划走,30天提高通过率,快速拿证
linux
Escalating_xu8 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊8 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
码农小韩9 小时前
Linux应用开发(六)——进程间通信
linux·linux驱动·嵌入式软件开发·嵌入式操作系统·linux应用
笨笨饿10 小时前
#138_解决Codex要五次回复的问题
linux·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
m0_4598729210 小时前
Linux 系统基础
linux·运维·服务器
吴声子夜歌10 小时前
Shell编程——数组
linux·运维·shell
blueSatchel10 小时前
ros-humble仿真-建图-导航
linux·ros2
Lucis__10 小时前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc
程序员-Benothing11 小时前
Shell 脚本条件判断与流程控制:if for while case 详解
linux·运维·服务器