关于uboot下cp.b如果两个地址同为flash地时,buffer无法正常写的原因

u-boot下的指令操作 常用的信息查询命令 信息查询命令主要有3个,分别是bdinfo、printenv和version命令 =>bdinfo 该命令用来查询当前板子的相关信息可通过该命令可以查看板子的DRAM的大小以及DRAM的起始地址、当前使用的网络接口以及IP地址、波特率和 uboot偏移地址以及偏移量等相关信息。 =>printenv 该命令用于查询当前板子的一些相关环境变量。 =>version 该命令用于查询uboot版本和交叉编译工具的相关信息。 环境变量相关命令 环境变量 阅读详情

第一、cp.b命令说明

cp [.b, .w, .l] source target count

       - copy memory

cp命令可以在内存中复制数据块,包括对Flash的读写操作。

第1个参数source是要复制的数据块起始地址。

第2个参数target是数据块要复制到的地址。这个地 址如果在Flash中, 那么会直接调用写Flash的函数操作。所以U-Boot写Flash就使用这个命令,当然需要先把对应Flash区域擦干净。

第3个参数count是要复制的数目,根据cp.b cp.w cp.l分别以字节、字、长字为单位。

第二、一般我们在用这个命令时第一个参数一般为sdram的地址空间,这时我们调用这个命令是可以正常操作的,但是如果第一个参数如果是片外norflash的地址,钱对不同的norflash就有问题了,会发现如果count大于1时,写入norflash的数据是不对的。这是为什么呢?根本的原因要看一下这个flash的底层写函数如下:

static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp, int len)

