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

相关推荐
STUPID MAN11 小时前
Linux使用tomcat发布vue打包的dist或html
linux·vue.js·tomcat·html
mc235611 小时前
Linux实用操作
linux·运维·服务器
半梦半醒*11 小时前
k8s——pod详解2
linux·运维·docker·容器·kubernetes·负载均衡
vvw&12 小时前
如何使用 Nodemon 自动重启 Node.js 应用
linux·运维·服务器·node.js
Bdygsl12 小时前
Linux(3)—— 权限操作
linux
奔跑吧邓邓子12 小时前
【C语言实战(75)】C语言内存探秘:泄漏检测与分析实战
linux·c语言·windows·内存·开发实战·泄露检测
HIT_Weston13 小时前
16、【Ubuntu】【VSCode】VSCode 断联问题分析:问题解决
linux·vscode·ubuntu
被遗忘的旋律.13 小时前
Linux驱动开发笔记(十九)——IIC(AP3216C驱动+MPU6050驱动)
linux·驱动开发·笔记
Dreamboat-L14 小时前
使用VMware安装centos的详细流程(保姆级教程)
linux·运维·centos
蓦然回首的风度14 小时前
【运维记录】Centos 7 基础命令缺失
linux·运维·centos