flash info.

 32 typedef struct {
 33     ulong   size;           /* total bank size in bytes     */
 34     ushort  sector_count;       /* number of erase units        */
 35     ulong   flash_id;       /* combined device & manufacturer code  */
 36     ulong   start[CONFIG_SYS_MAX_FLASH_SECT];   /* virtual sector start address */
 37     uchar   protect[CONFIG_SYS_MAX_FLASH_SECT]; /* sector protection status */
 38 #ifdef CONFIG_SYS_FLASH_CFI                                                                                            
 39     uchar   portwidth;      /* the width of the port        */
 40     uchar   chipwidth;      /* the width of the chip        */
 41     ushort  buffer_size;        /* # of bytes in write buffer       */
 42     ulong   erase_blk_tout;     /* maximum block erase timeout      */
 43     ulong   write_tout;     /* maximum write timeout        */
 44     ulong   buffer_write_tout;  /* maximum buffer write timeout     */
 45     ushort  vendor;         /* the primary vendor id        */
 46     ushort  cmd_reset;      /* vendor specific reset command    */
 47     ushort  interface;      /* used for x8/x16 adjustments      */
 48     ushort  legacy_unlock;      /* support Intel legacy (un)locking */
 49     uchar   manufacturer_id;    /* manufacturer id          */
 50     ushort  device_id;      /* device id                */
 51     ushort  device_id2;     /* extended device id           */
 52     ushort  ext_addr;       /* extended query table address     */
 53     ushort  cfi_version;        /* cfi version              */
 54     ushort  cfi_offset;     /* offset for cfi query         */
 55     ulong   addr_unlock1;       /* unlock address 1 for AMD flash roms  */
 56     ulong   addr_unlock2;       /* unlock address 2 for AMD flash roms  */
 57     const char *name;       /* human-readable name                  */
 58 #endif
 59 } flash_info_t;

flash_fill_sect_ranges() find the flash sector about the addr you point out when erase flash.

需要用到flash_info,这个变量是在flash_init()里初始化的.

delete define of CONFIG_SYS_FLASH_CFI? means what?

 

 

 28 COBJS-$(CONFIG_MTD_PARTITIONS) += mtdcore.o mtdpart.o
 29 COBJS-$(CONFIG_HAS_DATAFLASH) += at45.o
 30 COBJS-$(CONFIG_FLASH_CFI_DRIVER) += cfi_flash.o
 31 COBJS-$(CONFIG_FLASH_CFI_MTD) += cfi_mtd.o                                                                             
 32 COBJS-$(CONFIG_HAS_DATAFLASH) += dataflash.o
 33 COBJS-$(CONFIG_FLASH_CFI_LEGACY) += jedec_flash.o
 34 COBJS-$(CONFIG_MW_EEPROM) += mw_eeprom.o

 

common/Makefile

 COBJS-$(CONFIG_CMD_FLASH) += cmd_flash.o

COBJS-$(CONFIG_CMD_SF) += cmd_sf.o  

 

in cmd_sf.c

182 U_BOOT_CMD(
183     sf, 5,  1,  do_spi_flash,
184     "SPI flash sub-system",
185     "probe [bus:]cs [hz] [mode] - init flash device on given SPI bus/n"
186     "                 and chip select/n"
187     "sf read addr offset len    - read `len' bytes starting at/n"
188     "                 `offset' to memory at `addr'/n"
189     "sf write addr offset len   - write `len' bytes from memory/n"
190     "                 at `addr' to flash at `offset'/n"
191     "sf erase offset len        - erase `len' bytes from `offset'/n");

 

如果执行"erase"命令,调用顺序是U_BOOT_CMD->do_flerase()->flash_sect_erase(), in cmd_flash.c

 

 

# sf probe
 8 MB
exit spi_flash_probe
<cmd_sf.c>(do_spi_flash_probe)[61]
<cmd_sf.c>(do_spi_flash_probe)[66]

