历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2021年11月09日 | u-boot添加yaffs2烧写功能代码分析

2021-11-09 来源:eefocus

最近在学习MINI2440的u-boot移植,在添加yaffs2文件系统烧写这一功能时,网上找到的说明文档都比较笼统,都是给出代码的修改位置。而我想了解其具体执行过程,所以在移植之前简单分析了一下执行过程,记录在此。


本文分析的代码参考了一些文章以及友善之臂UBOOT移植文档的实现,这些文章中的实现基本一致,本文不会列出完整代码,请参考友善之臂UBOOT移植文档或以下文章对比查看:u-boot-2009.08在mini2440上的移植--增加yaffs2文件系统


nand命令执行时调用/common/cmd_nand.c中的do_nand()函数,这里主要的改动是增加了.yaffs2命令的解析,之后执行nand_write_skip_bad(nand,off,&size,(u_char *)addr)函数,这个函数主要的改动如下:



#if defined(CONFIG_MTD_NAND_YAFFS2)

 if(nand->rw_oob==1)

 {

   size_t oobsize = nand->oobsize;

   size_t datasize = nand->writesize;

   int datapages = 0;

   if (((*length)%(nand->oobsize+nand->writesize)) != 0)/* 这里主要判断数据是否对齐 */

   {

     printf ("Attempt to write error length data!n");

     return -EINVAL;

   }

   datapages = *length/(datasize+oobsize);

   *length = datapages*datasize;/* 从这里可以看出此时的length及left_to_write表示的是除 */

   left_to_write = *length; /* oob数据之外的数据长度 */

 }

#endif


之后调用了nand_write (nand, offset, &write_size, p_buffer)来进行写操作,要注意的是,这里传入的write_size等于上文中的length,即除oob数据之外的有效数据。


接下来的nand_write()函数的修改便是整个过程中最为重要的一个部分了



#if defined(CONFIG_MTD_NAND_YAFFS2)

 /*Thanks for hugerat's code!*/

   int oldopsmode = 0;

   if(mtd->rw_oob==1)    

     {

      int i = 0;

      int datapages = 0;

 

      size_t oobsize = mtd->oobsize;

      size_t datasize = mtd->writesize;

 

      uint8_t oobtemp[oobsize];

      datapages = len / (datasize);

/* 这个for循环将data数据与oob数据进行了整理,以方便赋值给mtd_oob_ops结构体进行写操作 */

/* 这个循环执行流程如下图所示,以5组数据为例 */

      for(i = 0; i < (datapages); i++)    

          {

          memcpy((void *)oobtemp, (void *)(buf + datasize * (i + 1)), oobsize);

          memmove((void *)(buf + datasize * (i + 1)), 

            (void *)(buf + datasize * (i + 1) + oobsize), 

            (datapages - (i + 1)) * (datasize) + (datapages - 1) * oobsize);

          memcpy((void *)(buf+(datapages) * (datasize + oobsize) - oobsize), 

            (void *)(oobtemp), oobsize);

          }

   }

#endif

从图中可以看出,整个循环结束之后内存中data与oob便分开排列了,且oob区的起始地址为datapages*1024+buf。



接下来便是为上边提到的mtd_oob_ops结构体赋值,包括data和oob的地址、长度,还设置了


chip->ops.mode = MTD_OOB_RAW;这里的意思应该是将ops.oobbuf地址中的oob数据原封不动写入oob区中。



#if defined(CONFIG_MTD_NAND_YAFFS2)//add yaffs2 file system support

 /*Thanks for hugerat's code!*/

 if(mtd->rw_oob!=1) {

   chip->ops.oobbuf = NULL;

 } else {

   chip->ops.oobbuf = (uint8_t *)(buf+len); 

   chip->ops.ooblen = mtd->oobsize;

   oldopsmode = chip->ops.mode;

   chip->ops.mode = MTD_OOB_RAW; 

 }

#else

 chip->ops.oobbuf = NULL;

#endif


之后调用nand_do_write_ops(mtd, to, &chip->ops)函数将数据写入nand flash中,整个过程就基本结束了。

推荐阅读

史海拾趣

Bytesonic Corporation公司的发展小趣事

经过几年的艰苦打拼,Bytesonic Corporation在1987年迎来了重要的转折点。这一年9月,公司资本金增至新台币500万元,为公司的进一步扩张提供了坚实的资金基础。有了更多的资本支持,公司开始加大在研发和市场推广上的投入,逐渐在行业内树立起了一定的品牌影响力。

AMERICASEMI [America Semiconductor, LLC]公司的发展小趣事

