您尚未登录。

#1 Re: 全志 SOC » AllWinner全志V3s荔枝派zero板子用W25Q256,发现我烧文件系统之后,串口无输出, 直接进入芯片内部的fel » 2024-05-12 13:59:02

/*
 * 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);
}

参照代码改了后,与原来的结果一样, 不知道是不是我改的有问题。

#2 Re: 全志 SOC » 怎么进入 sunxi-fel 模式,是通过 usb 线吗? » 2024-05-12 12:08:12

我买了一个Lctech Pi F1C200S板,上面有个复位和boot按键,直接就可以进入到FEL模式下。

#5 Re: 全志 SOC » 编译、安装Windows版本sunxi-fel步骤 (32M spi flash补丁,支持W25Q256/MX25L256) » 2024-05-11 23:52:26

下载了文件还是一样的问题,写入数据和读出来的不一样。

#6 Re: 全志 SOC » 编译、安装Windows版本sunxi-fel步骤 (32M spi flash补丁,支持W25Q256/MX25L256) » 2024-05-11 23:41:03

又遇到一个坑,读写SPIFLASH芯片,前面总是带个00,断电后重启写入的数据就变了。

#7 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 是时候告别CSDN了! » 2024-05-10 20:57:39

盈利是所有网络论坛或软件的终极目标。看看AM论坛,百度文库,各大网盘,哪个不是一开始标榜共享自由,永久开放?然后呢?打脸还不是几年后?利才是核心,无可厚非(关键是胳膊拧不过大腿:p)!他方唱罢,我方登台。看戏的只求哪能看往哪坐。:D

#8 Re: 全志 SOC » F1C100S裸奔framebuffer+PWM+GPIO驱动 » 2024-05-09 15:54:20

这个项目通过烧写100%后,屏幕没有反应,串口也没有信息打印出来,折腾了很久了,不知道哪里不对。

#9 Re: 全志 SOC » F1C100S程序烧写问题 » 2024-05-09 15:41:17

此处是您准备引用的发言。@哇酷小二
  在社区混了很久了,不能说帖子都看了,也看了八九不离十了,可还是没有搞明白这个芯片的下载究竟是怎样的。个人水平有限,有以下几个问题搞不明白,请不吝赐教!
  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的地址分布。看的资料多了,漏了太多的细节,不好意思了,特此更正!

#10 Re: 全志 SOC » F1C100S程序烧写问题 » 2024-05-09 15:09:53

@哇酷小二
  在社区混了很久了,不能说帖子都看了,也看了八九不离十了,可还是没有搞明白这个芯片的下载究竟是怎样的。个人水平有限,有以下几个问题搞不明白,请不吝赐教!
  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文件,或者说这个工程编译出来的代码文件还需要二次加工?

#11 Re: 全志 SOC » f1c100s keil SDRAM 裸机调试 » 2024-05-09 14:15:29

求助,我使用的是V8,运行不了几句就会掉仿真,搞不明白怎么回事!

#12 Re: 全志 SOC » 自制PCB/KEIL MDK/JLINK裸奔F1C100S,一步一步填坑 » 2024-05-09 14:12:49

按照你的方式,能直接下载到SPI FLASH中吗?按照社区帖子,我试了好多方式,都没有反应!出坑困难啊!

#13 Re: 全志 SOC » 哇酷网友都乐于分享:为大家制作了F1C100s的RTX4+emWin5稳定项目! » 2024-05-09 14:01:41

使用工具app-prog烧录Blinky.bin文件,进度条100%后,没有任何反应是怎么回事?复位后还是FEL模式!

#14 Re: 全志 SOC » 荔枝派nano f1c100s开发板连接JLink调试器分享 - interrupt & pwm » 2024-05-09 13:50:04

我这里有时候能连接调试但是经常跑飞,要不就是连接不上,头都大了。

#15 Re: 全志 SOC » 《保姆级教程》全志F1C100S/F1C200S spi-flash 启动全流程适配烧录及踩坑指南 » 2024-05-04 19:07:52

单片机转过来的,linux基础太差了,真是一步一个坑,都想放弃了。😒

#16 Re: 全志 SOC » f1c100s keil SDRAM 裸机调试 » 2023-02-28 10:03:38

不错,这个帖子可以用来参考了,不过有个疑问,你们从哪里弄来的库文件,官网有这方面的资料吗?这个芯片用起来确实很困难啊,我还在不停的找资料和学习中,上手确实有点费劲。加油吧。

#17 Re: 全志 SOC » 荔枝派nano f1c100s开发板连接JLink调试器分享 » 2023-02-23 11:37:32

这个支持JLink的工程有更新吗?用习惯了IAR,keil编程,linux又不会。

#18 Re: 全志 SOC » F1C100S FreeRTOS工程,100%可用 » 2023-02-23 11:32:43

这个是f1c100s的空开发工程吗?不知道f1c100s有没有函数库可以用或者有寄存器用户手册参考,自己操作寄存器也行,资料不完善没法下手啊。

#19 Re: Cortex M0/M3/M4/M7 » TKM32F499 M4核心,内置8MB SRAM的单片机来啦,批量20块钱1片 » 2023-02-23 11:24:33

买了一个开发板,目前还在吃灰中。代码写了一部分,能正常的跑程序点屏,但就是每次下载编译太麻烦了,先看看f1c200芯片好不好搞,在考虑要不要换回F499。

#20 Re: 全志 SOC » [F1C100S / F1C200S] Bare metal / RTOS hardware H264 effort » 2023-02-23 10:57:35

都是大神级别啊!最近我也在看f1c100s芯片,上手弄了一遍uboot,怎奈纯单片机开发不懂Linux编程,学起来真是一头雾水我都想放弃了。千回百转找到这里,感觉又来劲了!😄

页脚

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

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