看来flash这个结构体没有赋值好.

今天就到这吧.

 

 

11/29/2010

         printf("flash name[%d] = %s/n", i, params->name);  打印不出来,死机.

 

409     printf("flash name = %s/n", stm->flash.name); 也会死机,看来和%s有关.

 先临时赋值给stm->flash.name了,看来是那个spi flash 结构体的排列问题,导致name取不出正确的值来显示,然后死机.

 

现在好像flash还是工作在4M模式,擦offset=0,就是擦bfc.

sflash的erase write read的驱动,都要使用bfc那个地址,I don't know why. now erase, write, read is ok.

串行flash的loader都要烧到flash的最开始位置?不用管bfc?

 

 

现在tftp的方式启动kernel 后,会死机,

Registering unionfs 2.2-mm
msgmni has been set to 82
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
LTT : ltt-relay init
i8042.c: i8042 controller self test timeout.
Serial: 8250/16550 driver2 ports, IRQ sharing disabled
serial8250: ttyS0 at MMIO 0x10101003 (irq = 56) is a 16550A
brd: module loaded
nec_candy: 10/100 Ethernet driver v0.4 (June 20, 2006)
nec_candy: Probe candy chip at 0x10012000, irq 44, Phy ID 0x00000001, MAC Addr 0
0:00:4c:80:92:a1
console [netcon0] enabled
netconsole: network logging started
i2c /dev entries driver
Driver 'sd' needs updating - please use bus_type methods
Driver 'sr' needs updating - please use bus_type methods
physmap platform flash device: 00800000 at 1f800000

看来如果要kernel启动起来,需要加上kernel中sflash的驱动.

 

 

就这样吧,没时间弄了,交给后面的工程师弄吧.

 