{
flash_sect_t sector;
int cnt;
int retcode;
void *src = cp;
void *dst = (void *)dest;
void *dst2 = dst;
int flag = 1;
uint offset = 0;
unsigned int shift;
uchar write_cmd;


switch (info->portwidth) {
case FLASH_CFI_8BIT:
shift = 0;
break;
case FLASH_CFI_16BIT:
shift = 1;
break;
case FLASH_CFI_32BIT:
shift = 2;
break;
case FLASH_CFI_64BIT:
shift = 3;
break;
default:
retcode = ERR_INVAL;
goto out_unmap;
}


cnt = len >> shift;


while ((cnt-- > 0) && (flag == 1)) {
switch (info->portwidth) {
case FLASH_CFI_8BIT:
flag = ((flash_read8(dst2) & flash_read8(src)) ==
flash_read8(src));
src += 1, dst2 += 1;
break;
case FLASH_CFI_16BIT:
flag = ((flash_read16(dst2) & flash_read16(src)) ==
flash_read16(src));
src += 2, dst2 += 2;
break;
case FLASH_CFI_32BIT:
flag = ((flash_read32(dst2) & flash_read32(src)) ==
flash_read32(src));
src += 4, dst2 += 4;
break;
case FLASH_CFI_64BIT:
flag = ((flash_read64(dst2) & flash_read64(src)) ==
flash_read64(src));
src += 8, dst2 += 8;
break;
}
}
if (!flag) {
retcode = ERR_NOT_ERASED;
goto out_unmap;
}


src = cp;
sector = find_sector (info, dest);


switch (info->vendor) {
case CFI_CMDSET_INTEL_PROG_REGIONS:
case CFI_CMDSET_INTEL_STANDARD:
case CFI_CMDSET_INTEL_EXTENDED:
write_cmd = (info->vendor == CFI_CMDSET_INTEL_PROG_REGIONS) ?
FLASH_CMD_WRITE_BUFFER_PROG : FLASH_CMD_WRITE_TO_BUFFER;
flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS);
flash_write_cmd (info, sector, 0, FLASH_CMD_READ_STATUS);
flash_write_cmd (info, sector, 0, write_cmd);
retcode = flash_status_check (info, sector,
     info->buffer_write_tout,
     "write to buffer");
if (retcode == ERR_OK) {
/* reduce the number of loops by the width of
* the port */
cnt = len >> shift;
flash_write_cmd (info, sector, 0, cnt - 1);
while (cnt-- > 0) {
switch (info->portwidth) {
case FLASH_CFI_8BIT:
flash_write8(flash_read8(src), dst);
src += 1, dst += 1;
break;
case FLASH_CFI_16BIT:
flash_write16(flash_read16(src), dst);
src += 2, dst += 2;
break;
case FLASH_CFI_32BIT:
flash_write32(flash_read32(src), dst);
src += 4, dst += 4;
break;
case FLASH_CFI_64BIT:
flash_write64(flash_read64(src), dst);
src += 8, dst += 8;
break;
default:
retcode = ERR_INVAL;
goto out_unmap;
}
}
flash_write_cmd (info, sector, 0,
FLASH_CMD_WRITE_BUFFER_CONFIRM);
retcode = flash_full_status_check (
info, sector, info->buffer_write_tout,
"buffer write");
}


break;


case CFI_CMDSET_AMD_STANDARD:
case CFI_CMDSET_AMD_EXTENDED:
flash_unlock_seq(info,0);//发送unlock


#ifdef CONFIG_FLASH_SPANSION_S29WS_N
offset = ((unsigned long)dst - info->start[sector]) >> shift;
#endif
flash_write_cmd(info, sector, offset, AMD_CMD_WRITE_TO_BUFFER);//发送 write buffer command
cnt = len >> shift;
flash_write_cmd(info, sector, offset, cnt - 1);
switch (info->portwidth) {
case FLASH_CFI_8BIT:
while (cnt-- > 0) {
flash_write8(flash_read8(src), dst);//在这里是在写命令发完后又去从norflash中去读,如果src是一个sdram的地址,这样是没有问题,但如果是同一个norflash的内部地址,有时是读不出来正确值的,因为在发送完write buffer command后,这时norflash已经进入了write buffer 状态,不是read状态,这时去读是读不正确值,如果这完成这个操作,我们必须在这之前把flash中的数 先读到一个buffer中,再去调用整个write buffer的操作流程。
src += 1, dst += 1;
}
break;
case FLASH_CFI_16BIT:
while (cnt-- > 0) {

flash_write16(flash_read16(src), dst);
src += 2, dst += 2;


}
break;
case FLASH_CFI_32BIT:
while (cnt-- > 0) {
flash_write32(flash_read32(src), dst);
src += 4, dst += 4;
}
break;
case FLASH_CFI_64BIT:
while (cnt-- > 0) {
flash_write64(flash_read64(src), dst);
src += 8, dst += 8;
}
break;
default:
retcode = ERR_INVAL;
goto out_unmap;
}


flash_write_cmd (info, sector, 0, AMD_CMD_WRITE_BUFFER_CONFIRM);
printf("****send command 0x29 end!****\n\r");//jackyard
if (use_flash_status_poll(info))
retcode = flash_status_poll(info, src - (1 << shift),
   dst - (1 << shift),
   info->buffer_write_tout,
   "buffer write");
else
retcode = flash_full_status_check(info, sector,
 info->buffer_write_tout,
 "buffer write");
break;


default:
debug ("Unknown Command Set\n");
retcode = ERR_INVAL;
break;
}


out_unmap:
return retcode;
}

