历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2021年07月30日 | 移植uboot-支持yaffs烧写,打补丁

2021-07-30 来源:eefocus

1. 修改uboot支持yaffs


首先,每个命令都会对应一个文件,比如nand命令对应的common/cmd_nand.c


而我们使用nand命令时,便会进入do_nand()函数,位于common/cmd_nand.c


1.1do_nand()函数代码如下所示:


int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])

{

 ... ...


 if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0)

{

      ... ...

#ifdef CONFIG_CMD_NAND_YAFFS                   //是否支持YAFFS烧写else if (!strcmp(s, ".yaffs")) 

        {                             //若是nand write.yaffs ... ... ,则进入该判断

               if (read) {              

                           printf("Unknown nand command suffix '%s'.n", s);

                           return 1;          }


              ret = nand_write_skip_bad(nand, off, &rwsize, (u_char *)addr, WITH_YAFFS_OOB);

                                                //进入nand_write_skip_bad,烧写


#endif

      ... ...


}


所以需要在smdk2440.h里,添加CONFIG_CMD_NAND_YAFFS宏定义.


1.2然后进入nand_write_skip_bad(),位于drivers/mtd/nand/nand_util.c


int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,u_char *buffer, int flags)

{

       ... ...

       if (!need_skip && !(flags & WITH_DROP_FFS))             //这里需要修改

      {

        rval = nand_write (nand, offset, length, buffer);             //正常拷贝,不考虑OOB问题

              if (rval == 0)  

                     return 0;                                                 //拷贝完后,return

              *length = 0;

              printf ("NAND write to offset %llx failed %dn",offset, rval);

              return rval;

      }


       while (left_to_write > 0)       //需要烧写的块数

     {             

       #ifdef CONFIG_CMD_NAND_YAFFS

              if (flags & WITH_YAFFS_OOB)

           {

              ... ...

              ops.mode = MTD_OOB_AUTO;  //这里需要修改

              ... ...

              for (page = 0; page < pages; page++) //for循环烧写每一页

             {

               ... ...  


               rval = nand->write_oob(nand, offset, &ops);   //调用nand_write_oob()函数烧写OOB

               if (!rval)                             //这里需要修改

                 break;           //烧写失败,退出for循环

               offset += pagesize;

               p_buffer += pagesize_oob;

            }

      }

    ... ...

}


1)将上面if (!need_skip && !(flags & WITH_DROP_FFS))改为if (!need_skip && !(flags & WITH_DROP_FFS) &&!(flags & WITH_YAFFS_OOB))


因为避免输入nand write.yaffs时,直接进入该判断,然后不执行下面的while (left_to_write > 0) 语句


2)将上面的MTD_OOB_AUTO改为MTD_OOB_RAW (表示支持烧写OOB数据,用来存放yaffs参数)


因为MTD_OOB_AUTO,使自动填入OOB,不填入yaffs文件里的数据,从而启动不了内核


3)将上面第14行if (!rval) 改为if (rval)


因为nand->write_oob()函数里面,烧写正确时,是返回的一个非整数.


1.3然后使用nand dump 260000,与yaffs文件对比,可以看到OOB已经烧写成功

对于64B的OOB而言,数据定义如下所示:


bit0:表示该块的数据是否为坏,若为0xFF表示好的,0x00则是坏的 (一块=64页)

bit1:暂时没用到

bit2~39:表示用来存放oob数据,若是yaffs文件,则会存放yaffs参数,所以才要修改1.2小节的代码

bit40~63:存放ecc校验值,该页的每256B字节,就会生成3字节数据存放到ecc里

具体参考nand_oob_64全局结构体变量


1.4 然后烧写yaffs试验


tftp 30000000 fs_mini_mdev.yaffs2


nand erase.part rootfs


nand write.yaffs 30000000 260000  $filesize    

      //文件系统太大,所以输入$filesize,来根据文件系统真正大小来烧写 


tftp 30000000 fs_mini_mdev.jffs2


boot


(PS:若启动文件系统失败,考虑下环境变量,OOB,内核是否正确)         


2. 使用part制作补丁


打补丁之前,首先需要清除make后的编译文件,以及自己编译出的反汇编文件等


步骤如下:


make distclean           //清除生成的所有文件

rm u-boot.dis             


cd ..

mv u-boot-2012.04.01 u-boot-2012.04.01_new  //重新命名

tar -xjf u-boot-2012.04.01.tar.bz2                       //创建原文件

diff -urN u-boot-2012.04.01 u-boot-2012.04.01_new > u-boot-2012.04.01_new.patch  //生成补丁


推荐阅读

史海拾趣

德尔创(Dersonic)公司的发展小趣事

德尔创(Dersonic)公司成立于XXXX年,由一群电子工程领域的专家共同创立。成立之初,公司面临着资金紧张、市场竞争激烈等挑战。然而,他们凭借对电子技术的深刻理解和对市场的敏锐洞察,决定专注于研发和生产高品质的电子元器件。通过不断的研发和创新,德尔创成功推出了其首款具有竞争力的产品,并在市场上获得了初步认可。

Delphi Connection Systems公司的发展小趣事

