U-BOOT的mainloop函数

上传人:平*** 文档编号:13409834 上传时间:2017-10-24 格式:DOCX 页数:7 大小:19.05KB
返回 下载 相关 举报
U-BOOT的mainloop函数_第1页
第1页 / 共7页
U-BOOT的mainloop函数_第2页
第2页 / 共7页
U-BOOT的mainloop函数_第3页
第3页 / 共7页
U-BOOT的mainloop函数_第4页
第4页 / 共7页
U-BOOT的mainloop函数_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《U-BOOT的mainloop函数》由会员分享,可在线阅读,更多相关《U-BOOT的mainloop函数(7页珍藏版)》请在金锄头文库上搜索。

1、main_loop()函数做的都是与具体平台无关的工作,主要包括初始化启动次数限制机制、设置软件版本号、打印启动信息、解析命令等。(1)设置启动次数有关参数。在进入 main_loop()函数后,首先是根据配置加载已经保留的启动次数,并且根据配置判断是否超过启动次数。代码如下:295 void main_loop (void) 296 297 #ifndef CFG_HUSH_PARSER 298 static char lastcommandCFG_CBSIZE = 0, ; 299 int len; 300 int rc = 1; 301 int flag; 302 #endif 303

2、304 #if defined(CONFIG_BOOTDELAY) & (CONFIG_BOOTDELAY = 0) 305 char *s; 306 int bootdelay; 307 #endif 308 #ifdef CONFIG_PREBOOT 309 char *p; 310 #endif 311 #ifdef CONFIG_BOOTCOUNT_LIMIT 312 unsigned long bootcount = 0; 313 unsigned long bootlimit = 0; 314 char *bcs; 315 char bcs_set16; 316 #endif /*

3、 CONFIG_BOOTCOUNT_LIMIT */ 317 318 #if defined(CONFIG_VFD) & defined(VFD_TEST_LOGO) 319 ulong bmp = 0; /* default bitmap */ 320 extern int trab_vfd (ulong bitmap); 321 322 #ifdef CONFIG_MODEM_SUPPORT 323 if (do_mdm_init) 324 bmp = 1; /* alternate bitmap */ 325 #endif 326 trab_vfd (bmp); 327 #endif /

4、* CONFIG_VFD & VFD_TEST_LOGO */ 328 329 #ifdef CONFIG_BOOTCOUNT_LIMIT 330 bootcount = bootcount_load(); / 加载保存的启动次数 331 bootcount+; / 启动次数加 1 332 bootcount_store (bootcount); / 更新启动次数 333 sprintf (bcs_set, %lu, bootcount); / 打印启动次数 334 setenv (bootcount, bcs_set); 335 bcs = getenv (bootlimit); 336 b

5、ootlimit = bcs ? simple_strtoul (bcs, NULL, 10) : 0; / 转换启动次数字符串为UINT 类型 337 #endif /* CONFIG_BOOTCOUNT_LIMIT */ 第 329337 行是启动次数限制功能,启动次数限制可以被用户设置一个启动次数,然后保存在 Flash 存储器的特定位置,当到达启动次数后,U-Boot无法启动。该功能适合一些商业产品,通过配置不同的 License 限制用户重新启动系统。(2)程序第 339348 行是 Modem 功能。如果系统中有 Modem,打开该功能可以接受其他用户通过电话网络的拨号请求。Mod

6、em 功能通常供一些远程控制的系统使用,代码如下:339 #ifdef CONFIG_MODEM_SUPPORT 340 debug (DEBUG: main_loop: do_mdm_init=%dn, do_mdm_init); 341 if (do_mdm_init) / 判断是否需要初始化 Modem 342 char *str = strdup(getenv(mdm_cmd); / 获取 Modem 参数 343 setenv (preboot, str); /* set or delete definition */ 344 if (str != NULL) 345 free (s

7、tr); 346 mdm_init(); /* wait for modem connection */ / 初始化 Modem 347 348 #endif /* CONFIG_MODEM_SUPPORT */ (3)接下来设置 U-Boot 的版本号,初始化命令自动完成功能等。代码如下:350 #ifdef CONFIG_VERSION_VARIABLE 351 352 extern char version_string; 353 354 setenv (ver, version_string); /* set version variable */ / 设置版本号 355 356 #e