s3c2440中U-boot移植执行cp.b提示:Flash not Erased 在源码中搜索Flash not Erased,在common/flash.c中flash_perror()函数为错误打印函数 void flash_perror (int err) {          switch(err) {          caseERR_OK:                    break;          caseERR_TIMOUT:       阅读详情

相关推荐

u-boot命令详解

将命令挡在一个集合,设置环境变量,然后通过run执行。

逆鳞_Kevin的博客 4220

【bmc1】概要,构建,分区,升级,uboot,dual flash,tls,secureboot

读取内存到mmc设备里:在uboot中更新uboot:这里要用到nfs或tftp命令将新的u-boot.bin下载到开发板的DRAM中【tftp/tftpboot 80800000 u-boot.imx,重新编译uboot并将编译出来的u-boot.imx拷贝到Ubuntu中的tftpboot 目录下】,u-boot.imx大小为379904字节, 379904/512=742,所以我们要向SD卡中入742个块,如果有小数的话就要加1个块。

持续更新ing... 6230

NXP QorIQ平台USDPAA环境下SRIO与RMU应用开发实战指南

在嵌入式高性能计算与通信系统中,芯片间与板卡间的高速数据交换是核心挑战。传统以太网或PCIe互联在微秒级甚至纳秒级确定性延迟场景下存在瓶颈,而基于包交换的互连技术(如RapidIO)则提供了硬件直连的效率与网络通信的灵活性。其原理是通过远程直接内存访问(RDMA)和硬件DMA引擎,实现零拷贝的数据搬运,从而将数据面性能潜力彻底释放。这项技术的核心价值在于为雷达信号处理、通信基础设施和高端网络设备等对延迟与吞吐量有严苛要求的应用场景,提供了确定性的高性能互连方案。本文聚焦于在NXP QorIQ处理器平台上,基

weixin_30654583的博客 416

uboot指令

1、bootm bootm [addr [arg …]] 作用: bootm命令可以引导启动存储在内存中的程序映像。这些内存包括RAM和可以永久保存的Flash。 参数: 第1个参数addr是程序映像的地址,这个程序映像必须转换成U-Boot的格式。 第2个参数对于引导Linux内核有用,通常作为U-Boot格式的RAMDISK映像存储地址;也可以是传递给Linux内核的参数(缺省情况下...

刘星燎 1631

Uboot启动参数说明

29.Uboot 启动参数说明: bootcmd=cp.b 0xc4200000 0x7fc0 0x200000 ; bootm // 倒计到 0 以后,自动执行的指令 bootdelay=2 baudrate=38400 // 串口波特率,一般使用 38400 ethaddr=08:00:3e:26:0a:5c bootfile="uImage" ethact=lan911x serverip=10.117.192.3 // 指定 linux 服务器的 ip 地址,在进行 tft..

一口Linux的专栏 3472

uboot的移植——移植uboot官方的uboot到x210开发板(2)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 1496

终极指南:如何将小爱音箱改造为开源智能家居语音助手

小爱音箱自定义固件项目是一个功能完整的开源解决方案,专门为技术开发者和智能家居爱好者设计,旨在将普通的小爱音箱改造为功能强大的开源智能家居中心。通过替换原厂固件,你可以安装各种开源软件,实现个性化的智能语音助手和多媒体播放功能,彻底摆脱厂商限制,打造真正属于自己的智能设备。 ## 📋 项目核心功能与技术架构 ### 开源智能语音助手系统 小爱音箱自定义固件项目集成了多种开源语音技术,提供了一

gitblog_01091的博客 281

MPC8379E网络处理器架构解析与嵌入式开发实战

在嵌入式网络设备开发中,片上系统(SoC)通过高度集成处理器核心、内存控制器、网络接口及硬件加速引擎,实现了性能、成本与功耗的平衡。其核心原理在于将关键外设与计算单元整合,通过硬件卸载(如TCP/IP校验和、加密解密)减轻CPU负担,从而提升系统整体效率与实性。这种设计为网络通信、工业网关等场景提供了高性价比的解决方案,尤其适用于对硬件集成度与长期稳定性有要求的项目。本文以MPC8379E为例,深入探讨其Power Architecture e300c4核心、双千兆以太网控制器(eTSEC)及集成安全引擎

alppkk4545的博客 507

USDPAA与Linux以太网集成:P4080DS高性能网络数据面配置实战

在嵌入式网络处理领域,数据包处理性能是核心挑战。传统的内核网络协议栈路径因中断、上下文切换和内存拷贝,难以满足高吞吐、低延迟场景。数据路径加速架构(DPAA)通过硬件队列管理器(QMan)、帧管理器(FMan)等专用引擎,将数据面处理任务从通用CPU卸载,实现了接近线速的转发能力。其用户空间接口USDPAA允许应用程序直接访问这些硬件加速器,彻底旁路内核协议栈,从而释放极致性能。这种架构的技术价值在于为路由器、防火墙、负载均衡器等网络设备提供了确定性的高性能数据平面。本文以NXP QorIQ P4080处理

weixin_34296641的博客 411

匠芯创 D211 SerDes Kit — Bring-Up 指南(AI开发笔记)

板级层— 钟、引脚复用、DDR、分区布局Bootloader— 裸机 SPL,加载 OS应用— RT-Thread 应用,打印启动成功信息构建系统:OneStep 工作流、defconfig 管理、SDK 修改定义 NAND flash 的物理参数和分区布局,每个分区有明确的用途。分区大小用途spl1 MB存放 Bootloader 镜像(),芯片上电后 ROM/PBP/SPL 从这里加载env256 KB。

iloveluoluo一个小白程序员 412

OpenBMC嵌入式AI调试实战:Claude Code与GLM 5.1本地化部署

OpenBMC作为服务器基板管理控制器的核心固件平台,正逐步集成AI能力以提升硬件级诊断效率。其本质是将大语言模型(LLM)推理能力下沉至资源受限的ARM嵌入式Linux环境,需突破musl libc兼容性、ARMv7指令集约束、systemd服务生命周期管理及Secure Boot签名验证等底层限制。技术价值在于实现uboot启动链路分析、kernel panic语义归因、Kconfig配置辅助生成等硬核场景,而非通用代码生成。典型应用包括数据中心BMC固件定制、硬件运维自动化、边缘智能诊断系统构建。本文

weixin_30376083的博客 413

手撕ARM64启动栈(一):QEMU + TF-A → OP-TEE → U-BootLinux 全链路总览

ARM 官方提供的参考固件实现,本文用作 BL1/BL2/BL31:开源 TEE 实现,本仓库用作 BL32,运行在 S-EL1,通过 opteed(SPD)与 BL31 交互,提供 TA 运行环境U-Boot:本仓库用作 BL33/Normal World bootloader,通过 ARM semihosting(,非网络/非fw_cfg)从宿主机文件系统读取内核与 initrd,bootm跳转内核。

Fifty的博客 450

optee介绍(一)代码下载编译以及使用qemu运行

本文主要介绍了optee代码的下载编译以及使用qemu运行,以及此过程中可能遇到的问题及解决方案。本文着重介绍手动下载代码方式,主要针对repo下载方式因为万络原因容易失败的情况,若是网络好,可使用repo下载会更方便。

Fifty的博客 2103

note

<think>我们只需要根据内容生成摘要,≤150字。内容涉及LCD驱动、GPIO、MIPI、背光、调试等,但要求是“文章摘要”,需要简明概括主题。内容很杂,可能是技术笔记。摘要应涵盖主要内容:LCD点屏相关内容,包括GPIO、电源、MIPI DSI、背光、调试方法等。注意字数。</think>本文总结了LCD屏幕驱动调试经验,涵盖GPIO配置、电源/背光控制、MIPI DSI序、DDIC初始化及常见问题(花屏、ESD恢复)的排查方法。

m0_73462935的博客 9万+

uboot 常用命令

U-Boot常用命令

weixin_53200959的博客 1698

Ubootbootargs以及bootcmd设置

u-boot有两种工作模式:自启动模式, 交互模式。​ 交互模式:开发板上电之后,u-boot启动,在串口工具上打印各种信息,当出现倒计之后,按下电脑键盘上的任意键,此就会进入到u-boot的交互模式,我们就可以输入各种u-boot命令和u-boot进行交互,u-boot内部解析串口输入的u-boot命令。

MrWangHao的博客 3313

uboot内存操作命令

uboot内存操作命令命令用于直接对DRAM进行读操作,常用命令有md、nm、mm、mw、cp、cmp。

qq_22870815的博客 2161

uboot常见命令使用(一)

Uboot中的一些命令

qaqq55的博客 813
上一篇: 监控 Linux 性能的 18 个命令行工具
下一篇: uboot 2012.10移植到at91sam9260ek草稿之一
Bean Huo
博客等级 码龄18年 40粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值