Search code examples
linux-kernelarmembedded-linuxu-boot

memory location for linux kernel for u-boot


Currently, I have a ARM device that uses U-boot to load android OS. I wish to replace android with linux. So what I've done is loaded a copy of linux compiled for ARM devices onto a sd-card, boot into the U-boot bootloader. The problem now is what memory location do I tell U-boot to boot up the vmlinuz linux kernel?

How do I find this out? Or pointing out some resources would be great as well.

Thanks.

The following is the current boot up sequence from connecting to the serial port

Reg Version:  v1.1.0
Reg Time:     2014-10-115:15:35
Reg Name:     hi3719cdmo1a_hi3719cv100_ddr3_1gbyte_16bitx2_2layers_emmc.reg

Fastboot 3.3.0 (zengzhiliang@server180) (Nov 21 2014 - 13:41:16)

Fastboot:      Version 3.3.0
Build Date:    Nov 21 2014, 13:41:29
CPU:           Hi3719Cv100
Boot Media:    eMMC
DDR Size:      1GB

Check nand flash controller v610. found
Special NAND id table Version 1.36
Nand ID: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
No NAND device found!!!

Check spi flash controller v350. found
Can't find a valid spi flash chip.
Can't find a valid spi flash chip.

MMC/SD controller initialization.
MMC/SD Card:
    MID:         0xfe
    Read Block:  512 Bytes
    Write Block: 512 Bytes
    Chip Size:   3656M Bytes (High Capacity)
    Name:        "P1XXX"
    Chip Type:   MMC
    Version:     4.0
    Speed:       25000000Hz
    Bus Width:   8bit
    Boot Addr:   0 Bytes

*** Warning - bad CRC or eMMC, using default environment


Boot Env on eMMC
    Env Offset:          0x00100000
    Env Size:            0x00010000
    Env Range:           0x00010000


SDK Version: HiSTBAndroidV500R001C01CP0002_v2014070614

[Android_Main,34] begin
[sw_set_gpio,85] ok
[sw_ptable_init,66] begin
partition addr : [0x200000]
[swfastboot_flash_read,31]BaseAddress:0x200000, DataSize:0x100000, offset:0x0, b                         ytes:0xa10
[sw_ptable_check,176]cksum [0x6c94], ptable->checksum[0x6c94]
[sw_ptable_init,79] data at 0x200000 is ok
 0     fastboot 0x00000000 0x00200000
 1    partition 0x00200000 0x00200000
 2     recovery 0x00400000 0x01000000
 3   deviceinfo 0x01400000 0x00200000
 4    baseparam 0x01600000 0x00800000
 5      pqparam 0x01E00000 0x00800000
 6         logo 0x02600000 0x00800000
 7     fastplay 0x02E00000 0x02800000
 8         boot 0x05600000 0x01000000
 9         misc 0x06600000 0x00200000
