您尚未登录。

楼主 # 2025-03-01 09:11:58

memory
会员
注册时间: 2021-08-11
已发帖子: 565
积分: 537

F1C200s MX25L256、W25Q256按复位键系统不启动,可能是因为FLASH指针指向了后面那16M区域,这个问题怎么解决呢?

F1C200s MX25L256、W25Q256按复位键系统不启动,可能是因为FLASH指针指向了后面那16M区域,这个问题怎么解决呢?

离线

楼主 #1 2025-03-01 11:34:11

memory
会员
注册时间: 2021-08-11
已发帖子: 565
积分: 537

Re: F1C200s MX25L256、W25Q256按复位键系统不启动,可能是因为FLASH指针指向了后面那16M区域,这个问题怎么解决呢?

reboot命令都可以重启,按reset按键都不能重启(直接进入FEL烧录状态),MX25L256,W25Q256都一样的现象。

MX25L128 reboot命令和reset按键都能正常重启。

离线

楼主 #2 2025-03-01 11:37:25

memory
会员
注册时间: 2021-08-11
已发帖子: 565
积分: 537

Re: F1C200s MX25L256、W25Q256按复位键系统不启动,可能是因为FLASH指针指向了后面那16M区域,这个问题怎么解决呢?

跟踪代码lichee/linux-3.10/drivers/mtd/devices/m25p80.c,发现 > 16M 地址,MX和Winbond就进入了4Bytes地址模式

/*
 * Enable/disable 4-byte addressing mode.
 */
static inline int set_4byte(struct m25p *flash, u32 jedec_id, int enable)
{
	printk("jedec_id=%x,JEDEC_MFR(jedec_id)=%x,CFI_MFR_MACRONIX=%x\n", jedec_id, JEDEC_MFR(jedec_id), CFI_MFR_MACRONIX);
	switch (JEDEC_MFR(jedec_id)) {
	case CFI_MFR_MACRONIX:
	case 0xEF /* winbond */:
		if(enable) {
			printk("mx enter 4bytes mode\n");
		} else {
			printk("mx exit 4bytes mode\n");
		}
		flash->command[0] = enable ? OPCODE_EN4B : OPCODE_EX4B;
		return spi_write(flash->spi, flash->command, 1);
	default:
		/* Spansion style */
		flash->command[0] = OPCODE_BRWR;
		flash->command[1] = enable << 7;
		return spi_write(flash->spi, flash->command, 2);
	}
}
static int m25p_probe(struct spi_device *spi)
{
....
	if (info->addr_width)
		flash->addr_width = info->addr_width;
	else {
		/* enable 4-byte addressing if the device exceeds 16MiB */
		if (flash->mtd.size > 0x1000000) {
			flash->addr_width = 4;
			set_4byte(flash, info->jedec_id, 1);
		} else
			flash->addr_width = 3;
	}
....
}
static void m25p_shutdown(struct spi_device *spi)
{
	struct m25p *flash = dev_get_drvdata(&spi->dev);
	pr_info("m25p: spinor shutdown\n");

	if (flash->addr_width == 4) {
		const struct spi_device_id  *id = spi_get_device_id(spi);
		struct flash_info *info = (void *)id->driver_data;

		if (info->jedec_id) {
			const struct spi_device_id *jid;

			jid = jedec_probe(spi);
			if (IS_ERR(jid)) {
				pr_debug("IS_ERR(jid)\n");
				return;
			} else if (jid != id) {
				id = jid;
				info = (void *)id->driver_data;
			}
		}
		set_4byte(flash, info->jedec_id, 0);
	}
}

离线

楼主 #3 2025-03-01 11:50:20

memory
会员
注册时间: 2021-08-11
已发帖子: 565
积分: 537

Re: F1C200s MX25L256、W25Q256按复位键系统不启动,可能是因为FLASH指针指向了后面那16M区域,这个问题怎么解决呢?

138c69a15900d5e6f6442fc6ad032d1.jpg

弄了四块测试板

离线

楼主 #4 2025-03-01 11:51:06

memory
会员
注册时间: 2021-08-11
已发帖子: 565
积分: 537

Re: F1C200s MX25L256、W25Q256按复位键系统不启动,可能是因为FLASH指针指向了后面那16M区域,这个问题怎么解决呢?

4BYTES模式不退出,不支持RDSFDP,RES,REMS这三个命令,后面三个命令是读device id的。

f0aa1a41fda2eea4c2703b0601489f4.png

4BYTES模式不退出,不支持RDSFDP,RES,REMS这三个命令,后面三个命令是读device id的。

离线

楼主 #7 2025-03-01 11:56:20

memory
会员
注册时间: 2021-08-11
已发帖子: 565
积分: 537

Re: F1C200s MX25L256、W25Q256按复位键系统不启动,可能是因为FLASH指针指向了后面那16M区域,这个问题怎么解决呢?

直接按reset按键,FLASH没有退出4-BYTES模式,导致BROM读不到FLASH DEVICE ID,所以进入了FEL也不能烧录。

据说全志新芯片BROM开机加了 FLASH rst 软复位命令,已经解决了这个问题,用T113-S3/H133的朋友们可以试一试。

离线

楼主 #8 2025-03-04 15:02:56

memory
会员
注册时间: 2021-08-11
已发帖子: 565
积分: 537

Re: F1C200s MX25L256、W25Q256按复位键系统不启动,可能是因为FLASH指针指向了后面那16M区域,这个问题怎么解决呢?

3e1a1ebc1a874867bee22c68dd9829c.jpg

实践证明,V3S也是一样的问题。
实践证明,V3S也是一样的问题。
实践证明,V3S也是一样的问题。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn