6.3.4U-Boot与内核的关系

U-Boot作为Bootloader,具备多种引导内核启动的方式。常用的go和bootm命令可以直接引导内核映像启动。U-Boot与内核的关系主要是内核启动过程中参数的传递。

1.go命令的实现

/* common/cmd_boot.c  */

int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

{

ulong addr, rc;

int     rcode = 0;

if (argc < 2) {

printf ("Usage:\n%s\n", cmdtp->usage);

return 1;

}

addr = simple_strtoul(argv[1], NULL, 16);

printf ("## Starting application at 0x%08lX ...\n", addr);

/*

* pass address parameter as argv[0] (aka command name),

* and all remaining args

*/

rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);

if (rc != 0) rcode = 1;

printf ("## Application terminated, rc = 0x%lX\n", rc);

return rcode;

}

go命令调用do_go()函数,跳转到某个地址执行的。如果在这个地址准备好了自引导的内核映像,就可以启动了。尽管go命令可以带变参,实际使用时一般不用来传递参数。

2.bootm命令的实现

/* common/cmd_bootm.c */

int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

{

ulong iflag;

ulong addr;

ulong data, len, checksum;

ulong  *len_ptr;

uint  unc_len = 0x400000;

int   i, verify;

char  *name, *s;

int   (*appl)(int, char *[]);

image_header_t *hdr = &header;

s = getenv ("verify");

verify = (s && (*s == 'n')) ? 0 : 1;

if (argc < 2) {

addr = load_addr;

} else {

addr = simple_strtoul(argv[1], NULL, 16);

}

SHOW_BOOT_PROGRESS (1);

printf ("## Booting image at %08lx ...\n", addr);

/* Copy header so we can blank CRC field for re-calculation */

memmove (&header, (char *)addr, sizeof(image_header_t));

if (ntohl(hdr->ih_magic) != IH_MAGIC)

{

puts ("Bad Magic Number\n");

SHOW_BOOT_PROGRESS (-1);

return 1;

}

SHOW_BOOT_PROGRESS (2);

data = (ulong)&header;

len  = sizeof(image_header_t);

checksum = ntohl(hdr->ih_hcrc);

hdr->ih_hcrc = 0;

if(crc32 (0, (char *)data, len) != checksum) {

puts ("Bad Header Checksum\n");

SHOW_BOOT_PROGRESS (-2);

return 1;

}

SHOW_BOOT_PROGRESS (3);

/* for multi-file images we need the data part, too */

print_image_hdr ((image_header_t *)addr);

data = addr + sizeof(image_header_t);

len  = ntohl(hdr->ih_size);

if(verify) {

puts ("   Verifying Checksum ... ");

if(crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) {

printf ("Bad Data CRC\n");

SHOW_BOOT_PROGRESS (-3);

return 1;

}

puts ("OK\n");

}

SHOW_BOOT_PROGRESS (4);

len_ptr = (ulong *)data;

……

switch (hdr->ih_os) {

default:                /* handled by (original) Linux case */

case IH_OS_LINUX:

do_bootm_linux  (cmdtp, flag, argc, argv,

addr, len_ptr, verify);

break;

……

}

bootm命令调用do_bootm函数。这个函数专门用来引导各种操作系统映像,可以支持引导Linux、vxWorks、QNX等操作系统。引导Linux的时候,调用do_bootm_linux()函数。

3.do_bootm_linux函数的实现

/* lib_arm/armlinux.c */

void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],

ulong addr, ulong *len_ptr, int verify)

{

DECLARE_GLOBAL_DATA_PTR;

ulong len = 0, checksum;

ulong initrd_start, initrd_end;

ulong data;

void (*theKernel)(int zero, int arch, uint params);

image_header_t *hdr = &header;

bd_t *bd = gd->bd;

#ifdef CONFIG_CMDLINE_TAG

char *commandline = getenv ("bootargs");

#endif

theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);

/* Check if there is an initrd image */

