ZYNQ使用W25Q256问题笔记_jjinl的博客-程序员秘密

技术标签: fpga开发  EBAZ4205  

在zynq使用w25q256出现问题,先把问题记录下来,暂时为解决。

我们使用环境 Linux-5.4.151,使用SPI FLASH启动,SPI FLASH :W25q256 (32MB)

内核启动 spi flash 报错,中间有添加打印调试信息

[    0.592838] Initialise system trusted keyrings
[    0.597462] workingset: timestamp_bits=30 max_order=18 bucket_order=0
[    0.610471] ntfs: driver 2.1.32 [Flags: R/W].
[    0.655821] Key type asymmetric registered
[    0.659917] Asymmetric key parser 'x509' registered
[    0.664882] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 250)
[    0.672269] io scheduler mq-deadline registered
[    0.676824] io scheduler kyber registered
[    0.682413] dma-pl330 f8003000.dmac: Loaded driver for PL330 DMAC-241330
[    0.689161] dma-pl330 f8003000.dmac:         DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16
[    0.754711] Serial: 8250/16550 driver, 5 ports, IRQ sharing disabled
[    0.762863] STMicroelectronics ASC driver initialized
[    0.777388] brd: module loaded
[    0.789431] loop: module loaded
[    0.793948] spi-nor spi0.0: flash:w25q256
[    0.798018] spi-nor spi0.0: flash id:ef-40-19-0-0-0
[    0.802895] spi-nor spi0.0: flash id len:3
[    0.807027] spi-nor spi0.0: flash sector size:65536
[    0.811896] spi-nor spi0.0: flash nsector size:512
[    0.816702] spi-nor spi0.0: flash page size:256
[    0.821227] spi-nor spi0.0: flash addr width:0
[    0.825689] spi-nor spi0.0: flash flags:97
[    0.829777] spi-nor spi0.0: flash:w25q256
[    0.833780] spi-nor spi0.0: flash id:ef-40-19-0-0-0
[    0.838669] spi-nor spi0.0: flash id len:3
[    0.842762] spi-nor spi0.0: flash sector size:65536
[    0.847657] spi-nor spi0.0: flash nsector size:512
[    0.852440] spi-nor spi0.0: flash page size:256
[    0.856992] spi-nor spi0.0: flash addr width:0
[    0.861433] spi-nor spi0.0: flash flags:97
[    0.865713] hwcaps:8 line:2816
[    0.868757] hwcaps:16 line:2816
[    0.871889] hwcaps:128 line:2816
[    0.875148] hwcaps:256 line:2816
[    0.878365] hwcaps:512 line:2816
[    0.881597] spi-nor spi0.0: share:66459 hw mask 8355839
[    0.886838] hwcaps:1 line:2816
[    0.889884] jjl 2810
[    0.892061] hwcaps:2 line:2816
[    0.895130] jjl 2810
[    0.897305] hwcaps:8 line:2816
[    0.900351] jjl 2810
[    0.902529] hwcaps:16 line:2816
[    0.905689] jjl 2810
[    0.907868] hwcaps:128 line:2816
[    0.911088] jjl 2810
[    0.913267] hwcaps:256 line:2816
[    0.916508] jjl 2810
[    0.918683] hwcaps:65536 line:2816
[    0.922076] jjl 2810
[    0.924286] spi-nor spi0.0: nor spi mem
[    0.928112] spi-nor spi0.0: share:0
[    0.931592] spi-nor spi0.0: can't select read settings supported by both the SPI controller and memory.
[    0.941012] spi-nor: probe of spi0.0 failed with error -22
[    0.946526] Xilinx QSPI Driver:700
[    0.950431] sdhci: Secure Digital Host Controller Interface driver
[    0.956648] sdhci: Copyright(c) Pierre Ossman
[    0.960998] Synopsys Designware Multimedia Card Interface Driver
[    0.967239] sdhci-pltfm: SDHCI platform and OF driver helper
[    0.999035] mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using ADMA
[    1.006925] ledtrig-cpu: registered to indicate activity on CPUs
[    1.013462] fpga_manager fpga0: Xilinx Zynq FPGA Manager registered
[    1.020642] Registering SWP/SWPB emulation handler
[    1.026245] Loading compiled-in X.509 certificates
[    1.043940] UBI error: cannot open mtd 3, error -19
[    1.048934] hctosys: unable to open rtc device (rtc0)
[    1.054557] VFS: Cannot open root device "ubi0:rootfs" or unknown-block(0,0): error -19
[    1.062612] Please append a correct "root=" boot option; here are the available partitions:
[    1.071307] 0100           65536 ram0 
[    1.071311]  (driver?)
[    1.077483] 0101           65536 ram1 
[    1.077487]  (driver?)
[    1.083664] 0102           65536 ram2 
[    1.083667]  (driver?)
[    1.089821] 0103           65536 ram3 
[    1.089825]  (driver?)
[    1.095989] 0104           65536 ram4 
[    1.095993]  (driver?)
[    1.102174] 0105           65536 ram5 
[    1.102177]  (driver?)
[    1.108385] 0106           65536 ram6 
[    1.108389]  (driver?)
[    1.114583] 0107           65536 ram7 
[    1.114587]  (driver?)
[    1.120761] 0108           65536 ram8 
[    1.120764]  (driver?)
[    1.126965] 0109           65536 ram9 
[    1.126968]  (driver?)
[    1.133142] 010a           65536 ram10 
[    1.133145]  (driver?)
[    1.139485] 010b           65536 ram11 
[    1.139488]  (driver?)
[    1.145782] 010c           65536 ram12 
[    1.145785]  (driver?)
[    1.152051] 010d           65536 ram13 
[    1.152054]  (driver?)
[    1.158345] 010e           65536 ram14 
[    1.158349]  (driver?)
[    1.164588] 010f           65536 ram15 
[    1.164591]  (driver?)
[    1.170778] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[    1.179044] CPU1: stopping
[    1.181753] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 5.4.151 #28
[    1.187839] Hardware name: Xilinx Zynq Platform