AMERICASEMI公司成立于XXXX年,起初是一家专注于半导体技术研发的小型创业公司。在创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,凭借创始团队对半导体技术的深刻理解和市场需求的敏锐洞察,AMERICASEMI成功开发出一系列具有竞争力的半导体产品,并逐渐在市场中占据了一席之地。

创世(CS)公司的发展小趣事

随着产品的不断创新和技术的不断突破,创世公司的市场份额逐渐扩大。公司的SD NAND产品已经广泛应用于医疗设备、工业控制、轨道交通、安防、网络设备等多个领域。这一市场布局的成功,不仅提升了创世公司的品牌影响力,也为其在电子行业树立了良好的口碑。同时,创世公司还积极参与各种行业展会和交流活动,与国内外客户建立了广泛的合作关系,进一步拓展了市场。

Britool Expert公司的发展小趣事

随着产品的不断创新和技术的不断突破,创世公司的市场份额逐渐扩大。公司的SD NAND产品已经广泛应用于医疗设备、工业控制、轨道交通、安防、网络设备等多个领域。这一市场布局的成功,不仅提升了创世公司的品牌影响力,也为其在电子行业树立了良好的口碑。同时,创世公司还积极参与各种行业展会和交流活动,与国内外客户建立了广泛的合作关系,进一步拓展了市场。

友盟(AP)公司的发展小趣事

友盟(AP)公司深知人才是企业发展的核心动力。因此,公司一直注重人才团队的建设和发展。通过招聘优秀人才、提供完善的培训体系和激励机制,友盟成功打造了一支高素质、专业化的团队。这支团队不仅具备深厚的技术功底和创新能力,还具备敏锐的市场洞察力和执行力,为公司的快速发展提供了有力保障。

Custom Mmic Design Services Inc公司的发展小趣事

CMDS深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,积极引进优秀人才和先进技术设备。通过持续的研发投入和人才培养,CMDS不断推出具有创新性和竞争力的新产品和解决方案。这些新产品不仅满足了客户不断变化的需求,也推动了整个行业的发展和进步。

问答坊 | AI 解惑

电子设计竞赛题目分析——放大器类题目分析

本帖最后由 paulhyde 于 2014-9-15 04:01 编辑 电子设计竞赛题目分析——放大器类题目分析  …

查看全部问答>

欠扁的壁灯

这名韩国设计师似乎跟壁灯有仇,非得让我们“恶狠狠”地欺负它们才能看到光明。那么,就让我们来探望探望这几个饱受虐待的灯具难兄难弟吧? 这家伙欠捏! 这款壁灯的外表由柔软的整块硅胶皮覆盖。要想启动它,就得拽住它的“脸皮”,用力拉扯, ...…

查看全部问答>

关于INTPND寄存器很弱智的问题

SRCPND寄存器某些位置1,表明对应位有中断请求。 那想问一下,INTPND寄存器置1的位,是表明对应位的中断正在被处理吗??…

查看全部问答>

Wince系统下,在中断服务程序里面操作I/O对系统有什么影响?

Wince系统下,在中断服务程序里面操作I/O对系统有什么影响?…

查看全部问答>

知道调CE 上网的进来一下

在调上网的时候,新建一个连接的时候,点击配置然后connmc.exe挂掉了。经检查,发现是发的命令(CGQREQ,CGQMIN)返回的数据是空的导致的。但是我手动设置一个,然后在去查也是空,请问这里要如果处理? 我用的上网的方式是用一个虚拟出两个串口, ...…

查看全部问答>

JTAG接口锁死,怎么恢复正常

                                 哪位老大帮帮忙,因为有几个接口和JTAG重了,所以我在程序中加了GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENA ...…

查看全部问答>

请教关于外部sram的问题

#include <stdio.h> #include<string.h> void main(void) {                         char s[20];         strcpy(s, \\"Hello! Turbo C2.0\\ ...…

查看全部问答>

TI产品中常用的器件-模拟和数字

     实际设计中,用到的TI器件还是蛮多的,像各种DSP,模拟器件等。德州仪器(TI)通过多种不同的处理技术提供了宽范围的运算放大器产品,在实际应用中非常广泛,其类型包括了高精度、低功率、低电压的产品。TI还开发了业界最大 ...…

查看全部问答>

430单片机自带的IIC模块

我想学学430单片机自带的IIC模块使用,现在编了段小程序,可是运行不正确,程序如下,问题在最后面。   //初始化IIC模块   UCB0CTL1 |= UCSWRST;   UCB0CTL0 |=UCMST+UCMODE1+UCMODE0+UCSYNC; // I2C Master, syn ...…

查看全部问答>