if(argc >= 3) {

SHOW_BOOT_PROGRESS (9);

addr = simple_strtoul (argv[2], NULL, 16);

printf ("## Loading Ramdisk Image at %08lx ...\n", addr);

/* Copy header so we can blank CRC field for re-calculation */

memcpy (&header, (char *) addr, sizeof (image_header_t));

if (ntohl (hdr->ih_magic) != IH_MAGIC) {

printf ("Bad Magic Number\n");

SHOW_BOOT_PROGRESS (-10);

do_reset (cmdtp, flag, argc, argv);

}

data = (ulong) & header;

len = sizeof (image_header_t);

checksum = ntohl (hdr->ih_hcrc);

hdr->ih_hcrc = 0;

if(crc32 (0, (char *) data, len) != checksum) {

printf ("Bad Header Checksum\n");

SHOW_BOOT_PROGRESS (-11);

do_reset (cmdtp, flag, argc, argv);

}

SHOW_BOOT_PROGRESS (10);

print_image_hdr (hdr);

data = addr + sizeof (image_header_t);

len = ntohl (hdr->ih_size);

if(verify) {

ulong csum = 0;

printf ("   Verifying Checksum ... ");

csum = crc32 (0, (char *) data, len);

if (csum != ntohl (hdr->ih_dcrc)) {

printf ("Bad Data CRC\n");

SHOW_BOOT_PROGRESS (-12);

do_reset (cmdtp, flag, argc, argv);

}

printf ("OK\n");

}

SHOW_BOOT_PROGRESS (11);

if ((hdr->ih_os != IH_OS_LINUX) ||

(hdr->ih_arch != IH_CPU_ARM) ||

(hdr->ih_type != IH_TYPE_RAMDISK)) {

printf ("No Linux ARM Ramdisk Image\n");

SHOW_BOOT_PROGRESS (-13);

do_reset (cmdtp, flag, argc, argv);

}

/* Now check if we have a multifile image */

} else if ((hdr->ih_type == IH_TYPE_MULTI) && (len_ptr[1])) {

ulong tail = ntohl (len_ptr[0]) % 4;

int i;

SHOW_BOOT_PROGRESS (13);

/* skip kernel length and terminator */

data = (ulong) (&len_ptr[2]);

/* skip any additional image length fields */

for (i = 1; len_ptr[i]; ++i)

data += 4;

/* add kernel length, and align */

data += ntohl (len_ptr[0]);

if (tail) {

data += 4 - tail;

}

len = ntohl (len_ptr[1]);

} else {

/* no initrd image */

SHOW_BOOT_PROGRESS (14);

len = data = 0;

}

if (data) {

initrd_start = data;

initrd_end = initrd_start + len;

} else {

initrd_start = 0;

initrd_end = 0;

}

SHOW_BOOT_PROGRESS (15);

debug ("## Transferring control to Linux (at address %08lx) ...\n",

(ulong) theKernel);

#if defined (CONFIG_SETUP_MEMORY_TAGS) || \

defined (CONFIG_CMDLINE_TAG) || \

defined (CONFIG_INITRD_TAG) || \

defined (CONFIG_SERIAL_TAG) || \

defined (CONFIG_REVISION_TAG) || \

defined (CONFIG_LCD) || \

defined (CONFIG_VFD)

setup_start_tag (bd);

#ifdef CONFIG_SERIAL_TAG

setup_serial_tag (&params);

#endif

#ifdef CONFIG_REVISION_TAG

setup_revision_tag (&params);

#endif

#ifdef CONFIG_SETUP_MEMORY_TAGS

setup_memory_tags (bd);

#endif

#ifdef CONFIG_CMDLINE_TAG

setup_commandline_tag (bd, commandline);

#endif

#ifdef CONFIG_INITRD_TAG

if (initrd_start && initrd_end)

setup_initrd_tag (bd, initrd_start, initrd_end);

#endif

setup_end_tag (bd);

#endif

/* we assume that the kernel is in place */

printf ("\nStarting kernel ...\n\n");

cleanup_before_linux ();

theKernel (0, bd->bi_arch_number, bd->bi_boot_params);

}

do_bootm_linux()函数是专门引导Linux映像的函数,它还可以处理ramdisk文件系统的映像。这里引导的内核映像和ramdisk映像,必须是U-Boot格式的。U-Boot格式的映像可以通过mkimage工具来转换,其中包含了U-Boot可以识别的符号。