分析源码

在drivers/mtd/spi-nor/spi-nor.c中

static int spi_nor_default_setup(struct spi_nor *nor,
				 const struct spi_nor_hwcaps *hwcaps)
{
	struct spi_nor_flash_parameter *params = &nor->params;
	u32 ignored_mask, shared_mask;
	int err;

	/*
	 * Keep only the hardware capabilities supported by both the SPI
	 * controller and the SPI flash memory.
	 */
	shared_mask = hwcaps->mask & params->hwcaps.mask;
dev_err(nor->dev,"share:%d hw mask %d\n",shared_mask,hwcaps->mask);
	if (nor->spimem) {
		/*
		 * When called from spi_nor_probe(), all caps are set and we
		 * need to discard some of them based on what the SPI
		 * controller actually supports (using spi_mem_supports_op()).
		 */
		spi_nor_spimem_adjust_hwcaps(nor, &shared_mask);
		dev_err(nor->dev,"nor spi mem\n");
	} else {
		/*
		 * SPI n-n-n protocols are not supported when the SPI
		 * controller directly implements the spi_nor interface.
		 * Yet another reason to switch to spi-mem.
		 */
		ignored_mask = SNOR_HWCAPS_X_X_X;
		dev_err(nor->dev,"ig mask :%d\n",ignored_mask);
		if (shared_mask & ignored_mask) {
			dev_dbg(nor->dev,
				"SPI n-n-n protocols are not supported.\n");
			shared_mask &= ~ignored_mask;
		}
	}

	/* Select the (Fast) Read command. */
	err = spi_nor_select_read(nor, shared_mask);
	if (err) {
		dev_err(nor->dev,"share:%d\n",shared_mask);
		dev_err(nor->dev,
			"can't select read settings supported by both the SPI controller and memory.\n");
		return err;
	}

	/* Select the Page Program command. */
	err = spi_nor_select_pp(nor, shared_mask);
	if (err) {
		dev_err(nor->dev,
			"can't select write settings supported by both the SPI controller and memory.\n");
		return err;
	}

	/* Select the Sector Erase command. */
	err = spi_nor_select_erase(nor);
	if (err) {
		dev_err(nor->dev,
			"can't select erase settings supported by both the SPI controller and memory.\n");
		return err;
	}

	return 0;
}

