{"id":302,"date":"2018-03-13T13:45:19","date_gmt":"2018-03-13T05:45:19","guid":{"rendered":"http:\/\/www.max-shu.com\/blog\/?p=302"},"modified":"2018-03-13T13:45:19","modified_gmt":"2018-03-13T05:45:19","slug":"mini6410%e6%9d%bfuboot%e7%9a%84cmd_bootm-c","status":"publish","type":"post","link":"http:\/\/www.max-shu.com\/blog\/?p=302","title":{"rendered":"mini6410\u677fuboot\u7684Cmd_bootm.c"},"content":{"rendered":"<p>int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])<br \/>\n{<br \/>\nulong\u00a0\u00a0\u00a0\u00a0 iflag;<br \/>\nulong\u00a0\u00a0\u00a0\u00a0 addr;<br \/>\nulong\u00a0\u00a0\u00a0\u00a0 data, len, checksum;<br \/>\nulong\u00a0 *len_ptr = NULL; \/* not to make warning. by scsuh *\/<br \/>\nuint\u00a0\u00a0\u00a0\u00a0 unc_len = CFG_BOOTM_LEN;<br \/>\nint\u00a0\u00a0\u00a0\u00a0 i, verify;<br \/>\nchar\u00a0\u00a0\u00a0\u00a0 *name, *s;<br \/>\nint\u00a0\u00a0\u00a0\u00a0 (*appl)(int, char *[]);<br \/>\nimage_header_t *hdr = &amp;header;<\/p>\n<p>s = getenv (&#8220;verify&#8221;);<br \/>\nverify = (s &amp;&amp; (*s == &#8216;n&#8217;)) ? 0 : 1;<\/p>\n<p>if (argc &lt; 2) {<br \/>\naddr = load_addr;<br \/>\n} else {<br \/>\naddr = simple_strtoul(argv[1], NULL, 16);<br \/>\n}<\/p>\n<p>#ifdef CONFIG_ZIMAGE_BOOT<br \/>\n#define LINUX_ZIMAGE_MAGIC\u00a0\u00a0\u00a0\u00a0 0x016f2818<br \/>\nif (*(ulong *)(addr + 9*4) == LINUX_ZIMAGE_MAGIC) {<br \/>\nprintf(&#8220;Boot with zImage\\n&#8221;);<br \/>\naddr = virt_to_phys(addr);<br \/>\nhdr-&gt;ih_os = IH_OS_LINUX;<br \/>\nhdr-&gt;ih_ep = ntohl(addr);<br \/>\ngoto after_header_check;<br \/>\n}<br \/>\n#endif<\/p>\n<p>SHOW_BOOT_PROGRESS (1);<br \/>\nprintf (&#8220;## Booting image at %08lx &#8230;\\n&#8221;, addr);<\/p>\n<p>\/* Copy header so we can blank CRC field for re-calculation *\/<br \/>\n#ifdef CONFIG_HAS_DATAFLASH<br \/>\nif (addr_dataflash(addr)){<br \/>\nread_dataflash(addr, sizeof(image_header_t), (char *)&amp;header);<br \/>\n} else<br \/>\n#endif<br \/>\nmemmove (&amp;header, (char *)addr, sizeof(image_header_t));<\/p>\n<p>if (ntohl(hdr-&gt;ih_magic) != IH_MAGIC) {<br \/>\n#ifdef __I386__\u00a0\u00a0\u00a0\u00a0 \/* correct image format not implemented yet &#8211; fake it *\/<br \/>\nif (fake_header(hdr, (void*)addr, -1) != NULL) {<br \/>\n\/* to compensate for the addition below *\/<br \/>\naddr -= sizeof(image_header_t);<br \/>\n\/* turnof verify,<br \/>\n* fake_header() does not fake the data crc<br \/>\n*\/<br \/>\nverify = 0;<br \/>\n} else<br \/>\n#endif\u00a0\u00a0\u00a0\u00a0 \/* __I386__ *\/<br \/>\n{<br \/>\n#ifdef CONFIG_IMAGE_BOOT<br \/>\nprintf(&#8220;Boot with Image\\n&#8221;);<br \/>\naddr = virt_to_phys(addr);<br \/>\nhdr-&gt;ih_os = IH_OS_LINUX;<br \/>\nhdr-&gt;ih_ep = ntohl(addr);<br \/>\nhdr-&gt;ih_comp = IH_COMP_NONE;<br \/>\ngoto after_header_check;<br \/>\n#endif<br \/>\nputs (&#8220;Bad Magic Number\\n&#8221;);<br \/>\nSHOW_BOOT_PROGRESS (-1);<br \/>\nreturn 1;<br \/>\n}<br \/>\n}<br \/>\nSHOW_BOOT_PROGRESS (2);<\/p>\n<p>data = (ulong)&amp;header;<br \/>\nlen\u00a0 = sizeof(image_header_t);<\/p>\n<p>checksum = ntohl(hdr-&gt;ih_hcrc);<br \/>\nhdr-&gt;ih_hcrc = 0;<\/p>\n<p>if (crc32 (0, (uchar *)data, len) != checksum) {<br \/>\nputs (&#8220;Bad Header Checksum\\n&#8221;);<br \/>\nSHOW_BOOT_PROGRESS (-2);<br \/>\nreturn 1;<br \/>\n}<br \/>\nSHOW_BOOT_PROGRESS (3);<\/p>\n<p>#ifdef CONFIG_HAS_DATAFLASH<br \/>\nif (addr_dataflash(addr)){<br \/>\nlen\u00a0 = ntohl(hdr-&gt;ih_size) + sizeof(image_header_t);<br \/>\nread_dataflash(addr, len, (char *)CFG_LOAD_ADDR);<br \/>\naddr = CFG_LOAD_ADDR;<br \/>\n}<br \/>\n#endif<\/p>\n<p>\/* for multi-file images we need the data part, too *\/<br \/>\nprint_image_hdr ((image_header_t *)addr);<\/p>\n<p>data = addr + sizeof(image_header_t);<br \/>\nlen\u00a0 = ntohl(hdr-&gt;ih_size);<\/p>\n<p>if (verify) {<br \/>\nputs (&#8221;\u00a0\u00a0 Verifying Checksum &#8230; &#8220;);<br \/>\nif (crc32 (0, (uchar *)data, len) != ntohl(hdr-&gt;ih_dcrc)) {<br \/>\nprintf (&#8220;Bad Data CRC\\n&#8221;);<br \/>\nSHOW_BOOT_PROGRESS (-3);<br \/>\nreturn 1;<br \/>\n}<br \/>\nputs (&#8220;OK\\n&#8221;);<br \/>\n}<br \/>\nSHOW_BOOT_PROGRESS (4);<\/p>\n<p>len_ptr = (ulong *)data;<\/p>\n<p>#if defined(__PPC__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_PPC)<br \/>\n#elif defined(__ARM__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_ARM)<br \/>\n#elif defined(__I386__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_I386)<br \/>\n#elif defined(__mips__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_MIPS)<br \/>\n#elif defined(__nios__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_NIOS)<br \/>\n#elif defined(__M68K__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_M68K)<br \/>\n#elif defined(__microblaze__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_MICROBLAZE)<br \/>\n#elif defined(__nios2__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_NIOS2)<br \/>\n#elif defined(__blackfin__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_BLACKFIN)<br \/>\n#elif defined(__avr32__)<br \/>\nif (hdr-&gt;ih_arch != IH_CPU_AVR32)<br \/>\n#else<br \/>\n# error Unknown CPU type<br \/>\n#endif<br \/>\n{<br \/>\nprintf (&#8220;Unsupported Architecture 0x%x\\n&#8221;, hdr-&gt;ih_arch);<br \/>\nSHOW_BOOT_PROGRESS (-4);<br \/>\nreturn 1;<br \/>\n}<br \/>\nSHOW_BOOT_PROGRESS (5);<\/p>\n<p>switch (hdr-&gt;ih_type) {<br \/>\ncase IH_TYPE_STANDALONE:<br \/>\nname = &#8220;Standalone Application&#8221;;<br \/>\n\/* A second argument overwrites the load address *\/<br \/>\nif (argc &gt; 2) {<br \/>\nhdr-&gt;ih_load = htonl(simple_strtoul(argv[2], NULL, 16));<br \/>\n}<br \/>\nbreak;<br \/>\ncase IH_TYPE_KERNEL:<br \/>\nname = &#8220;Kernel Image&#8221;;<br \/>\nbreak;<br \/>\ncase IH_TYPE_MULTI:<br \/>\nname = &#8220;Multi-File Image&#8221;;<br \/>\nlen\u00a0 = ntohl(len_ptr[0]);<br \/>\n\/* OS kernel is always the first image *\/<br \/>\ndata += 8; \/* kernel_len + terminator *\/<br \/>\nfor (i=1; len_ptr[i]; ++i)<br \/>\ndata += 4;<br \/>\nbreak;<br \/>\ndefault: printf (&#8220;Wrong Image Type for %s command\\n&#8221;, cmdtp-&gt;name);<br \/>\nSHOW_BOOT_PROGRESS (-5);<br \/>\nreturn 1;<br \/>\n}<br \/>\nSHOW_BOOT_PROGRESS (6);<\/p>\n<p>\/*<br \/>\n* We have reached the point of no return: we are going to<br \/>\n* overwrite all exception vector code, so we cannot easily<br \/>\n* recover from any failures any more&#8230;<br \/>\n*\/<\/p>\n<p>iflag = disable_interrupts();<\/p>\n<p>#ifdef CONFIG_AMIGAONEG3SE<br \/>\n\/*<br \/>\n* We&#8217;ve possible left the caches enabled during<br \/>\n* bios emulation, so turn them off again<br \/>\n*\/<br \/>\nicache_disable();<br \/>\ninvalidate_l1_instruction_cache();<br \/>\nflush_data_cache();<br \/>\ndcache_disable();<br \/>\n#endif<\/p>\n<p>switch (hdr-&gt;ih_comp) {<br \/>\ncase IH_COMP_NONE:<br \/>\nif(ntohl(hdr-&gt;ih_load) == addr) {<br \/>\nprintf (&#8221;\u00a0\u00a0 XIP %s &#8230; &#8220;, name);<br \/>\n} else {<br \/>\n#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)<br \/>\nsize_t l = len;<br \/>\nvoid *to = (void *)ntohl(hdr-&gt;ih_load);<br \/>\nvoid *from = (void *)data;<\/p>\n<p>printf (&#8221;\u00a0\u00a0 Loading %s &#8230; &#8220;, name);<\/p>\n<p>while (l &gt; 0) {<br \/>\nsize_t tail = (l &gt; CHUNKSZ) ? CHUNKSZ : l;<br \/>\nWATCHDOG_RESET();<br \/>\nmemmove (to, from, tail);<br \/>\nto += tail;<br \/>\nfrom += tail;<br \/>\nl -= tail;<br \/>\n}<br \/>\n#else\u00a0\u00a0\u00a0\u00a0 \/* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) *\/<br \/>\nmemmove ((void *) ntohl(hdr-&gt;ih_load), (uchar *)data, len);<br \/>\n#endif\u00a0\u00a0\u00a0\u00a0 \/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG *\/<br \/>\n}<br \/>\nbreak;<br \/>\ncase IH_COMP_GZIP:<br \/>\nprintf (&#8221;\u00a0\u00a0 Uncompressing %s &#8230; &#8220;, name);<br \/>\nif (gunzip ((void *)ntohl(hdr-&gt;ih_load), unc_len,<br \/>\n(uchar *)data, &amp;len) != 0) {<br \/>\nputs (&#8220;GUNZIP ERROR &#8211; must RESET board to recover\\n&#8221;);<br \/>\nSHOW_BOOT_PROGRESS (-6);<br \/>\ndo_reset (cmdtp, flag, argc, argv);<br \/>\n}<br \/>\nbreak;<br \/>\n#ifdef CONFIG_BZIP2<br \/>\ncase IH_COMP_BZIP2:<br \/>\nprintf (&#8221;\u00a0\u00a0 Uncompressing %s &#8230; &#8220;, name);<br \/>\n\/*<br \/>\n* If we&#8217;ve got less than 4 MB of malloc() space,<br \/>\n* use slower decompression algorithm which requires<br \/>\n* at most 2300 KB of memory.<br \/>\n*\/<br \/>\ni = BZ2_bzBuffToBuffDecompress ((char*)ntohl(hdr-&gt;ih_load),<br \/>\n&amp;unc_len, (char *)data, len,<br \/>\nCFG_MALLOC_LEN &lt; (4096 * 1024), 0);<br \/>\nif (i != BZ_OK) {<br \/>\nprintf (&#8220;BUNZIP2 ERROR %d &#8211; must RESET board to recover\\n&#8221;, i);<br \/>\nSHOW_BOOT_PROGRESS (-6);<br \/>\nudelay(100000);<br \/>\ndo_reset (cmdtp, flag, argc, argv);<br \/>\n}<br \/>\nbreak;<br \/>\n#endif \/* CONFIG_BZIP2 *\/<br \/>\ndefault:<br \/>\nif (iflag)<br \/>\nenable_interrupts();<br \/>\nprintf (&#8220;Unimplemented compression type %d\\n&#8221;, hdr-&gt;ih_comp);<br \/>\nSHOW_BOOT_PROGRESS (-7);<br \/>\nreturn 1;<br \/>\n}<br \/>\nputs (&#8220;OK\\n&#8221;);<br \/>\nSHOW_BOOT_PROGRESS (7);<\/p>\n<p>switch (hdr-&gt;ih_type) {<br \/>\ncase IH_TYPE_STANDALONE:<br \/>\nif (iflag)<br \/>\nenable_interrupts();<\/p>\n<p>\/* load (and uncompress), but don&#8217;t start if &#8220;autostart&#8221;<br \/>\n* is set to &#8220;no&#8221;<br \/>\n*\/<br \/>\nif (((s = getenv(&#8220;autostart&#8221;)) != NULL) &amp;&amp; (strcmp(s,&#8221;no&#8221;) == 0)) {<br \/>\nchar buf[32];<br \/>\nsprintf(buf, &#8220;%lX&#8221;, len);<br \/>\nsetenv(&#8220;filesize&#8221;, buf);<br \/>\nreturn 0;<br \/>\n}<br \/>\nappl = (int (*)(int, char *[]))ntohl(hdr-&gt;ih_ep);<br \/>\n(*appl)(argc-1, &amp;argv[1]);<br \/>\nreturn 0;<br \/>\ncase IH_TYPE_KERNEL:<br \/>\ncase IH_TYPE_MULTI:<br \/>\n\/* handled below *\/<br \/>\nbreak;<br \/>\ndefault:<br \/>\nif (iflag)<br \/>\nenable_interrupts();<br \/>\nprintf (&#8220;Can&#8217;t boot image type %d\\n&#8221;, hdr-&gt;ih_type);<br \/>\nSHOW_BOOT_PROGRESS (-8);<br \/>\nreturn 1;<br \/>\n}<br \/>\nSHOW_BOOT_PROGRESS (8);<\/p>\n<p>#if defined(CONFIG_ZIMAGE_BOOT) || defined(CONFIG_IMAGE_BOOT)<br \/>\nafter_header_check:<br \/>\n#endif<br \/>\nswitch (hdr-&gt;ih_os) {<br \/>\ndefault:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* handled by (original) Linux case *\/<br \/>\ncase IH_OS_LINUX:<br \/>\n#ifdef CONFIG_SILENT_CONSOLE<br \/>\nfixup_silent_linux();<br \/>\n#endif<br \/>\ndo_bootm_linux\u00a0 (cmdtp, flag, argc, argv, \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/*\u5b9e\u9645\u8c03\u7528do_bootm_linux\u51fd\u6570\uff0c\u5728Armlinux.c\u4e2d\u5b9a\u4e49*\/<br \/>\naddr, len_ptr, verify);<br \/>\nbreak;<br \/>\ncase IH_OS_NETBSD:<br \/>\ndo_bootm_netbsd (cmdtp, flag, argc, argv,<br \/>\naddr, len_ptr, verify);<br \/>\nbreak;<\/p>\n<p>#ifdef CONFIG_LYNXKDI<br \/>\ncase IH_OS_LYNXOS:<br \/>\ndo_bootm_lynxkdi (cmdtp, flag, argc, argv,<br \/>\naddr, len_ptr, verify);<br \/>\nbreak;<br \/>\n#endif<\/p>\n<p>case IH_OS_RTEMS:<br \/>\ndo_bootm_rtems (cmdtp, flag, argc, argv,<br \/>\naddr, len_ptr, verify);<br \/>\nbreak;<\/p>\n<p>#if (CONFIG_COMMANDS &amp; CFG_CMD_ELF)<br \/>\ncase IH_OS_VXWORKS:<br \/>\ndo_bootm_vxworks (cmdtp, flag, argc, argv,<br \/>\naddr, len_ptr, verify);<br \/>\nbreak;<br \/>\ncase IH_OS_QNX:<br \/>\ndo_bootm_qnxelf (cmdtp, flag, argc, argv,<br \/>\naddr, len_ptr, verify);<br \/>\nbreak;<br \/>\n#endif \/* CFG_CMD_ELF *\/<br \/>\n#ifdef CONFIG_ARTOS<br \/>\ncase IH_OS_ARTOS:<br \/>\ndo_bootm_artos\u00a0 (cmdtp, flag, argc, argv,<br \/>\naddr, len_ptr, verify);<br \/>\nbreak;<br \/>\n#endif<br \/>\n}<\/p>\n<p>SHOW_BOOT_PROGRESS (-9);<br \/>\n#ifdef DEBUG<br \/>\nputs (&#8220;\\n## Control returned to monitor &#8211; resetting&#8230;\\n&#8221;);<br \/>\ndo_reset (cmdtp, flag, argc, argv);<br \/>\n#endif<br \/>\nreturn 1;<br \/>\n}<br \/>\n\/*\u547d\u4ee4\u7684\u5b9a\u4e49\uff0c\u5728Command.c\u91cc\u9762find\u547d\u4ee4\u65f6\u4f1a\u627e\u5230\u8be5\u547d\u4ee4*\/<br \/>\nU_BOOT_CMD(<br \/>\nbootm,\u00a0\u00a0\u00a0\u00a0 CFG_MAXARGS,\u00a0\u00a0\u00a0\u00a0 1,\u00a0\u00a0\u00a0\u00a0 do_bootm,<br \/>\n&#8220;bootm\u00a0\u00a0 &#8211; boot application image from memory\\n&#8221;,<br \/>\n&#8220;[addr [arg &#8230;]]\\n\u00a0\u00a0\u00a0 &#8211; boot application image stored in memory\\n&#8221;<br \/>\n&#8220;\\tpassing arguments &#8216;arg &#8230;&#8217;; when booting a Linux kernel,\\n&#8221;<br \/>\n&#8220;\\t&#8217;arg&#8217; can be the address of an initrd image\\n&#8221;<br \/>\n#ifdef CONFIG_OF_FLAT_TREE<br \/>\n&#8220;\\tWhen booting a Linux kernel which requires a flat device-tree\\n&#8221;<br \/>\n&#8220;\\ta third argument is required which is the address of the of the\\n&#8221;<br \/>\n&#8220;\\tdevice-tree blob. To boot that kernel without an initrd image,\\n&#8221;<br \/>\n&#8220;\\tuse a &#8216;-&#8216; for the second argument. If you do not pass a third\\n&#8221;<br \/>\n&#8220;\\ta bd_info struct will be passed instead\\n&#8221;<br \/>\n#endif<br \/>\n);<\/p>\n","protected":false},"excerpt":{"rendered":"<p>int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, cha &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[238,48,49],"class_list":["post-302","post","type-post","status-publish","format-standard","hentry","category-6","tag-cmd_bootm-c","tag-mini6410","tag-uboot"],"views":1543,"_links":{"self":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=302"}],"version-history":[{"count":2,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/302\/revisions"}],"predecessor-version":[{"id":304,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/302\/revisions\/304"}],"wp:attachment":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=302"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}