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

相关推荐
愚润求学8 分钟前
【Linux】POSIX信号量
linux·运维
进阶的DW20 分钟前
新手小白使用VMware创建虚拟机安装Linux
java·linux·运维
jz_ddk25 分钟前
[zynq] Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解(代码示例)
linux·运维·c语言·网络·嵌入式硬件
深思慎考1 小时前
Linux网络——socket网络通信udp
linux·网络·udp
一介草民丶1 小时前
Jenkins | Linux环境部署Jenkins与部署java项目
java·linux·jenkins
字节高级特工1 小时前
【Linux篇】0基础之学习操作系统进程
linux·运维·服务器·数据结构·windows·学习·list
待什么青丝1 小时前
【TMS570LC4357】之相关驱动开发学习记录1
c语言·arm开发·驱动开发·学习
s_little_monster2 小时前
【Linux】网络--数据链路层--以太网
linux·运维·网络·经验分享·笔记·学习·计算机网络
belldeep5 小时前
WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?
linux·运维·debian·curl·quickjs
%#RulER#%7 小时前
哈工大计算机系统2024大作业——Hello的程序人生
linux·笔记·程序人生