How to boot Linux kernel from u-boot?

19,483

Solution 1

Despite the message "Starting kernel ...", the kernel has not actually started executing (because the image has to be first relocated and also uncompressed), and consequently enabling earlyprintk will have no effect yet.
What does look suspect are the RAM addresses.

The typical "am33xx-evm" board only has 512MB of RAM starting at 0x80000000.
Yet you are trying to use RAM addresses from 0xC0700000 to 0xC0E0CE19 where physical memory should not exist.
Obviously the kernel and the device tree are not loaded properly.

Instead of

fatload usb 0:1 0xC0700000 uImage
fatload usb 0:1 0xC0e00000 am335x-evm.dtb
bootm 0xC0700000 - 0xC0e00000

try using

fatload usb 0:1 0x80200000 uImage 
fatload usb 0:1 0x80e00000 am335x-evm.dtb
bootm 0x80200000 - 0x80e00000 

Solution 2

The booting sequence looks fine. The kernel and the device tree are loaded properly. The problem seems to be in the kernel itself. Probably it is just not built with the right settings. Specifically the console device and early printk facility should be enabled. Also check your bootargs.

Share:
19,483
Tom Xue
Author by

Tom Xue

I am Senior Researcher in Nokia, Beijing. And I am searching new job in software development. My code is here: https://github.com/tomxue https://github.com/tomxuetoy My LinkedIn Public Profile is here: http://cn.linkedin.com/pub/tom-xue/39/374/700 My online resume is here: https://www.box.com/s/dc29fd453832524f51a6

Updated on June 08, 2022

Comments

  • Tom Xue
    Tom Xue almost 2 years

    My Linux kernel image uImage is in my U-disk. And I want to boot it from U-Boot. Also the device tree file am335x-evm.dtb is in my U-disk. What I did is below:

    U-Boot# usb start
    (Re)start USB...
    USB0:   scanning bus 0 for devices... 1 USB Device(s) found
           scanning usb for storage devices... 1 Storage Device(s) found
    U-Boot# fatls usb 0:1
      3821960   uimage
                kit3/
      4065280   modules.tar
                my_modules/
                extra/
                system volume information/
          375   uenv.txt
        40474   am335x-evm.dtb
    
    4 file(s), 4 dir(s)
    
    U-Boot# fatload usb 0:1 0xC0700000 uImage
    reading uImage
    3821960 bytes read in 2375 ms (1.5 MiB/s)
    U-Boot# fatload usb 0:1 0xC0e00000 am335x-evm.dtb
    reading am335x-evm.dtb
    40474 bytes read in 48 ms (823.2 KiB/s)
    U-Boot# bootm 0xC0700000 - 0xC0e00000
    ## Booting kernel from Legacy Image at c0700000 ...
       Image Name:   Linux-3.12.10-ge35dc10-dirty
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    3821896 Bytes = 3.6 MiB
       Load Address: 80008000
       Entry Point:  80008000
       Verifying Checksum ... OK
    ## Flattened Device Tree blob at c0e00000
       Booting using the fdt blob at 0xc0e00000
       Loading Kernel Image ... OK
    OK
       Using Device Tree in place at c0e00000, end c0e0ce19
    
    Starting kernel ...
    

    And it stops here. How to do? Thanks!

    Result: Thanks for everyone who answered in this post! Now I can boot the system by using the image in U-disk. What I do is:

    setenv bootargs "console=ttyO0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 mem=512M coherent_pool=8M loglevel=0 lpj=3317760 rootwait"
    usb start; fatls usb 0:1; fatload usb 0:1 0x82000000 uImage-orig-onUSB;fatload usb 0:1 0x80F80000 am335x-evm.dtb;bootm 0x82000000 - 0x80F80000
    

    Without the first sentence, the system can also boot and start the GUI program which will show in a display. But the debug serial port has no reaction any more!

    As for the second sentence, if I use the ram address of 0xC0700000 and 0xC0e00000, like this below, then it will stop to load the kernel. The reason should be what sawdust mentioned in his answer. @sawdust

    setenv bootargs "console=ttyO0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 mem=512M coherent_pool=8M loglevel=0 lpj=3317760 rootwait"
    usb start; fatls usb 0:1; fatload usb 0:1 0xC0700000 uImage-orig-onUSB;fatload usb 0:1 0xC0e00000 am335x-evm.dtb;bootm 0xC0700000 - 0xC0e00000