发现是上述函数

spi_nor_spimem_adjust_hwcaps(nor, &shared_mask);

把shared_mask给置零

追踪函数

static int spi_nor_spimem_check_op(struct spi_nor *nor,
				   struct spi_mem_op *op)
{
	/*
	 * First test with 4 address bytes. The opcode itself might
	 * be a 3B addressing opcode but we don't care, because
	 * SPI controller implementation should not check the opcode,
	 * but just the sequence.
	 */
	op->addr.nbytes = 4;
	if (!spi_mem_supports_op(nor->spimem, op)) {
		if (nor->mtd.size > SZ_16M)
			return -ENOTSUPP;

		/* If flash size <= 16MB, 3 address bytes are sufficient */
		op->addr.nbytes = 3;
		if (!spi_mem_supports_op(nor->spimem, op))
			return -ENOTSUPP;
	}

	return 0;
}

函数spi_nor_spimem_check_op返回ENOTSUPP。w25q256是32M FLASH这里会检查spi控制器是否支持4字节地址spi_mem_supports_op,这个函数调用spi控制器中函数zynq_qspi_supports_op

位置drivers\spi\spi-zynq-qspi.c

static bool zynq_qspi_supports_op(struct spi_mem *mem,
				  const struct spi_mem_op *op)
{
	if (!spi_mem_default_supports_op(mem, op))
		return false;

	/*
	 * The number of address bytes should be equal to or less than 3 bytes.
	 */
	if (op->addr.nbytes > 3)
		return false;

	return true;
}

4字节地址,直接返回错误,看来需要对zynq spi 控制器进行打补丁

解决办法把xilinx提供的5.10内核版本的spi-zynq-qspi.c复制过来替换,有几个小bug修复一下就可以。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jjinl/article/details/121944271

智能推荐

重编译_debussy2005的博客-程序员秘密

<br />想让sql server 重用,必须参数化,即使拼接语句放在SP里,还是要重新编译<br />dbcc freeproccache<br /><br />select sql,refcounts ,usecounts , * from sys.syscacheobjects order by bucketid<br /> <br /> <br />DBCC MEMORYSTATUS<br /> <br />select <br />* from sys.dm_os_memory_cler

用UltraISO制作启动U盘安装系统_weixin_30478619的博客-程序员秘密

一》下载要安装系统的镜像文件,也就是iso文件,你懂的。二》下载并安装UltraISO,你懂的。三》插上U盘到电脑。四》打开UltraISO。 在菜单栏选择 文件--&gt;打开--&gt;选择在第一步下载的iso文件。 在菜单栏选择 启动--&gt;写入硬盘映像...  在弹出的对话框中选择写入 等等成功即可。五》成功之后,重启电脑,选择从...

经典博客_csdn seuyouyou 捆绑_WangPeng朝圣之路的博客-程序员秘密

主要将一些好的博客文章收集起来 讲解okhttp的用法及封装:http://blog.csdn.net/lmj623565791/article/details/49734867

T-SQL 数据库的创建_weixin_34378767的博客-程序员秘密

