页次: 1
hdlazyhy 说:我好像下错版本了:(
你解决了吗,我用的5楼的,下载后还是一样的问题,下2次才能启动程序,复位后,又自己进入fel模式了,读出来的固件都不对,无语了都
楼上的方法我都试了,均失败。使用sunxi-fel工具单独对flash读写,写入的内容是错误的。例如我写入123456等数据,读回来的是001234等数据,前面总是带一个00,而且读取1024个长度,数据里面就会重复出现这个数据段。我一开始认为是sunxi-fel的问题,多次测试后,我认为是我的FLASH芯片不支持导致的,自己也尝试着阅读和修改代码,但因为水平有限修改失败。现在又吃灰了!
/*
* Write data to the SPI flash. Use the first 4KiB of SRAM as the data buffer.
*/
#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)
{
soc_info_t *soc_info = dev->soc_info;
uint8_t *buf8 = (uint8_t *)buf;
size_t max_chunk_size = soc_info->scratch_addr - 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);
//补丁代码
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;
prepare_spi_batch_data_transfer(dev, soc_info->spl_addr);
while (len > 0) {
while (len > 0 && max_chunk_size - cmd_idx > program_size + 64) {
if (offset % erase_size == 0) {
/* Emit write enable command */
cmdbuf[cmd_idx++] = 0;
cmdbuf[cmd_idx++] = 1;
cmdbuf[cmd_idx++] = CMD_WRITE_ENABLE;
/* Emit erase command */
cmdbuf[cmd_idx++] = 0;
cmdbuf[cmd_idx++] = 4;
cmdbuf[cmd_idx++] = erase_cmd;
cmdbuf[cmd_idx++] = offset >> 16;
cmdbuf[cmd_idx++] = offset >> 8;
cmdbuf[cmd_idx++] = offset;
/* Emit wait for completion */
cmdbuf[cmd_idx++] = 0xFF;
cmdbuf[cmd_idx++] = 0xFF;
}
/* Emit write enable command */
cmdbuf[cmd_idx++] = 0;
cmdbuf[cmd_idx++] = 1;
cmdbuf[cmd_idx++] = CMD_WRITE_ENABLE;
/* Emit page program command */
size_t write_count = program_size;
if (write_count > len)
write_count = len;
cmdbuf[cmd_idx++] = (4 + write_count) >> 8;
cmdbuf[cmd_idx++] = 4 + write_count;
cmdbuf[cmd_idx++] = program_cmd;
cmdbuf[cmd_idx++] = offset >> 16;
cmdbuf[cmd_idx++] = offset >> 8;
cmdbuf[cmd_idx++] = offset;
memcpy(cmdbuf + cmd_idx, buf8, write_count);
cmd_idx += write_count;
buf8 += write_count;
len -= write_count;
offset += write_count;
/* Emit wait for completion */
cmdbuf[cmd_idx++] = 0xFF;
cmdbuf[cmd_idx++] = 0xFF;
}
/* Emit the end marker */
cmdbuf[cmd_idx++] = 0;
cmdbuf[cmd_idx++] = 0;
/* Flush */
aw_fel_write(dev, cmdbuf, soc_info->spl_addr, cmd_idx);
aw_fel_remotefunc_execute(dev, NULL);
cmd_idx = 0;
}
free(cmdbuf);
}
参照代码改了后,与原来的结果一样, 不知道是不是我改的有问题。
此处是您准备引用的发言。@哇酷小二
在社区混了很久了,不能说帖子都看了,也看了八九不离十了,可还是没有搞明白这个芯片的下载究竟是怎样的。个人水平有限,有以下几个问题搞不明白,请不吝赐教!
1.按照你的描述和我的理解,芯片如果检测不到启动代码就会进入到usb-fel模式下,这时候可以通过sunxi-fel工具通过串口写入启动代码,然后手动输入跳转指令到起始地址,开始运行。不知道我的理解是不是正确?
2.一直没有搞明白F1C100S的地址分布区域和各自的作用。0x00000000~0x00007FFF 是BROM,可0xFFFF0000~0xFFFF7FFF 也是BROM。这个怎么说呢?根据sunxi-fel的烧写指令都是从0地址开始烧写boot的,难不成0x0000000~0x00007FFF是外置FLASH或SD卡的数据暂存地址?先将外置的启动代码复制到这个区域后,在跳转到这里去运行?那二级引导SPL在哪呢?既然可以直接BOOT启动,为什么还要SPL呢?
3.在usb-fel模式下,使用sunxi-fel(指令:sunxi-fel.exe -p spiflash-write 0 Blinky.bin)工具烧录是不是直接烧录到了SPI flash中了?为什么复位后仍然识别到usb-fel模式,不能从flash中启动呢?使用的是 F1C100s_with_Keil_RTX4_emWin5-AllwinnerSoC 这个项目的bin文件,或者说这个工程编译出来的代码文件还需要二次加工?
我重新看了一下原文,这里的第2个疑问中,“0xFFFF0000~0xFFFF7FFF 也是BROM”作者标注的是V3S的地址分布。看的资料多了,漏了太多的细节,不好意思了,特此更正!
@哇酷小二
在社区混了很久了,不能说帖子都看了,也看了八九不离十了,可还是没有搞明白这个芯片的下载究竟是怎样的。个人水平有限,有以下几个问题搞不明白,请不吝赐教!
1.按照你的描述和我的理解,芯片如果检测不到启动代码就会进入到usb-fel模式下,这时候可以通过sunxi-fel工具通过串口写入启动代码,然后手动输入跳转指令到起始地址,开始运行。不知道我的理解是不是正确?
2.一直没有搞明白F1C100S的地址分布区域和各自的作用。0x00000000~0x00007FFF 是BROM,可0xFFFF0000~0xFFFF7FFF 也是BROM。这个怎么说呢?根据sunxi-fel的烧写指令都是从0地址开始烧写boot的,难不成0x0000000~0x00007FFF是外置FLASH或SD卡的数据暂存地址?先将外置的启动代码复制到这个区域后,在跳转到这里去运行?那二级引导SPL在哪呢?既然可以直接BOOT启动,为什么还要SPL呢?
3.在usb-fel模式下,使用sunxi-fel(指令:sunxi-fel.exe -p spiflash-write 0 Blinky.bin)工具烧录是不是直接烧录到了SPI flash中了?为什么复位后仍然识别到usb-fel模式,不能从flash中启动呢?使用的是 F1C100s_with_Keil_RTX4_emWin5-AllwinnerSoC 这个项目的bin文件,或者说这个工程编译出来的代码文件还需要二次加工?
页次: 1