c920摄像头驱动 linux,U-Boot的调试相关推荐

  1. c920摄像头驱动 linux,获取新网络摄像头图像时的OpenCV VideoCapture / V4L2延迟

    对于我正在处理的计算机视觉项目,我需要使用Logitech C920网络摄像头抓取图像 . 我正在使用OpenCV的VideoCapture来做到这一点,但我面临的问题是我在某个时刻拍摄的图像并没有显 ...

  2. c920摄像头驱动 linux,4G模块驱动 - PanGuBoard - 湃兔核i2SOM

    PanGu开发板搭载的Linux系统己经支持USB接口的4G通信模块,支持列表如下: 型号USB VID/PID厂商通讯方式安装方式通讯速度 EC20CFD-512-STD EC20CEHC-128- ...

  3. omap3530 linux串口驱动,LINUX下OMAP3530接MT9P031的摄像头驱动调试 给力的一周

    最近有两个项目都挺着急的,尤其是LINUX下OMAP3530接MT9P031的摄像头驱动弄了很长时间.本来是让新来的兄弟负责驱动开发来着,无奈兄弟没有接触过硬件,也没有linux下视频驱动开发的经验, ...

  4. linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析

    这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...

  5. linux 在线调试摄像头驱动

    在使用嵌入式linux设备做点到点之间的图像传输,比如linux平台采集摄像头数据,然后通过wifi或是蓝牙等设备将图像数据发送到手机端,最后使用手机显示出图像.图像处理和图像传输是在应用层完成,在应 ...

  6. 基于Linux系统mjpg_streamer流媒体移植(摄像头驱动移植)

    一.mjpg-streamer移植 主机环境 :ubuntu 14.04 编译器:arm-none-linux-gnueabi-gcc 开发板:A9 移植系统:Linux3.14 摄像头:USB摄像头 ...

  7. 调试摄像头驱动GC2053和wifi驱动RTL8822cs问题小结

    运行平台:海思Hi3518EV300/ GK7202V300 第一次接触海思平台,花了一个月时间完成系统驱动调试,主要是把linux系统从GK7205换成GK7202,驱动从USBwifi换成SDIO ...

  8. Linux 下摄像头驱动支持情况

    http://eatdrinkmanwoman.spaces.live.com/blog/cns!97719476F5BAEDA4!1336.entry http://weijb0606.blog.1 ...

  9. linux下摄像头驱动分类

    在Windows下,摄像头驱动由厂商开发并提供.但在Linux下,因商业利益有限,只有极少厂商愿意提供摄像头驱动支持.这并不妨碍Linux下摄像头的使用--广大第三方志愿者维护着大大小小的驱动.之前做 ...

最新文章

  1. python实现密码的强度_字符串处理函数(二)python语言实现密码强度校验
  2. Java 判断一个字符串是否为数字类型
  3. Struts1.x系列教程(20):使用EventDispatchAction类处理一个form多个submit
  4. asp.net 利用多表联合查询进行汇总统计
  5. JdbcTemplate的CRUD操作
  6. Java进阶:AtomicReference详解
  7. 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试
  8. self php语法,PHP代码审计之关于PHP_SELF的简单利用
  9. mysql 索引 简书_MySQL 索引
  10. python3+pip安装教程--centos6
  11. linux上传下载覆盖文件的命令
  12. iPad 升级失败后重新恢复出厂设置
  13. 清除input的历史记录
  14. 猴子排序与聪明的猴子排序
  15. 行测判断推理部分之图形推理(位置)
  16. 看完这篇文章APP关键词覆盖增加70000|互联网行业公会
  17. 铁通计算机网络,【计算机网络技术】常见宽带错误代码及处理办法(使用移动宽带【铁通】、部分电信宽带故障、联通宽带故...
  18. php 指纹验证失败,为什么手指沾了水,指纹识别就会失效?液体会导致指纹解锁失败?...
  19. 我在windows10下,使用CMake gui 编译krita源码,CMake gui报错:LibMyPaint_DIR-NOTFOUND
  20. 超全Redis命令总结(备忘)(建议赶紧收藏)

热门文章

  1. bzoj 4521 [ Cqoi 2016 ] 手机号码 —— 数位DP
  2. 最新价值2500元 网易web白帽子黑客培训视频
  3. OA服务器文件夹,OA服务器架设 图文详解.docx
  4. c语言怎么取字母的前一个和后一个,输入一个大写字母,输出字母表中他前面和后面的字母用C语言...
  5. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数
  6. KB5013942更新失败
  7. 12个不为大家熟知的HTML5设计小技巧
  8. C/C++--球球大作战项目(简单版)
  9. realsense ——SR300 相机使用小记
  10. Android系统级保活方案