随着全球对环保意识的不断提高,Delphi Connection Systems公司也积极响应环保号召,致力于研发和生产环保型连接器产品。公司采用环保材料和工艺,减少生产过程中的污染排放,同时推出可回收、可再利用的连接器产品。这一举措不仅符合了环保要求,也为客户提供了更加环保的解决方案。

EMC [ELAN Microelectronics Corp]公司的发展小趣事

为了进一步扩大市场份额,义隆电子积极实施国际化战略。公司在台湾新竹科学园区设立了全球营运总部,并在亚、美等二大洲建立了密集的行销暨技术中心。通过不断拓展国际市场,义隆电子的产品已经销售到全球各地,赢得了广泛的客户认可和信赖。同时,公司还积极寻求与国际知名企业的合作机会,共同推动行业技术的发展和创新。

睿赫(crechip)公司的发展小趣事

随着技术的不断突破和市场需求的日益增长,睿赫公司的芯片产品逐渐得到了广泛的应用。尤其是在智能手机、物联网和智能家居等领域,睿赫芯片凭借其高性能和低功耗的特性,赢得了众多知名企业的青睐。

与此同时,睿赫公司还积极拓展海外市场,与国际知名企业展开合作,共同推动电子行业的发展。通过不断的技术创新和市场拓展,睿赫公司逐渐在电子行业中树立了自己的品牌形象。

C&K公司的发展小趣事

近年来,C&K在保持开关业务稳定发展的同时,还积极寻求新的增长点。为此,公司宣布成立了一个新的部门——C&K航空航天部。这个新部门旨在将公司在开关领域的专业技术与航空航天领域的需求相结合,为客户提供更先进、更可靠的系统解决方案。这一举措不仅展示了C&K在技术创新方面的实力,也为其未来的发展打开了新的大门。

这五个故事从不同角度展现了C&K公司在电子行业中的发展历程和成就。从磁芯记忆到微型开关的转型、成为世界领先的开关制造商、被ITT Industries收购与保持独立品牌、通过收购扩大全球业务与制造能力以及成立航空航天部拓展新领域,每一个阶段都充满了挑战与机遇。正是凭借着对技术创新的执着追求和对市场需求的敏锐洞察,C&K得以在激烈的竞争中脱颖而出,成为电子行业中的佼佼者。

CAO Group Inc公司的发展小趣事

CAO Group, Inc.的创始人Densen Cao博士,以其对电子行业的深厚理解和对创新的执着追求,于2000年创立了这家公司。他带领团队,凭借第一台LED固化灯的发明,成功打破了当时市场的技术壁垒,为公司的初期发展奠定了坚实的基础。这款LED固化灯凭借其高效、稳定、环保的特性,迅速获得了市场的认可,为公司的后续发展注入了强大的动力。

问答坊 | AI 解惑

电子设计

很好的知识。…

查看全部问答>

传感器原理与应用视频教程

传感器原理与应用视频教程 需要的请帮我顶啊! http://taoyu001.qupan.com/1889790.html    第1章 绪论.rar http://taoyu001.qupan.com/1890546.html    第2章 传感器的一般特性.rar        &nbs ...…

查看全部问答>

TMOS 功率场效应晶体管原理及应用

书名:TMOS功率场效应晶体管原理及应用 作者:沈耀忠等编 出版社:电子工业出版社 出版时间:1995.11 页数:284页…

查看全部问答>

有个异常处理没找到,请大家帮忙看下

有个异常处理没找到,请大家帮忙看下要求:求二维数组中各行或各列的和。当输入字符R或r时调用函数求各行的和,当输入字符C或c时,调用函数求各列的和;所求和数按一一对应的方式放在一个一维数组中。说明:1.    建立一个二维数组 ...…

查看全部问答>

2440 LCD问题

LCD型号为LTV250QV-F05,采用IO口模拟SPI总线,通过串口打印可以看到系统一定起来,但屏是白屏,硬件没有问题,用原程序可以起来看到桌面,怀疑是SPI初始话代码有错,那位用过这款屏,给个SPI初始化的代码…

查看全部问答>

《武》一书中,在DeviceIOCtl处理读DWORD,STRING,BOOLEAN类型时,为什么最后I.Information()都是sizeof(ULONG

我是新手,感觉I.Information()返回的是有效数据的长度,但为什么无论读哪种类型的数据都返回的是sizeof(ULONG)?是不是书中错误,还是我理解?望高手指教。…

查看全部问答>

PCI芯片的接口板及相关驱动诡异问题(请教)

我们开发了一块pci9052芯片的PCI接口板,出现怪异问题,请帮忙分析下! 基于PDC1000开发的接口板(使用PCI9052)。    数据采集有两部分,第一部分较少数据读写;第二部分大量数据频繁读写(80ms定时器,每80ms有2048次*3*12位/次, ...…

查看全部问答>

LED 调光技术提高了视频播放画面质量

电气设计人员面临的挑战是了解使用 LED 驱动器控制 LED 电流的最佳方法。   大多数高端 LED 驱动器都为设计人员提供了多种控制其系统中 LED 电流的方法。   这些驱动器拥有一些帮助调低 LED 亮度的特性.   尽管这些特性均提供 ...…

查看全部问答>

谁能告诉我一个FPGA的芯片 EPCS4的有关研究啊

本帖最后由 paulhyde 于 2014-9-15 04:22 编辑 他的主动配置方式到底怎样实现呢  …

查看全部问答>