cmd /C program_flash -f \ E:\1.work\24.10G\2.FPGA\xgvrd-mvdk-zx5-n-20251031_2\vitis\xgvrd_system\_ide\bootimage\BOOT.bin \ -offset 0 -flash_type qspi-x4-single -fsbl \ E:\1.work\24.10G\2.FPGA\xgvrd-mvdk-zx5-n-20251031_2\vitis\xgvrd_platform\export\xgvrd_platform\sw\xgvrd_platform\boot\fsbl.elf \ -url TCP:127.0.0.1:3121 ****** Xilinx Program Flash ****** Program Flash v2022.2 (64-bit) **** SW Build (by xbuild) on 2022-10-13-12:09:39 ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. WARNING: Failed to connect to hw_server at TCP:127.0.0.1:3121 Attempting to launch hw_server at TCP:127.0.0.1:3121 Connected to hw_server @ TCP:127.0.0.1:3121 Target not specified. Selecting target_id 2 (arm_dap) by default. Retrieving Flash info... Initialization done Using default mini u-boot image file - E:/2.software/vivado2022/Vitis/2022.2/data\xicom\cfgmem\uboot\zynq_qspi_x4_single.bin ===== mrd->addr=0xF800025C, data=0x00000001 ===== BOOT_MODE REG = 0x00000001 WARNING: [Xicom 50-100] The current boot mode is QSPI. Flash programming is not supported with the selected boot mode.If flash programming fails, configure device for JTAG boot mode and try again. ===== mrd->addr=0xF8007080, data=0x30800100 ===== ===== mrd->addr=0xF8000B18, data=0x80008000 ===== Downloading FSBL... Running FSBL... Finished running FSBL. ===== mrd->addr=0xF8000110, data=0x000FA220 ===== READ: ARM_PLL_CFG (0xF8000110) = 0x000FA220 ===== mrd->addr=0xF8000100, data=0x00028008 ===== READ: ARM_PLL_CTRL (0xF8000100) = 0x00028008 ===== mrd->addr=0xF8000120, data=0x1F000200 ===== READ: ARM_CLK_CTRL (0xF8000120) = 0x1F000200 ===== mrd->addr=0xF8000118, data=0x001452C0 ===== READ: IO_PLL_CFG (0xF8000118) = 0x001452C0 ===== mrd->addr=0xF8000108, data=0x0001E008 ===== READ: IO_PLL_CTRL (0xF8000108) = 0x0001E008 Info: Remapping 256KB of on-chip-memory RAM memory to 0xFFFC0000. ===== mrd->addr=0xF8000008, data=0x00000000 ===== ===== mwr->addr=0xF8000008, data=0x0000DF0D ===== MASKWRITE: addr=0xF8000008, mask=0x0000FFFF, newData=0x0000DF0D ===== mwr->addr=0xF8000910, data=0x000001FF ===== ===== mrd->addr=0xF8000004, data=0x00000000 ===== ===== mwr->addr=0xF8000004, data=0x0000767B ===== MASKWRITE: addr=0xF8000004, mask=0x0000FFFF, newData=0x0000767B Problem in running uboot Flash programming initialization failed. ERROR: Flash Operation Failed分析失败原因
最新发布
11-01
<think>首先,用户的问题是:分析使用cmd执行program_flash命令进行Flash编程时出现'ERROR: Flash Operation Failed'错误的原因。 用户提供了两个引用: - 引用[1]:关于在cmd文件中添加一个名为flash28_API的SECTIONS,用于Flash编程。这似乎是针对特定嵌入式系统的配置。 - 引用[2]:关于操作权限问题(EPERM: operation not permitted),建议通过组策略禁用以管理员模式批准运行所有管理员。 用户还说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,没有之前的问题历史。所以,我需要基于当前上下文回答。 关键点: - 用户在使用cmd执行program_flash命令时遇到错误。 - 错误消息是“ERROR: Flash Operation Failed”。 - 引用可能与相关配置有关。 我需要分析错误原因。既然用户提到了Flash编程,这可能涉及到嵌入式系统开发,比如使用TI的DSP或类似平台,因为引用[1]提到了Flash28335 API。 常见原因: 1. **权限问题**:就像引用[2]提到的,如果没有足够的权限,命令可能失败。在Windows中,cmd需要以管理员身份运行。 2. **配置错误**:引用[1]讨论了修改cmd文件(链接器配置文件)来正确加载Flash API的部分。如果配置不正确,Flash编程可能失败。 3. **硬件问题**:目标设备连接问题、供电问题或通信错误。 4. **软件问题**:Flash编程工具的bug、版本不兼容或路径错误。 5. **环境问题**:环境变量设置不正确、缺少依赖库等。 结合引用: - 引用[1]暗示cmd文件需要正确配置以支持Flash API的操作。 - 引用[2]提示权限问题,可能相关。 用户上次的问题和回答:对话中没有之前的交互。系统指令说“参考用户上一次的问题和你的回答”,但这是首次交互。所以,我应该专注于当前问题。 回答结构: - 遵循系统指令:使用中文回答,结构清晰。 - 使用$...$和$$...$$格式:如果涉及数学表达式,但这里可能不需要,除非有公式。 - 生成相关问题:在末尾添加。 步骤分析错误原因: 1. **权限不足**:建议以管理员身份运行cmd。 2. **cmd文件配置错误**:引用[1]的内容,确保Flash API部分正确加载。 3. **设备访问问题**:检查设备连接、驱动安装。 4. **命令参数错误**:确保program_flash命令的参数正确。 5. **Flash操作特定错误**:可能需要查看日志或调试输出。 最终回答应: - 给出可能的原因列表。 - 提供解决方法。 - 添加引用标识。 引用使用: - 在回答中,自然地添加引用标识到相关部分末尾。例如,讨论cmd文件配置时,添加[^1];讨论权限时,添加[^2]。 生成相关问题: - 在末尾添加3-5个相关问题。 回答大纲: 1. 介绍错误。 2. 分析可能原因: - 权限问题 [^2] - cmd文件配置错误 [^1] - 其他原因(连接、参数等) 3. 建议解决方法。 4. 相关问题。 </think>### ERROR: Flash Operation Failed错误原因分析 在使用cmd执行`program_flash`命令进行Flash编程时,出现"ERROR: Flash Operation Failed"错误,通常与Flash操作过程中的权限、配置或硬件问题相关。基于您提供的引用和常见实践,我将逐步分析可能的原因并提供解决方法。以下是主要原因的详细分析: #### 1. **权限不足导致操作失败(常见原因)** - **原因描述**:在Windows系统中,Flash编程操作可能需要管理员权限才能访问硬件端口或执行底层操作。如果cmd未以管理员身份运行,或系统安全策略限制了操作权限,就会触发类似"operation not permitted"的错误[^2]。 - **解决方法**: - 以管理员身份运行cmd:右键点击cmd图标,选择“以管理员身份运行”,然后重新执行`program_flash`命令。 - 修改系统组策略(如引用[2]所述): - 按Win+R打开“运行”,输入`gpedit.msc`。 - 导航到“计算机配置”>“Windows设置”>“安全设置”>“本地策略”>“安全选项”。 - 找到“用户帐户控制-以管理员模式批准运行所有管理员”选项,将其禁用。 - 检查防病毒软件:临时禁用防火墙或防病毒软件,测试是否被拦截。 #### 2. **cmd文件配置错误或不完整** - **原因描述**:Flash编程依赖于正确的链接器配置文件(例如`.cmd`文件)。如果文件未正确包含Flash API库(如`Flash28335_API_V210.lib`),或SECTIONS配置错误,可能导致Flash操作失败。引用[1]提到需要在SECTIONS中添加针对Flash的加载和运行地址配置(如`LOAD = FLASHA, RUN = RAML0`)。如果`program_flash`命令引用的文件缺少这些定义,会引发错误[^1]。 - **解决方法**: - 验证并修改cmd文件: - 确保在`SECTIONS`中添加或更新类似以下内容: ```cmd SECTIONS { Flash28_API: { -lFlash28335_API_V210.lib(.econst) -lFlash28335_API_V210.lib(.text) } LOAD = FLASHA, RUN = RAML0, LOAD_START(_Flash28_API_LoadStart), LOAD_END(_Flash28_API_LoadEnd), RUN_START(_Flash28_API_RunStart), PAGE = 0 } ``` - 确认库文件路径正确:检查`.lib`文件是否在工程路径中,并在cmd文件中使用绝对或相对路径。 - 重新编译工程:确保修改后的cmd文件被包含在build过程中。 #### 3. **其他潜在原因** - **设备连接或通信问题**:USB接口松动、目标设备供电不足或驱动未安装,可能导致Flash编程失败。使用工具(如TI的CCS调试器)检查设备连接状态。 - **命令参数错误**:`program_flash`命令的参数(如Flash地址、数据文件路径)设置不正确。执行命令时添加`-v`(verbose)选项查看详细日志,例如: ```cmd program_flash -v -f your_file.bin ``` - **软件兼容性问题**:Flash编程工具版本与目标设备固件不兼容。检查工具(如TI Flash API)的版本要求,并更新到最新版本。 - **硬件保护机制**:目标设备的Flash区域可能被写保护。检查设备的锁定位或安全配置。 #### 调试建议 - **查看错误日志**:运行命令后,检查cmd输出的完整错误消息(可能包含额外线索,如"EPERM"或内存地址错误)。 - **分步测试**: 1. 先验证权限问题(步骤1)。 2. 再检查配置文件(步骤2)。 3. 最后测试硬件:尝试简单读写操作(如`read_flash`命令)。 - **工具辅助**:使用调试器(如JTAG)捕获Flash操作信号,确认是否超时或数据校验失败。 如果以上方法无效,请提供更多上下文(如命令输出、硬件型号或工具版本),以便进一步分析。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值