关于xilinx zynq petalinux 使用32MB(W25Q256)的SPI FLSH无法正常读写16M以上内存的BUG的调试过程

文章讲述了作者在使用Zynq平台的PetaLinux系统时遇到的一个BUG,问题在于Xilinx官方驱动限制了SPINORflash的地址宽度为3字节,导致无法正确访问超过16MB的存储区域。作者通过分析内核源码发现并修复了这个问题,涉及到W25Q256芯片的4字节地址模式和EAR寄存器的使用。修复方法是在特定代码行添加对WINBOND的判断,使得驱动能正确处理大于16MB的flash分区。

        最近在玩zynq petalinux时发现了一个蛋疼的BUG,我的板子使用的是W25Q256芯片,32MB容量,被我分成了u-boot,env,kernel,rootfs几个mtd块,其中的rootfs是放在flash末尾,也就是超过了spiflash一半(16MB),当系统正常启动后,挂载rootfs时始终不成功,并且使用flash_erase   /dev/mtd3  这种命令对rootfs区域进行擦除时竟然把flash前面部分的u-boot和kernel给擦掉了,心里一万个MLGB,又是xilinx官方驱动有坑了,没办法,只能去啃官方代码了

        首先,分析现象,启动kernel正常,而且kernel有一部分也超过了16MB地址,因此u-boot应该没问题,问题出在kernel mtd或者qspi flash驱动内。w25q芯片默认使用的是3个字节地址寻址,3个字节最大只能16MB,因此要寻址超过16MB时需要增长寻址位数,在w25q256中增加寻址位数有两种方式,一种是直接切换为4直接寻址,有专门的命令切换,切换后读写命令都使用4直接地址。第二种是使用EAR寄存器,读写数据时还是使用3字节地址,但是通过EAR寄存器可以切换读写的是低16M还是高16M

        经过一番艰苦的debug分析,最终定位到了内核mtd驱动层的xxxxx/linux-xlnx/drivers/mtd/spi-nor/spi-nor.c文件内,在int spi_nor_scan函数中,xilinx官方竟然强制把qspi驱动限制死了3字节地址模式,看不懂他这种骚操作是什么意思,怪不得我即使给W25q256 的属性里面添加了4字节地址支持的属性也无效

......
	if (nor->addr_width) {
		/* already configured from SFDP */
	} else if (info->addr_width) {
		nor->add
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值