• uboot中的快捷菜单的制作说明 【转】


     
    在uboot中加入快捷操作菜单的方法非常简单,在论坛发布的uboot201003V1.1的源码包里已经包含了菜单的源码
    http://www.xcembed.com/bbs/viewthread.php?tid=19&page=1&extra=#pid32
    这个菜单其实就是一个uboot中的命令,uboot启动时,如果进入下载模式,就先运行这个命令。命令的执行内容就是通过串口打印出一个菜单,等待输入数字,再执行相应的动作。

    新建一个名为:cmd_menu.c的文件,放到common目录下,修改同目录下的Makefile文件,加入编译选项:
    COBJS-$(CONFIG_CMD_MENU) += cmd_menu.o

    编写cmd_menu.c的内容:
    定义一个uboot cmd:
    1. U_BOOT_CMD(
    2.     menu, 3, 0, do_menu,
    3.     "menu - display a menu, to select the items to do something ",
    4.     " - display a menu, to select the items to do something"
    5. );

    cmd的名为 menu     执行的动作是do_menu函数

    实现do_menu

    1. int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
    2. {
    3.     menu_shell();
    4.     return 0;
    5. }

    这里调用menu_shell函数

    1. void menu_shell(void)
    2. {
    3.     char cmd_buf[200];
    4.     while (1)
    5.     {
    6.           main_menu_usage(); //打印菜单
    7.           c = awaitkey(-1, NULL);
    8.           printf("%c ", c);
    9.           switch (c)
    10.           {
    11.                 case '1': //输入‘1’执行的动作
    12.                 {
    13.                     .....
    14.                     break;
    15.                 }
    16.                 case '2': //输入‘2’执行的动作
    17.                 {
    18.                     ..... 
    19.                     break;
    20.                 }
    21.                 case '3': //输入‘3’执行的动作
    22.                 {
    23.                     .....
    24.                     break;
    25.                 }
    26.                 .....
    27.                 ....
    28.           } 
    29.     }
    30. }

    menu_shell就是一个while循环,调用main_menu_usage打印菜单,然后awaitkey,再switch输入的键值,
    执行相应的case

    我的main_menu_usage如下:

    1. void main_menu_usage(void)
    2. {
    3.     printf("[1] 烧写bootloader到nandflash ");
    4.     printf("[2] 烧写Linux Kernel到nandflash ");
    5.     printf("[3] 烧写yaffs2文件系统到nandflash ");
    6.     printf("[4] 下载程序在SDRAM中运行 ");
    7.     printf("[5] 设置uboot参数 ");
    8.     printf("[6] 格式化Nandflash ");
    9.     printf("[7] 启动Linux系统 ");
    10.     printf("[8] 进入Shell模式 ");
    11.     printf("[9] 重启uboot ");
    12.     if (bBootFrmNORFlash == 1)
    13.         printf("[0] 下载bootloader到NorFlash ");
    14.     printf("Enter your selection: ");
    15. }

    以烧写uboot到nandflash为例,case 1:中的内容为:

    1. strcpy(cmd_buf, "usbslave 1 0x30000000; nand erase bios; nand write.jffs2 0x30000000 bios 0x100000");
    2. run_command(cmd_buf, 0);
    3. break;

    按照这个依次写每个case

    main.c中调用menu命令:
    main_loop函数中在abortboot (bootdelay) 结束后加入:

    1. #ifdef CONFIG_CMD_MENU
    2.     run_command("menu", 0);
    3. #endif

    编译uboot下载到FLASH中就能看到菜单了

  • 相关阅读:
    邮箱正则表达式写法
    java中的的正则表达式
    Java中重载(overload)和重写(override)的区别
    内部类的使用规范
    Java静态代码块(static block)调用陷阱小记
    sychronized关键字的使用
    关于java中一次编译多个源文件时的编译顺序的问题
    java中内部类的访问调用
    map的三种遍历方法
    Java堆.栈和常量池
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/4800852.html
Copyright © 2020-2023  润新知