1. 需求
通常在嵌入式开发过程中可能会遇到需要再同一个SPI总线上挂载多个spi nor flash才能满足存储需求。
2. 技术简介
对于spi-nor flash驱动通常不需要驱动开发人员手搓,一般内核会有一套固定的驱动,而且走的是内核的MTD子系统那一套,市面上常见的spi-nor flash芯片都支持这套驱动。
驱动开发人员需要关注的是如何获取spi-nor flash对应的id并将其补充到对应型号的驱动里面。注意这里有些驱动开发人员会产生疑问,不是说它们使用一套通用的驱动吗?那这里的独立芯片驱动怎么回事?解答:这个不是flash驱动,这里的驱动主要是用来记录flash id用的,原因是不同厂家的芯片id肯定是不一样的,下述以常用的两款flash为例。
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