3503|4

854

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

uboot中加入自定义下载菜单 [复制链接]

1)先在common文件夹中新建Cmd_menu.c
2)在Cmd_menu.c中加入下列代码
#include
#include
void main_menu_usage(void)
{
    printf("[1] 烧写bootloader到nandflash\r\n");
    printf("[2] 烧写Linux Kernel到nandflash\r\n");
    printf("[3] 烧写yaffs2文件系统到nandflash\r\n");
    printf("[4] 下载程序在SDRAM中运行\r\n");
    printf("[5] 设置uboot参数\r\n");
    printf("[6] 格式化Nandflash\r\n");
    printf("[7] 启动Linux系统\r\n");
    printf("[8] 进入Shell模式\r\n");
    printf("[9] 重启uboot\r\n");
//   if (bBootFrmNORFlash == 1)
  //      printf("[0] 下载bootloader到NorFlash\r\n");
    printf("Enter your selection: ");
}

void menu_shell(void)
{
char c;
char cmd_buf[200];
while(1)
{
  main_menu_usage();//打印菜单
  c=getc();
  printf("%c\n",c);
  switch(c)
  {
   case '1':printf("您按中了1\n");break;
   case '2':printf("您按中了2\n");break;
   default:printf("您按中了%n\n",c);break;
  }
}
}

int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
menu_shell();
return 0;
}
/**************************
U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)

各个参数的意义如下:

name:命令名,非字符串,但在U_BOOT_CMD中用“#”符号转化为字符串

maxargs:命令的最大参数个数

rep:是否自动重复(按Enter键是否会重复执行)

cmd:该命令对应的响应函数

usage:简短的使用说明(字符串)

help:较详细的使用说明(字符串)
******************************/

U_BOOT_CMD(
menu, 3, 0, do_menu,
"menu   - display a menu,to select the items to do something\n",
"-display a menu,to select the items to do somethine"
);

3)、让加入的Cmd_menu.c文件参与编译
在Makefile中加入COBJS-$(CONFIG_CMD_MENU) += cmd_menu.o
4)、在配置文件中加入宏
#define CONFIG_MENUKEY 1//定义配置菜单

#define DEBUG 1 //打开调试信息

#define CONFIG_BOOTCOMMAND "menu" //将上电自启动设置为menu
5)、加入菜单中相对应的命令参数
以烧写uboot到nandflash为例,case 1:中的内容为:
strcpy(cmd_buf, "usbslave 1 0x30000000; nand erase bios; nand write.jffs2 0x30000000 bios 0x100000");
run_command(cmd_buf, 0);
break;

以上五步就可以打印出菜单了。

最新回复

帖子终于有人顶起了。  详情 回复 发表于 2013-11-17 22:08
点赞 关注
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460

回复
举报

854

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
读了读代码和一些相关的资料,u-bootcommon内的cmd_**.c每个代表一个命令,可以把一些常用的命令做用快捷菜单
1、在common目录下新增cmd_menu.c文件,内容为:
#include
#include
static char awaitkey(unsigned long delay, int* error_p)
{
    int i;
    char c;
    if (delay == -1) {
        while (1) {
            if (tstc())
                return getc();
        }
    }
    else {      
        for (i = 0; i < delay; i++) {
      if (tstc())
       return getc();
            udelay (10*1000);
        }
    }
    if (error_p)
        *error_p = -1;
    return 0;
}
void main_menu_usage(void)
{
printf("\r\n*****************luozhiyong*****************\r\n");
    printf("\r------- Hotips TFTP DownLoad for SMDK2440 -------\r\n");
   printf("\r\n");
    printf("[1] 下载 u-boot.bin       写入
Nand Flash\r\n");
    printf("[2] 下载 Linux(uImage)    内核镜像写入
Nand Flash\r\n");
    printf("[3] 下载 yaffs2(fs.yaffs) 文件系统镜像写入
Nand Flash\r\n");
    printf("[4] 下载 Linux(uImage)    内核镜像到内存并运行
\r\n");
   printf("[5] 重启设备
\r\n");
    printf("[q] 退出菜单
\r\n");
   printf("\r\n");
    printf("输入选择
: ");
}
void menu_shell(void)
{
    char c;
    char cmd_buf[200];
    while (1)
    {
      main_menu_usage();
      c = awaitkey(-1, NULL);
      printf("%c\n", c);
      switch (c)
      {
  case '1':
  {
          strcpy(cmd_buf, "tftp 0x32000000 u-boot.bin; nand erase 0x0 0x60000; nand write 0x32000000 0x0 0x60000");
          run_command(cmd_buf, 0);
          break;
  }
        case '2':
        {
          strcpy(cmd_buf, "tftp 0x32000000 uImage; nand erase 0x80000 0x200000; nand write 0x32000000 0x80000 0x200000");
          run_command(cmd_buf, 0);
     break;
        }
        case '3':
        {
          strcpy(cmd_buf, "tftp 0x32000000 fs.yaffs; nand erase 0x280000; nand write.yaffs2 0x32000000 0x280000 $(filesize)");
          run_command(cmd_buf, 0);
          break;
        }
  case '4':
        {
          strcpy(cmd_buf, "tftp 0x32000000 uImage; bootm 0x32000000");
          run_command(cmd_buf, 0);
          break;
        }
  case '5':
        {
          strcpy(cmd_buf, "reset");
          run_command(cmd_buf, 0);
          break;
        }
        case 'q':
        {
          return;   
          break;
        }
      }
    }
}
int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    menu_shell();
    return 0;
}
U_BOOT_CMD(
menu, 1, 0, do_menu,
"Download Menu",
"U-boot Download Menu by Hotips\n"
);

2、修改common目录下的Makefile文件,将cmd_menu.o加入编译:
COBJS-y += main.o
COBJS-y += cmd_menu.o
COBJS-y += ACEX1K.o
在终端下输入  menu 就可以看到自己创建的菜单
 
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
 

回复

63

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
mark 学习了
 
 
 

回复

445

帖子

0

TA的资源

纯净的硅(初级)

4
 
看不懂啊,学习了!!
 
 
 

回复

468

帖子

0

TA的资源

纯净的硅(高级)

5
 
帖子终于有人顶起了。
 
个人签名
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表