成功要素---耐得住孤独!
c、php、linux、互联网
2013-03-01 13:11:35| 分类: 程序 | 标签: |举报 |字号大中小 订阅
用微信 “扫一扫”
将文章分享到朋友圈。
用易信 “扫一扫”
1、命令相关的函数和定义@main_loop:这个函数里有太多编译选项,对于smdk2410,去掉所有选项后等效下面的程序
复制内容到剪贴板
代码:
void main_loop(){static char lastcommand[CFG_CBSIZE] = { 0, };int len;int rc = 1;int flag;char *s;int bootdelay;s = getenv ("bootdelay"); //自动启动内核等待延时bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;debug ("### main_loop entered: bootdelay=%d\n\n", bootdelay);s = getenv ("bootcmd"); //取得环境中设置的启动命令行debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "");if (bootdelay >= 0 && s && !abortboot (bootdelay)){ run_command (s, 0); //执行启动命令行,smdk2410.h中没有定义CONFIG_BOOTCOMMAND,所以没有命令执行。}for (;;){ len = readline(CFG_PROMPT);//读取键入的命令行到console_buffer flag = 0; /* assume no special flags for now */ if (len > 0) strcpy (lastcommand, console_buffer);//拷贝命令行到lastcommand. else if (len == 0) flag |= CMD_FLAG_REPEAT; if (len == -1) puts ("\n"); else rc = run_command (lastcommand, flag); //执行这个命令行。 if (rc <= 0) { /* invalid command or not repeatable, forget it */ lastcommand[0] = 0; }}
@run_comman(); 在命令table中查找匹配的命令名称,得到对应命令结构体变量指针,以解析得到的参数调用其处理函数执行命令@命令结构构体类型定义:command.h中,
struct cmd_tbl_s{char *name; /* 命令名 */int maxargs; /* 最大参数个数maximum number of arguments */int repeatable; /* autorepeat allowed? */ /* Implementation function 命令执行函数*/int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);char *usage; /* Usage message (short) */#ifdef CFG_LONGHELP char *help; /* Help message (long) */#endif#ifdef CONFIG_AUTO_COMPLETE /* do auto completion on the arguments */ int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);#endif};typedef struct cmd_tbl_s cmd_tbl_t;//定义section属性的结构体。编译的时候会单独生成一个名为.u_boot_cmd的section段。#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))//这个宏定义一个命令结构体变量。并用name,maxargs,rep,cmd,usage,help初始化各个域。#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}
2、在u-boot中,如何添加一个命令: 1)CFG_CMD_* 命令选项位标志。在include/cmd_confdefs.h 中定义。 每个板子的配置文件(如include/config/smdk2410.h)中都可以定义u-boot 需要的命令,如果要添加一个命令,必须添加相应的命令选项。如下:
#define CONFIG_COMMANDS \(CONFIG_CMD_DFL | \CFG_CMD_CACHE | \/*CFG_CMD_NAND |*/ \/*CFG_CMD_EEPROM |*/ \/*CFG_CMD_I2C |*/ \/*CFG_CMD_USB |*/ \CFG_CMD_REGINFO | \CFG_CMD_DATE | \CFG_CMD_ELF)
定义这个选项主要是为了编译命令需要的源文件,大部分命令都在common文件夹下对应一个源文件 cmd_*.c ,如cmd_cache.c实现cache命令。文件开头就有一行编译条件: #if(CONFIG_COMMANDS&CFG_CMD_CACHE) 也就是说,如果配置头文件中CONFIG_COMMANDS不或上相应命令的选项,这里就不会被编译。2)定义命令结构体变量,如:
U_BOOT_CMD(dcache, 2, 1, do_dcache,"dcache - enable or disable data cache\n","[on, off]\n"" - enable or disable data (writethrough) cache\n");
其实就是定义了一个cmd_tbl_t类型的结构体变量,这个结构体变量名为__u_boot_cmd_dcache。 其中变量的五个域初始化为括号的内容。分别指明了命令名,参数个数,重复数,执行命令的函数,命令提示。 每个命令都对应这样一个变量,同时这个结构体变量的section属性为.u_boot_cmd.也就是说每个变量编译结束 在目标文件中都会有一个.u_boot_cmd的section.一个section是连接时的一个输入段, 如.text,.bss,.data等都是section名。 最后由链接程序把所有的.u_boot_cmd段连接在一起,这样就组成了一个命令结构体数组。 u-boot.lds中相应脚本如下:
. = .;__u_boot_cmd_start = .;.u_boot_cmd : { *(.u_boot_cmd) }__u_boot_cmd_end = .;
可以看到所有的命令结构体变量集中在__u_boot_cmd_start开始到__u_boot_cmd_end结束的连续地址范围内, 这样形成一个cmd_tbl_t类型的数组,run_command函数就是在这个数组中查找命令的。 3)实现命令处理函数。命令处理函数的格式: void function (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 总体来说,如果要实现自己的命令,应该在include/com_confdefs.h中定义一个命令选项标志位。 在板子的配置文件中添加命令自己的选项。按照u-boot的风格,可以在common/下面添加自己的cmd_*.c,并且定义自己的命令结构体变量,如
U_BOOT_CMD( mycommand, 2, 1, do_mycommand, "my command!\n", "...\n" " ..\n" );
然后实现自己的命令处理函数
do_mycommand(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
四、U-boot在ST2410的移植,基于NOR FLASH和NAND FLASH启动
1、从smdk2410到ST2410: ST2410板子的核心板与FS2410是一样的。我没有整到smdk2410的原理图,从网上得知的结论总结如下,fs2410与smdk2410 RAM地址空间大小一致(0x30000000~0x34000000=64MB);NOR FLASH型号不一样,FS2410用SST39VF1601系列的,smdk2410用AMD产LV系列的;网络芯片型号和在内存中映射的地址完全一致(CS8900,IO方式基地址0x19000300) 2、移植过程: 移植u-boot的基本步骤如下 (1) 在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。 smdk2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24×0 参考上面2行,添加下面2行。 fs2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t fs2410 NULL s3c24×0 (2) 创建一个新目录存放开发板相关的代码,并且添加文件。 board/fs2410/config.mk board/fs2410/flash.c board/fs2410/fs2410.c board/fs2410/Makefile board/fs2410/memsetup.S board/fs2410/u-boot.lds 注意将board/fs2410/Makefile中smdk2410.o全部改为fs2410.o (3) 为开发板添加新的配置文件 可以先复制参考开发板的配置文件,再修改。例如: $cp include/configs/smdk2410.h include/configs/fs2410.h 如果是为一颗新的CPU移植,还要创建一个新的目录存放CPU相关的代码。 (4) 配置开发板 $ make fs2410_config 3、移植要考虑的问题: 从smdk2410到ST2410移植要考虑的主要问题就是NOR flash。从上述分析知道,u-boot启动时要执行flash_init() 检测flash的ID号,大小,secotor起始地址表和保护状态表,这些信息全部保存在flash_info_t flash_info[CFG_MAX_FLASH_BANKS]中。 另外,u-boot中有一些命令如saveenvt需要要擦写flash,间接调用两个函数:flash_erase和write_buff。在board/smdk2410/flash.c实现了与smdk2410板子相关的nor flash函数操作。由于write_buffer中调用了write_hword去具体写入一个字到flash中,这个函数本身是与硬件无关的,所以与硬件密切相关的三个需要重写的函数是flash_init, flash_erase,write_hword; 4、SST39VF1601: FS2410板nor flash型号是SST39VF1601,根据data sheet,其主要特性如下: 16bit字为访问单位。2MBTYE大小。 sector大小2kword=4KB,block大小32Kword=64KB;这里我按block为单位管理flash,即flash_info结构体变量中的sector_count是block数,起始地址表保存也是所有block的起始地址。 SST Manufacturer ID = 00BFH ; SST39VF1601 Device ID = 234BH; 软件命令序列如下图。
1、命令相关的函数和定义
推荐过这篇日志的人:
他们还推荐了:
网易公司版权所有 ©1997-2018
评论