历史上的今天
返回首页

历史上的今天

今天是:2025年04月15日(星期二)

正在发生

2018年04月15日 | S3C6410使用---10为SD卡与NAND FLASH的uboot加上menu菜单

2018-04-15 来源:eefocus

用ok6410进行烧写时,每次都需要敲一大堆命令,又费时又费力. 记得以前用TQ2440时,u-boot启动时会有一个菜单,只按一个数字键就把内核烧好了,非常方便.
现在这张SD卡功能就很全面了,不仅能够直接从SD卡启动,而且还可以烧写nand flash中的u-boot zImage rootfs,呵呵.
下面就把这个功能加到ok6410的u-boot 中去.
一、修改SD卡的u-boot1.1.6
1. common/main.c中

  1. void main_loop (void)

  2.      .......  

  3.     if (bootdelay >= 0 && s && !abortboot (bootdelay)) {

  4.     }


  5.     //如果在启动过程中有按键,打断了执行过程的话

  6.     run_command("menu",0);   

  7.     

  8.     //如果menu返回的话,就进入u-boot的shell中

  9.     #ifdef CFG_HUSH_PARSER
        parse_file_outer();

  10.     ......   

  11. }

2. 执行menu的过程
run_command("menu", 0),最终会执行do_menu.
do_menu 开始时先打印出命令菜单,然后根据不同的选择,执行不同的命令.
所以添加的文件 common/cmd_menu.c,如下:

  1. #include 

  2. #include 

  3. #include 

  4. #include 


  5. void print_menu_usage(void)

  6. {

  7.     printf("rn##### SD boot Menu    #####rn");

  8.     printf("[1] Download u-boot bootloader to Nand Flashrn");

  9.     printf("[2] Download Linux Kernel to Nand Flashrn");

  10.     printf("[3] Download CRAMFS image to Nand Flashrn");

  11.     printf("[4] Download YAFFS image to Nand Flashrn");

  12.     printf("[5] Boot the systemrn");

  13.     printf("[6] Format the Nand Flashrn");

  14.     printf("[0] Set the boot parametersrn");

  15.     printf("[a] Download User Program (eg: uCOS-II or TQ2440_Test)rn");

  16.     printf("[b] Download LOGO Picture (.bin) to Nand Flash rn");

  17.     printf("[q] quit from menurn");

  18.     printf("Enter your selection: ");

  19. }


  20. int do_menu(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

  21. {

  22.     int c;

  23.     char cmd_buf[200];

  24.     while(1)

  25.     {

  26.         print_menu_usage();

  27.         c = getc();

  28.         printf("%cn", c);

  29.         switch (c)

  30.         {

  31.             case '1':

  32.             {

  33.                 strcpy(cmd_buf, "fatload mmc 0:1 50008000 u-boot.bin_nand; nand erase 0 100000; nand write.uboot 50008000 0 10000");

  34.                 run_command(cmd_buf, 0);

  35.                 break;

  36.             }

  37.             case '2':

  38.             {

  39.                 strcpy(cmd_buf, "fatload mmc 0:1 50008000 zImage_nand; nand erase 100000 500000; nand write.e 50008000 100000 500000");

  40.                 run_command(cmd_buf, 0);

  41.                 break;

  42.             }

  43.             case '3':

  44.             {

  45.                 //strcpy(cmd_buf, "fatload mmc 0:1 50008000 u-boot.bin; nand erase 0 100000; nand write.uboot 50008000 0 10000");

  46.                 //run_command(cmd_buf, 0);

  47.                 break;

  48.             }

  49.             case '4':

  50.             {

  51.                 //strcpy(cmd_buf, "fatload mmc 0:1 50008000 rootfs.yaffs; nand erase 600000 4A4000; nand write.yaffs2 50008000 600000 4A4000");

  52.                 //strcpy(cmd_buf, "fatload mmc 0:1 50008000 rootfs.yaffs; nand erase 600000  $(filesize); nand write.yaffs2 50008000 600000 $(filesize)");            

  53.                 //注意: nand erase 600000  $(filesize),假设有坏块的话,这样会有数据不能写入, 所以这个地方可以固定一个较大值,如

  54.                 // 0x1400000=20M,所以rootfs.yaffs的大小不能超过20M,

  55.                 //考虑此处是不是要加上nand flash分区: nand erase root,把整个的root分区全部擦除,这样就不必担心是否有坏块的问题了

  56.                 strcpy(cmd_buf, "fatload mmc 0:1 50008000 rootfs.yaffs; nand erase 600000  1400000; nand write.yaffs2 50008000 600000 $(filesize)");                          

  57.                 run_command(cmd_buf, 0);

  58.                 break;

  59.             }

  60.             case '5':

  61.             {

  62.                 strcpy(cmd_buf, "bootm 50008000");

  63.                 run_command(cmd_buf, 0);

  64.                 break;

  65.             }

  66.             case 'q':

  67.                 return;

  68.             default:

  69.                 printf("command not found\n");

  70.                 break;

  71.         }

  72.     }

  73. }


  74. U_BOOT_CMD(

  75.         menu,    5,    1,    do_menu,

  76.         "menu - manipulate BMP image datan",

  77.         "menu long help: TNND mu you"

  78.         );

3. 添加到Makefile中
最后在common/Makefile中添加一行

  1. COBJS+= cmd_menu.o

注意: 在组合命令时,如nand write不知道烧写的大小怎么办? 没关系,有变量 $(filesize), 只要加上这个任何问题都不再困难.
上面的50008000是从SD卡启动时,要读到的内存地址; 若是从Nand flash启动要把上面的50008000改为C0008000


二. 测试一下
2.1 sd卡
      a. 因为都是从SD卡和第一个分区读数据,所以将SD卡分区时第一个分区格式必须为FAT32.
      b. 编译u-boot.bin: 
                代码要用光盘中带的u-boot,这个支持从nand flash 启动
                make forlinx_nand_ram256_config, 后生成 u-boot.bin
                复制到SD卡的第一个分区, 并改名为 u-boot.bin_nand(要与u-boot代码中的名称保持一致)
      c. 编译zImage
                代码要用光盘中带的linux-3.0.1, make后生成zImage
                复制到SD卡的第一个分区, 并改名为 zImage_nand(要与u-boot代码中的名称保持一致)
      d. 生成rootfs.yaffs
                可以用光盘中带的FileSystem-Yaffs2.tar.gz, 解压后,嫌太大,把不需要的删掉,
                里面的busybox好像是动态链接的,自己编个静态的busybox,最后生成rootfs.yaffs
                sudo /opt/6410/4.3.2/bin/mkyaffs2image-nand2g FileSystem-Yaffs2 rootfs.yaffs
                nand flash 是2G的所以要用命令 mkyaffs2image-nand2g
               将rootfs.yaffs复制到SD卡的第一个分区(要与u-boot代码中的名称保持一致)
         注意: 如果不确定rootfs本身有没有问题,可以先从nfs启动,看是否正常.
                  如果正常再用mkyaffs2image-nand2g,做成yaffs镜像烧入到nand flash中.


三. NAND Flash 加入menu菜单
  3.1 nand flash 的文件的获取是通过usb的,当然也可以通过tftp(tftp没有试过,不过原理是一样的)

  1. 将strcpy(cmd_buf, "fatload mmc 0:1 50008000 u-boot.bin_nand; nand erase 0 100000; nand write.uboot 50008000 0 10000");

  2. 改为-->:

  3. strcpy(cmd_buf, "dnw c0008000; nand erase 0 100000; nand write.uboot c0008000 0 10000");

  4. 或者-->(这个没有试过)

  5. strcpy(cmd_buf, "tftp c0008000 u-boot.bin; nand erase 0 100000; nand write.uboot c0008000 0 10000");

3.2 解决usb传输的一个小问题,
     以下是打印的log:
    下载的文件大小是 0x420000, nand flash擦除的大小是0x1400000, 但是在nand write.yaffs2时却变成了0x7fa00000,

  1. Enter your selection: 3

  2. OTG cable 

  3. Now, Waiting for DNW to transmit data

  4. Download Download Address: 0xc0008000, Download Filesize:0x420000 

  5. Checksum is being calculated.....calc checksum=0xba1c, read checksum=0xba1c, start:


  6. Checksum O.K.


  7. NAND erase: device 0 offset 0x600000, size 0x1400000

  8. Skipping bad block at 0x00780000 

  9. Erasing at 0x1980000 -- 100% complete.

  10. OK


  11. NAND write: device 0 offset 0x600000, size 0x7fa00000

  12. Input block length is not page aligned

  13. Data did not fit into device, due to bad blocks

  14.  2141192192 bytes written: ERROR


  15. ##### NAND boot Menu #####

这是因为usb传输完成后,却没有把接收到的文件的size,保存下来.
解决方法如下: 
在cpu/s3c64xx/usbd-otg-hs.c中

  1. void s3c_usb_verify_checksum(void)

  2. {

  3.     u8 *cs_start, *cs_end;

  4.     u16 dnCS;

  5.     u16 checkSum;

  6.     int i;

  7.     printf("Checksum is being calculated.");

  8.     char buf[12];

  9.     long size;

  10.     /* checksum calculation */

  11.     cs_start = (u8*)otg.dn_addr;

  12.     cs_end = (u8*)(otg.dn_addr+otg.dn_filesize-10);

  13.     checkSum = 0;

  14.     while(cs_start < cs_end) {

  15.         checkSum += *cs_start++;

  16.         if(((u32)cs_start&0xfffff)==0) printf(".");

  17.     }


  18.     dnCS = *(u16 *)cs_end;

  19.     printf("calc checksum=0x%x, read checksum=0x%x, start:n", checkSum, dnCS);


  20.     if (checkSum == dnCS)

  21.     {

  22.         //加入下面这一段,把接收到的文件的大小记录起来    

  23.        size = otg.dn_filesize-10;

  24.        sprintf(buf, "%lX", size);

  25.        printf("nChecksum O.K. down filesize=%ldn", size);

  26.        setenv("filesize", buf);

  27.     }

  28.     else

  29.     {

  30.         printf("nChecksum Value => MEM:%x DNW:%xn",checkSum,dnCS);

  31.         printf("Checksum failed.nn");

  32.     }


  33. }


推荐阅读

史海拾趣

C&K公司的发展小趣事

C&K公司最初是一家专注于磁芯记忆单元制造的企业。然而,随着电子技术的飞速发展,公司意识到必须紧跟时代的步伐。于是,在60年代,C&K果断重组,将业务重心转向计算机和电子行业的微型开关制造。这次转型不仅使公司成功抓住了市场机遇,还因为专注于客户需求和提供优质服务而迅速获得成功。

Calmos Systems Inc公司的发展小趣事

随着国内市场的饱和,Calmos Systems Inc公司开始将目光投向国际市场。公司制定了详细的国际化战略,包括市场调研、产品定位、销售渠道建设等方面。公司派遣专业团队前往海外市场进行考察和交流,了解当地市场需求和文化特点。同时,公司还积极寻求与国际知名企业的合作机会,共同开拓国际市场。在国际化战略的推动下,公司的业务范围不断扩大,国际市场份额逐年提升。

Dailywell Electronics Co Ltd公司的发展小趣事

随着公司实力的不断增强和业务的不断扩展,德利威电子开始实施全球化战略。2002年,公司成立了珠海富鼎厂,正式将东莞的电子产能进行移转。这一举措不仅进一步提升了公司的生产能力和产品品质,也为其进一步拓展国际市场提供了有力支持。此外,公司还在2003年和2006年分别成立了中国东莞办事处和北京办事处,进一步加强了其在中国市场的布局和服务能力。通过这些举措的实施,德利威电子逐步实现了从单一市场向全球市场的转变。

以上五个故事简要概述了德利威电子股份有限公司在电子行业中的发展历程和关键节点。这些故事不仅展示了公司的成长轨迹和实力提升过程,也反映了其在技术创新、品质管理、国际化布局等方面的努力和成就。

ADDtek公司的发展小趣事

随着业务的不断扩展和市场需求的增加,德利威电子在1998年实现了全系列防水开关的生产,并取得了RS33A开关专利。同年,公司还扩大了经营规模,搬入了自购的厂办大楼,并增加了资本额至一千五百万元。这些举措不仅提升了公司的生产能力和产品品质,也为公司未来的发展奠定了坚实的基础。

富之光(Fujicon)公司的发展小趣事

面对制造业的数字化转型趋势,富致科技也积极拥抱变革。公司投入大量资源建设数字化工厂,引入先进的自动化设备和信息化管理系统,实现生产流程的智能化和精细化。通过数字化转型,富致科技不仅提高了生产效率和产品质量,还降低了运营成本,为企业的可持续发展注入了新的动力。同时,公司还注重培养数字化人才,为企业的未来发展储备了宝贵的人力资源。

ARCOL公司的发展小趣事

品质是ARCOL公司的核心竞争力。公司始终坚持以质量为核心,建立了严格的质量管理体系。从原材料的采购到产品的出厂,每一个环节都经过严格把关,确保产品的质量和性能达到最高标准。同时,ARCOL还注重品牌建设,通过不断提升产品质量和服务水平,树立了良好的企业形象和口碑。

问答坊 | AI 解惑

液晶显示语音报温

液晶显示语音报温系统,带proteus仿真~~希望对你的学习有帮助~~…

查看全部问答>

WinCE创建虚拟串口的问题

正在做设计,想把GPS的NMEA数据从串口中读出来然后再处理一下放进虚拟串口中,再让其他程序读,但是不知创建虚拟串口,在网上找了如何创建虚拟串口的方法,不知道下面的方法对不对,有些问题还希望大虾指点一下。         POR ...…

查看全部问答>

超级终端 向开发板开发板 问题

大家好我新人, WINDOWS里用超级终端 点发送 设了路径想把文件传到开发板上 为什么 错误提示CRC啊 晕, 2410C VIVI 已经烧好,115200,8,1,无,无 对应的是这么设的 但是为什么传不了啊 哪位大侠帮下 多谢~…

查看全部问答>

[DIY]二十四小时的感动(现代版) 自制LED点阵电子时钟

    二楼已经上传全部电路图和PCB板图文件,以及全套C语言源代码,包括工程文件。   十八年前的我,每次路过学校门卫室的时候,总要驻留一刻,瞄一眼墙上那个会发着红光的电子钟,那时,我一直不知道它是怎么做到的... 到现今, ...…

查看全部问答>

求助STM8S-discoveryRST引脚出现的问题

                                 前段买了个STM8S-discovery ,最近烧程序出现问题,STM32出来的RST脚一直是低的,导致程序下不进芯片,诸位有碰到 ...…

查看全部问答>

心电图(ECG)信号链的模拟基础(二)

本帖最后由 dontium 于 2015-1-23 12:44 编辑 ECG 机的基本功能包括 ECG 波形显示(通过 LCD 显示屏或印刷纸媒质显示)、心跳律动指示以及通过按钮控制的简单用户界面。越来越多的 ECG 产品要求具备更多的功能,例如通过便携式媒体存储电子病历、 ...…

查看全部问答>

430 TA 捕获模式下输入端口如何选择

TA寄存器中CCISx这一位决定了输入端,CCIS_0对应CCIxA,CCIS_1对应CCIxB,x是确定选择A中具体的哪个输入口,但这个表达形式在程序中该如何写呢?例如我要选择CCI2A…

查看全部问答>

EEWORLD大学堂----德州仪器CC3000 Wi-Fi连接开发套件入门介绍

德州仪器CC3000 Wi-Fi连接开发套件入门介绍:https://training.eeworld.com.cn/course/405…

查看全部问答>

炼狱传奇-基于尖峰脉冲的按键消抖之战

尖峰脉冲是电路设计中非常重要的一种信号,很多大型设计中模块间的级联握手信号一般都会使用尖峰脉冲,正确的应用尖峰脉冲信号,可以有效的减少系统的逻辑冗余,提高系统稳定性和执行效率。本节中,我们就来学习如何利用尖峰脉冲来实现按键消抖。现 ...…

查看全部问答>

G2553与LCD12864

求一个G2553驱动LCD12864的硬件连线和代码。…

查看全部问答>