create database databaseNameon primary(  Name =dbName1,  FileName='C:\mydatabase1\dbName1.mdf',  Size =10MB,   MaxSize=20MB,  FileGrowth=10mb),(  Name =dbName2,  FileName='C:\mydatabase2\dbName2.mdf',...

vue仿今日头条_vue 仿今日头条_公孙珣的博客-程序员秘密

vue 仿今日头条为了增加移动端项目的经验,近一周通过 vue 仿写今日头条,以下就项目实现过程中遇到的问题以及解决方法给出总结,有什么不正确的地方,恳请大家批评指正^ _ ^!,代码仓库地址为 github一、实现功能首页展示查看消息图文懒加载滑动选项卡,切换频道,点击频道切换不同新闻点击选项卡的 + 按钮,实现频道的添加和删除点击搜索按钮,输入关键字,回车进行实时搜索,在结果中高亮显示关键字点...

随便推点

使用C语言循环语句计算1-10的阶乘之和_c语言用for求1到9的阶乘_菜菜是真菜的博客-程序员秘密

计算1-10的阶乘之和定义变量mul为一个数值的阶乘;定义变量sum为阶乘之和。#include&lt;stdio.h&gt;int main(){ int a; int b; int mul; int sum=0; for(a=1;a&lt;=10;a++) { mul=1; for(b=1;b&lt;=a;b++) { mul=b*mul; } sum=sum+mul; } printf("%d\n",sum); return 0;}菜菜的代

Compile workrave under windows &ndash; My exprience 在Windows上编译Workrave_msinttypes-r26_linlu11的博客-程序员秘密

这是我第一次在Windows上编译*nix程序,下载工具时,最开始按Windows的习惯分别安装到不同文件夹,后来发现那样很麻烦。因为每个Unix库的文件组织方式就已经包含了bin, include, lib, share, doc等文件夹,并且上述文件夹中还有库的子目录。 所以大家一定要接收教训,把gtkmm, gettext, intltool之类的全部安装到一个文件夹,例如:D:/GnuW

利用 JSF 开发 WEB 程序的三大优势_yakoo5的博客-程序员秘密

JSF优势之一:UI组件(UI-component)    UI组件(UI-component)一直是桌面程序的专利,Web程序中,虽然HTML定义了基本的UI标签,但要使这些UI标签像UI组件那样工作,还需要很多代码片断来处理数据及其表现形式,而且有效地组织这些代码片断使其协调一致也是一件繁琐的工作。JSF的UI组件是真正意义上的UI组件,能极大地简化程序员的工作,例如,在页面上放置一个文本

集合类的体系结构_集合体系结构_sherry_Rui的博客-程序员秘密

原文地址:点击打开链接1. Collections(工具类) 和 Collection(集合顶层接口) 的区别首先, “Collection” 和 “Collections” 是两个不同的概念. 从下面几幅图可知,“Collection”是集合继承结构中的顶层接口,而 “Collections” 是提供了对集合进行操作的强大方法的工具类.图12. Collection继

Java中方法的重载详解_方法重载的流程_路宇的博客-程序员秘密

方法的重载(overload)定义:在一个类中,允许出现一个以上的同名方法,只要他们的参数个数或者参数类型不同即可。举例:package demo2;public class OverloadTest { private void getSum(int i,int m){ System.out.println(i+m); } private void getSum(String i,String M){ } /*private in.

Unity 2D 碰撞卡死 移动卡死_unity物体碰撞后不能移动_窗燃烟逝的博客-程序员秘密

人物卡死的问题有很多, 目前笔者遇到的解决方案有 trigger 勾选, 改变刚体 Collider, 增加不可移动代码三种.1. 两个碰撞体间 trigger 勾选一般而言, 刚体 Rigidbody 所在的 Box Collider 2D 的 trigger 不打勾(打不打勾看项目当时的需求和情况有所改变), 与之相撞的 BX2D 的 trigger 打勾但大部分项目这种肯定是做好的, 那么就有一种可能是人物底部方形和碰撞体方形重合, 于是有了接下来第二点2. 改变刚体 Collider我们

推荐文章

热门文章

相关标签