当前位置:首页 > 单片机 > 单片机
[导读] 一、介绍Nand flash K9GAG08U0D (2G Byte)在u-boot的shell里面执行如下命令: 把 rootfs.yaffs从SD卡的第一个分区读取出来,并写到nand flash中去.SMDK6401>fatload mmc 0:1 50008000 rootfs.yaffsSMDK64

一、介绍
Nand flash K9GAG08U0D (2G Byte)
在u-boot的shell里面执行如下命令: 把 rootfs.yaffs从SD卡的第一个分区读取出来,并写到nand flash中去.
SMDK6401>fatload mmc 0:1 50008000 rootfs.yaffs
SMDK6401>nand erase 600000 $(filesize)
SMDK6401>nand write.yaffs2 50008000 600000 $(filesize)
这儿分析一下最后一条命令:将数据写入到yaffs2分区的过程


二、 过程分析
1.1 u-boot/common/cmd_nand.c中

  1. intdo_nand(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[])

  2. {

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

  4. addr=(ulong)simple_strtoul(argv[2],NULL,16);

  5. read=strncmp(cmd,"read",4)==0;/*1=read,0=write*/


  6. if(arg_off_size(argc-3,argv+3,nand,&off,&size)!=0)

  7. return 1;


  8. s=strchr(cmd,'.');

  9. if(!read&&s!=NULL&&+(!strcmp(s,".yaffs2")||!strcmp(s,".yaffs1")))

  10. {

  11. nand_write_options_t opts;

  12. memset(&opts,0,sizeof(opts));

  13. opts.buffer=(u_char*)addr;//addr=0x50008000内存

  14. opts.length=size;// length是文件长度

  15. opts.offset=off;// offset 是要写到nand flash的地址0x600000

  16. opts.pad=0;

  17. opts.blockalign=1;

  18. opts.quiet=quiet;

  19. opts.writeoob=1;

  20. opts.autoplace=1;

  21. ret=nand_write_opts(nand,&opts);

  22. }

  23. }

argv[0] argv[1] argv[2] argv[3] argv[4]
nand write.yaffs2 50008000 600000 $(filesize)
addr off size=0x420000

1.2 在文件driver/nand/nand_utils.c中

  1. intnand_write_opts(nand_info_t*meminfo,constnand_write_options_t*opts)

  2. {

  3. ulong mtdoffset=opts->offset;//mtdoffset=nand_flash中的偏移0x600000

  4. ulong erasesize_blockalign;

  5. u_char*buffer=opts->buffer;//buffer=(u_char*)0x500080

  6. imglen=opts->length;//imglen是rootfs.yaffs2这个文件的长度

  7. while(imglen&&(mtdoffsetsize)){


  8. //下面这个 while判断要写入的块是不是坏块,如果是坏块继续查找直到找到一个好块

  9. while(blockstart!=(mtdoffset&(~erasesize_blockalign+1))){

  10. blockstart=mtdoffset&(~erasesize_blockalign+1);

  11. offs=blockstart;

  12. baderaseblock=0;


  13. do{

  14. intret=meminfo->block_isbad(meminfo,offs);//判断是不是块坏


  15. if(ret<0){

  16. printf("Bad block check failedn");

  17. goto restoreoob;

  18. }

  19. if(ret==1){//ret=1是坏块

  20. baderaseblock=1;//这个地方还要设个标志,直接do_something不就得了?

  21. if(!opts->quiet)

  22. printf("rBad block at 0x%lx "

  23. "in erase block from "

  24. "0x%x will be skippedn",

  25. (long)offs,

  26. blockstart);

  27. }


  28. if(baderaseblock){

  29. mtdoffset=blockstart+erasesize_blockalign;//如果ret=1是坏块,要写入的起始位置指向下一个块

  30. }

  31. offs+= erasesize_blockalign

  32. /opts->blockalign;

  33. }while(offs

  34. }


  35. readlen=meminfo->writesize;

  36. memcpy(data_buf,buffer,readlen); //初始时:buffer=(u_char*)0x50008000

  37. buffer+=readlen;//meminfo->writesize= 4096


  38. if (opts->writeoob) {

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