WhyCan Forum

人过留名,雁过留声,感谢各位朋友不离不弃地支持。 QQ: 516333132, 微信: whycan_cn (哇酷网/挖坑网/填坑网) admin@whycan.cn

您尚未登录。

#1 2017-11-08 10:47:28

daydayup
会员
注册时间: 2017-10-09
累计积分: 309

AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

AllWinner全志V3s荔枝派zero板子用W25Q256,
发现我烧文件系统之后,串口无输出,
直接进入芯片内部的fel,
感觉spi flash被擦掉了, 这是什么情况?




-----------------------------------------
新鲜出炉 windows 版本 32M spi nor flash 版本烧录软件: sunxi-tools-win32-support_f1c100s_32M.7z

测试OK!

离线

#2 2017-11-08 10:55:25

沉鱼
Administrator
注册时间: 2017-09-06
累计积分: 161

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

转载看云的文章: sunxi-fel增加对16M以上Flash的支持

由于SPI flash 的地址是24bit,也就是最大16M 地址空间,所以对于32M flash,需要增加bank切换支持。
uboot中有CONFIG_SPI_FLASH_BAR选项可以使能bank切换。
但是sunxi-fel中尚未支持,所以下载的时候超出16M会循环覆盖掉。
这里介绍对sunxi-fel增加16M以上flash支持的方法。
u-boot的支持
drivers/mtd/spi/spi_flash.c

static int write_bar(struct spi_flash *flash, u32 offset)
{
	u8 cmd, bank_sel;
	int ret;

	bank_sel = offset / (SPI_FLASH_16MB_BOUN << flash->shift);
	if (bank_sel == flash->bank_curr)
		goto bar_end;

	cmd = flash->bank_write_cmd;
	ret = spi_flash_write_common(flash, &cmd, 1, &bank_sel, 1);
	if (ret < 0) {
		debug("SF: fail to write bank register\n");
		return ret;
	}

bar_end:
	flash->bank_curr = bank_sel;
	return flash->bank_curr;
}

sunxi-fel的支持
fel-spiflash.c

#define CMD_WRITE_ENABLE 0x06
#define SPI_FLASH_16MB_BOUN  0x1000000
# define CMD_BANKADDR_BRWR              0x17	//only SPANSION flash use it
# define CMD_BANKADDR_BRRD              0x16
# define CMD_EXTNADDR_WREAR             0xC5
# define CMD_EXTNADDR_RDEAR             0xC8
size_t bank_curr = 0;