10       system 0x06800000 0x27000000
11        cache 0x2D800000 0x19000000
12       backup 0x46800000 0x19000000
13         swdb 0x5F800000 0x03000000
14     userdata 0x62800000 0x80000000
ptable info:2M(fastboot),2M(partition),16M(recovery),2M(deviceinfo),8M(baseparam                         ),8M(pqparam),8M(logo),40M(fastplay),16M(boot),2M(misc),624M(system),400M(cache)                         ,400M(backup),48M(swdb),2048M(userdata)
[sw_ptable_init,104] ok
[sw_devinfo_init,25] begin
deviceinfo addr : [0x01400000]
[swfastboot_flash_read,31]BaseAddress:0x1400000, DataSize:0x100000, offset:0x0,                          bytes:0x514
[sw_devinfo_check,166] start...
[sw_devinfo_check,184] ok,checksum:0x9aad
[sw_devinfo_init,44] data at 0x1400000 is ok
[0] count:[4] name:[serialno] value:[xxxxxxxxxxxxxxxx]
[1] count:[4] name:[mac] value:[00:03:63:f4:33:12]
[2] count:[4] name:[standard] value:[1080i_50Hz]
[3] count:[4] name:[secureline] value:[20100]
[sw_devinfo_init,71] ok
[swfastboot_flash_read,31]BaseAddress:0x6600000, DataSize:0x100000, offset:0x0,                          bytes:0x10000
boot normal!!!
[swfastboot_flash_read,31]BaseAddress:0x5602000, DataSize:0x100000, offset:0x0,                          bytes:0x2000
use boot cmdline,disable serial, cmdline:[mem=1G console=NULL,115200 blkdevparts                         =mmcblk0:]
bootargs:[mem=1G console=NULL,115200 blkdevparts=mmcblk0:2M(fastboot),2M(partiti                         on),16M(recovery),2M(deviceinfo),8M(baseparam),8M(pqparam),8M(logo),40M(fastplay                         ),16M(boot),2M(misc),624M(system),400M(cache),400M(backup),48M(swdb),2048M(userd                         ata) androidboot.mac=00:03:63:f4:33:12 androidboot.standard=1080i_50Hz androidbo                         ot.serialno=xxxxxxxxxxxxxxx]
authenticat kernel begin
CA_GetFlashImgInfoByAddr,683: Img has already be encrypted
CA_GetFlashImgInfoByAddr,689: Magic number check right
CA_FlashAuthenticateByAddr,898: CA_FlashAuthenticateByAddr   0x5600000  successe                         d
offset = 0x5600000 KernelImgInDDRAddress = 0x4002000bootimg now: bootm 4002000
[Android_Main,52] ok
stDispParam.enFormat = 6
sw_EdidAll[0] = 10
sw_EdidAll[1] = 5
sw_EdidAll[2] = 9
sw_EdidAll[3] = 8
sw_EdidAll[4] = 7
sw_EdidAll[5] = 6
sw_EdidAll[6] = 5
sw_EdidAll[7] = 1
sw_EdidAll[8] = 0
sw_EdidAll[9] = 101
use baseparam format [6]

Reserve Memory
    Start Addr:          0xFFFF000
    Bound Addr:          0x8D3B000
    Free  Addr:          0xF2FA000
    Alloc Block:  Addr        Size
                  0xF2FA000       8192
                  0xF2FD000       2764800
                  0xF5A1000       3686400
                  0xF926000       1658880
                  0xFABC000       3686400
                  0xFE41000       12288
                  0xFE45000       1048576
                  0xFF46000       212992
                  0xFF7B000       8192
                  0xFF7E000       524288

Press Ctrl+C to stop autoboot

Found Initrd at 0x04E00000 (Size 535422 Bytes), align at 2048 Bytes

## Booting kernel from Legacy Image at 04002800 ...
   Image Name:   Linux-3.10.0_s40
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    8925824 Bytes = 8.5 MiB
   Load Address: 02000000
   Entry Point:  02000000
   Loading Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Solution

  • So what I've done is loaded a copy of linux compiled for ARM devices onto a sd-card ...

    Unlike x86, there is no one build of a Linux kernel that executes on all "ARM devices".
    Older ARM Linux kernels (i.e. pre-Device Tree) were configured and built specifically for each SoC/board variation.
    Modern ARM Linux kernels can be built for one or more SoCs, and the kernel is booted with a Device Tree blob to describe the board in use.

    You haven't provided any details to indicate if the kernel you have is sufficient to boot your "ARM device".

    The problem now is what memory location do I tell U-boot to boot up the vmlinuz linux kernel?

    ARM Linux should boot using a zImage file, not a vmlinuz file.

    What is the start address of physical RAM on your device?

    The convention is that the ARM Linux kernel will execute at the base of physical RAM plus an offset of 0x8000 (32K). See this answer for more details.

    The zImage file is self-extracting, and can be loaded (by U-Boot from your SD card) to any suitable memory address above the kernel's load/execute address (while leaving room for the DT blob and not clobber U-Boot).

    Or pointing out some resources would be great as well.

    Try Russel King's Booting ARM Linux and Vincent Sanders' Booting ARM Linux.