8、ndif /* CONFIG_VERSION_VARIABLE */ 357 358 #ifdef CFG_HUSH_PARSER 359 u_boot_hush_start (); / 初始化 Hash 功能 360 #endif 361 362 #ifdef CONFIG_AUTO_COMPLETE 363 install_auto_complete(); / 初始化命令自动完成功能 364 #endif 365 366 #ifdef CONFIG_PREBOOT 367 if (p = getenv (preboot) != NULL) 368 # ifdef CONFIG_AUTOBO

9、OT_KEYED 369 int prev = disable_ctrlc(1); /* disable Control C checking */ / 关闭 Crtl+C 组合键 370 # endif 371 372 # ifndef CFG_HUSH_PARSER 373 run_command (p, 0); / 运行 Boot 参数 374 # else 375 parse_string_outer(p, FLAG_PARSE_SEMICOLON | 376 FLAG_EXIT_FROM_LOOP); 377 # endif 378 379 # ifdef CONFIG_AUTOBO

10、OT_KEYED 380 disable_ctrlc(prev); /* restore Control C checking */ / 恢复 Ctrl+C 组合键 381 # endif 382 383 #endif /* CONFIG_PREBOOT */ 程序第 350 356 行是动态版本号功能支持代码,version_string 变量是在其他文件定义的一个字符串变量,当用户改变 U-Boot 版本的时候会更新该变量。打开动态版本支持功能后,U-Boot 在启动的时候会显示最新的版本号。程序第 363 行设置命令行自动完成功能,该功能与 Linux 的 shell 类似,当用户输入一

11、部分命令后,可以通过按下键盘上的 Tab 键补全命令的剩余部分。main_loop()函数不同的功能使用宏开关控制不仅能提高代码模块化,更主要的是针对嵌入式系统 Flash 存储器大小设计的。在嵌入式系统上,不同的系统Flash 存储空间不同。对于一些 Flash 空间比较紧张的设备来说,通过宏开关关闭一些不是特别必要的功能如命令行自动完成,可以减小 U-Boot 编译后的文件大小。(4)在进入主循环之前,如果配置了启动延迟功能,需要等待用户从串口或者网络接口输入。如果用户按下任意键打断,启动流程,会向终端打印出一个启动菜单。代码如下:385 #if defined(CONFIG_BOOTDE

12、LAY) & (CONFIG_BOOTDELAY = 0) 386 s = getenv (bootdelay); 387 bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY; / 启动延迟 388 389 debug (# main_loop entered: bootdelay=%dnn, bootdelay); 390 391 # ifdef CONFIG_BOOT_RETRY_TIME 392 init_cmd_timeout (); / 初始化命令行超时机制 393 # endif /* CONFIG_

13、BOOT_RETRY_TIME */ 394 395 #ifdef CONFIG_BOOTCOUNT_LIMIT 396 if (bootlimit & (bootcount bootlimit) / 检查是否超出启动次数限制 397 printf (Warning: Bootlimit (%u) exceeded. Using altbootcmd.n, 398 (unsigned)bootlimit); 399 s = getenv (altbootcmd); 400 401 else 402 #endif /* CONFIG_BOOTCOUNT_LIMIT */ 403 s = gete

14、nv (bootcmd); / 获取启动命令参数 404 405 debug (# main_loop: bootcmd=%sn, s ? s : );406 407 if (bootdelay = 0 & s & !abortboot (bootdelay) /检查是否支持启动延迟功能 408 # ifdef CONFIG_AUTOBOOT_KEYED 409 int prev = disable_ctrlc(1); /* disable Control C checking */ / 关闭 Ctrl+C 组合键 410 # endif 411 412 # ifndef CFG_HUSH_PARSER 413 run_command (s, 0); / 运行启动命令行 414 # else 415 parse_string_outer(s, FLAG_PARSE_SEMICOLON | 416 FLAG_EXIT_FROM_LOOP); 417 # endif 418 419 # ifdef CONFIG_AUTOBOOT_KEYED 420 disable_ctrlc(pre

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号