void aw_fel_spiflash_write_helper(feldev_handle *dev,
				  uint32_t offset, void *buf, size_t len,
				  size_t erase_size, uint8_t erase_cmd,
				  size_t program_size, uint8_t program_cmd)
{
	uint8_t *buf8 = (uint8_t *)buf;
	size_t max_chunk_size = dev->soc_info->scratch_addr - dev->soc_info->spl_addr;
	size_t cmd_idx, bank_sel;

	if (max_chunk_size > 0x1000)
		max_chunk_size = 0x1000;
	uint8_t *cmdbuf = malloc(max_chunk_size);
	cmd_idx = 0;

	prepare_spi_batch_data_transfer(dev, dev->soc_info->spl_addr);
	//add bank support
	{
	cmd_idx = 0;
	bank_sel = offset /SPI_FLASH_16MB_BOUN;
	if (bank_sel == bank_curr)
		goto bar_end;

	/* Emit write enable command */
	cmdbuf[cmd_idx++] = 0;
	cmdbuf[cmd_idx++] = 1;
	cmdbuf[cmd_idx++] = CMD_WRITE_ENABLE;
	/* Emit write bank */
	cmdbuf[cmd_idx++] = 0;
	cmdbuf[cmd_idx++] = 2;
	cmdbuf[cmd_idx++] = CMD_EXTNADDR_WREAR;
	cmdbuf[cmd_idx++] = offset >> 24;
	/* Emit wait for completion */
	cmdbuf[cmd_idx++] = 0xFF;
	cmdbuf[cmd_idx++] = 0xFF;
	/* Emit the end marker */
	cmdbuf[cmd_idx++] = 0;
	cmdbuf[cmd_idx++] = 0;
	aw_fel_write(dev, cmdbuf, dev->soc_info->spl_addr, cmd_idx);
	aw_fel_remotefunc_execute(dev, NULL);
	bar_end:
		bank_curr = bank_sel;
	}
	
	cmd_idx = 0;

重新编译sunxi-fel后就可以烧录32M flash了~

离线

#3 2017-11-08 10:58:01

沉鱼
Administrator
注册时间: 2017-09-06
累计积分: 161

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

看看对你有没有帮助,
我估计你写到后面的16MiB位置了,
而没有切换bank,
所以绕回头擦除了 uboot,
导致系统无法启动进入了fel

离线

#4 2017-11-08 11:43:33

daydayup
会员
注册时间: 2017-10-09
累计积分: 309

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

太好了,谢谢。
按上面的代码改了 aw_fel_spiflash_write_helper( ) 之后果然可以烧录32MiB flash了.

离线

#5 2017-12-23 22:07:54

qianhao
会员
注册时间: 2017-12-14
累计积分: 124

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

呼叫沉鱼大神 能不能让sunxi-fel支持a33

离线

#6 2018-03-15 14:30:47

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

QQ20180315142018.png

按这个修改, 可以通过编译。

离线

#7 2018-04-26 10:10:50

达克罗德
会员
注册时间: 2018-04-10
累计积分: 667

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

奇怪我按照这样改动,还是无法烧写32MB 文件,但烧写16MB文件正常。不知道哪里出问题了

离线

#8 2018-04-26 10:13:36

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

正在准备找这个帖子,
改一下 sunxi-fel的f1c100s版本,
因为刚刚写W25Q256超过16M,绕回去把前面的也擦写了。
正好被你顶上来了,
我现在就改改试一试。

离线

#9 2018-04-26 10:36:01

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

编译出来了, 正在测试,看能不能烧录32M的W25Q256.

离线

#10 2018-04-26 10:46:58

达克罗德
会员
注册时间: 2018-04-10
累计积分: 667

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

我是V3S。我刷新了一下磁盘cache重新编译然后似乎是烧成功了,uboot跑起来了说明没有绕回去把头擦了。但是后来linux加载jffs时候全是错误,跑不起来。我烧写的是网盘V3s_W25Q256_Qt5.9.1.bin和V3s_W25Q256_mplayer.bin, 同样的问题

离线

#11 2018-04-26 10:52:02

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

你flash是 W25Q256 ?

离线

#12 2018-04-26 11:21:30

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

新鲜出炉 windows 版本 32M spi nor flash 版本烧录软件: sunxi-tools-win32-support_f1c100s_32M.7z

测试OK!

离线

#13 2018-04-26 12:02:51

达克罗德
会员
注册时间: 2018-04-10
累计积分: 667

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

晕哥 说:

你flash是 W25Q256 ?

是的,就怕不兼容,专门去买的W25Q256

离线

#14 2018-04-26 13:44:19

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

你执行spiflash-write之后,马上执行spiflash-read读出,
再用beyond compare或者ultra compare比较, 看烧进去的是否是读出来的。

离线

#15 2018-04-26 14:28:40

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

正好有个W25Q256开发板,我来试一试:

hexing@ubuntu:/tmp/ccc$ sudo sunxi-fel spiflash-info
Manufacturer: Winbond (EFh), model: 40h, size: 33554432 bytes.

hexing@ubuntu:/tmp/ccc$ sudo sunxi-fel -p spiflash-write 0 /mnt/hgfs/E/V3s_W25Q256_Qt5.9.1.bin
  2% [                                                ]  49.8 kB/s, ETA 11:03

离线

#16 2018-04-26 14:50:07

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

QQ20180426144909.jpg

一切正常!

离线

#17 2018-04-26 18:07:07

达克罗德
会员
注册时间: 2018-04-10
累计积分: 667

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

能发下改过的c文件吗?
改动很简单,我实在想不出为什么会出错,我都检查了几遍了

另外,问一下QT在V3S上跑的速度如何?

离线

#18 2018-04-26 18:37:12

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

当时没有备份,也忘记改了什么,关键你现在读出来的和写入的是否一致?

离线

#19 2018-04-27 11:06:31

达克罗德
会员
注册时间: 2018-04-10
累计积分: 667

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

晕哥 说:

当时没有备份,也忘记改了什么,关键你现在读出来的和写入的是否一致?

sudo ./sunxi-fel -p spiflash-read 0 33554432 ./dump.bin
读出来和原文件对比很大差异,第一个字节就错位相差一个00,过了uboot后差得更多

离线

#20 2018-04-27 11:14:42

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,550

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

那要么写有问题,要么读有问题。
看有没有带校验的编程器,可以试一试。
或者 jlink v9,本站有贴。

https://whycan.cn/t_745.html

离线

#21 2018-04-30 16:35:34

kgp0213
会员
注册时间: 2018-01-15
累计积分: 149

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

这是一个关于sunxi fel 无法烧录16m spi flash的故事

离线

#22 2019-04-13 18:01:51

无情一刀
会员
注册时间: 2018-09-04
累计积分: 641

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

沉鱼 说:

转载看云的文章: sunxi-fel增加对16M以上Flash的支持

由于SPI flash 的地址是24bit,也就是最大16M 地址空间,所以对于32M flash,需要增加bank切换支持。
uboot中有CONFIG_SPI_FLASH_BAR选项可以使能bank切换。
但是sunxi-fel中尚未支持,所以下载的时候超出16M会循环覆盖掉。
这里介绍对sunxi-fel增加16M以上flash支持的方法。
u-boot的支持
drivers/mtd/spi/spi_flash.c

static int write_bar(struct spi_flash *flash, u32 offset)
{
	u8 cmd, bank_sel;
	int ret;

	bank_sel = offset / (SPI_FLASH_16MB_BOUN << flash->shift);
	if (bank_sel == flash->bank_curr)
		goto bar_end;

	cmd = flash->bank_write_cmd;
	ret = spi_flash_write_common(flash, &cmd, 1, &bank_sel, 1);
	if (ret < 0) {
		debug("SF: fail to write bank register\n");
		return ret;
	}

bar_end:
	flash->bank_curr = bank_sel;
	return flash->bank_curr;
}

sunxi-fel的支持
fel-spiflash.c

#define CMD_WRITE_ENABLE 0x06
#define SPI_FLASH_16MB_BOUN  0x1000000
# define CMD_BANKADDR_BRWR              0x17	//only SPANSION flash use it
# define CMD_BANKADDR_BRRD              0x16
# define CMD_EXTNADDR_WREAR             0xC5
# define CMD_EXTNADDR_RDEAR             0xC8
size_t bank_curr = 0;

void aw_fel_spiflash_write_helper(feldev_handle *dev,
				  uint32_t offset, void *buf, size_t len,
				  size_t erase_size, uint8_t erase_cmd,
				  size_t program_size, uint8_t program_cmd)
{
	uint8_t *buf8 = (uint8_t *)buf;
	size_t max_chunk_size = dev->soc_info->scratch_addr - dev->soc_info->spl_addr;
	size_t cmd_idx, bank_sel;

	if (max_chunk_size > 0x1000)
		max_chunk_size = 0x1000;
	uint8_t *cmdbuf = malloc(max_chunk_size);
	cmd_idx = 0;

	prepare_spi_batch_data_transfer(dev, dev->soc_info->spl_addr);
	//add bank support
	{
	cmd_idx = 0;
	bank_sel = offset /SPI_FLASH_16MB_BOUN;
	if (bank_sel == bank_curr)
		goto bar_end;

	/* Emit write enable command */
	cmdbuf[cmd_idx++] = 0;
	cmdbuf[cmd_idx++] = 1;
	cmdbuf[cmd_idx++] = CMD_WRITE_ENABLE;
	/* Emit write bank */
	cmdbuf[cmd_idx++] = 0;
	cmdbuf[cmd_idx++] = 2;
	cmdbuf[cmd_idx++] = CMD_EXTNADDR_WREAR;
	cmdbuf[cmd_idx++] = offset >> 24;
	/* Emit wait for completion */
	cmdbuf[cmd_idx++] = 0xFF;
	cmdbuf[cmd_idx++] = 0xFF;
	/* Emit the end marker */
	cmdbuf[cmd_idx++] = 0;
	cmdbuf[cmd_idx++] = 0;
	aw_fel_write(dev, cmdbuf, dev->soc_info->spl_addr, cmd_idx);
	aw_fel_remotefunc_execute(dev, NULL);
	bar_end:
		bank_curr = bank_sel;
	}
	
	cmd_idx = 0;

重新编译sunxi-fel后就可以烧录32M flash了~


你这里是修改了深哦哦就32M的可以了哦哦

离线

#23 2019-11-26 21:24:32

okshall
会员
注册时间: 2019-11-19
累计积分: 2

Re: AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel

zero flash使用w25q256fv,刚开始偶尔能烧写固件,串口无输出直接进入fel,对比写入数据发现写入无效。解决方法:每次烧写或重新上电前对zero进行短接放点即可。

离线

页脚