2/09/2012

Android Board Bring-up


Boot Architecture on MSM™



ARM9™/AMSS boot
On-chip PBL
qcsbl.mbn
oemsbl.mbn
amss.mbn
Configures initial hardware config
(TLMM GPIO Configuration)
Configures modem's
multiprocessor subsystem
(SMEM, SMD, RPC)
Modem automatically connects to 3G network
Application processor/Linux boot
Android Bootloader
In /bootable/bootloader/legacy
Linux OS image
Mounts system and user file system
Starts up Android components via system/core/rootdir, starts up initial Dalvik process

Boot Architecture on MSM (cont.)

When power is applied to MSM, mARM executes the Primary Boot Loader (PBL) from on-chip ROM
PBL loads Qualcomm Secondary Boot Loader (QCSBL) into memory and transitions to secondary boot stage
System fully boots after QCSBL execution and enters operational software download mode
Modem image is loaded on mARM
Applications boot image, i.e., Android bootloader, is loaded into memory for aARM execution, which continues loading Android OS

Boot Architecture on QSD

ARM9™/AMSS boot
On-chip PBL
dbl.mbn/fsbl.mbn
osbl.mbn
amss.mbn
Configures initial hardware config
(TLMM GPIO Configuration)
Configures modem's
multiprocessor subsystem
(SMEM, SMD, RPC)
Modem automatically connects
to 3G network
Application processor/Linux boot
Android Bootloader
In bootable/bootloader/legacy
Linux OS image
Mounts system and user file system
Starts up Android components via system/core/rootdir, starts up initial Dalvik process

Android Boot Architecture

Android Bootloader Configuration~

Android Boot Architecture

Android Bootloader

For MSM7xxx and QSD, modem processor plays master role and handles memory configuration and clock/voltage setting for entire system
Android bootloader entry point (in /android/bootable/bootloader/legacy/usbloader/main.c)
Initialize ARM11 clock speed from TCXO to 600 MHz
Create partition table and initialize basic peripherals, such as UART, keypad, panel, USB, and flash controller
Parse or generate ATAGs
Load kernel and hand over to kernel init code
Handle image download, if needed

Bootloader File Structure

Bootloader located in:
/android/bootable/bootloader/legacy/usbloader
Bootloader libraries come from three categories:
Generic
Architecture
Board

Bootloader File Structure –Generic Category

Generic category contains code useful to any bootloader
Common bootloader libraries and base architectures
bootable/bootloader/legacy/include/boot/*.*
bootable/bootloader/legacy/libboot/*.*
bootable/bootloader/legacy/libc/*.*
bootable/bootloader/legacy/arch_armv6/*.*
Generated library and object located at:
out/target/product/msm7627_surf/obj/STATIC_LIBRARIES/libboot_intermediates/libboot.a
out/target/product/msm7627_surf/obj/STATIC_LIBRARIES/libboot_c_intermediates/libboot_c.a
out/target/product/msm7627_surf/obj/STATIC_LIBRARIES/libboot_arch_armv6_intermediates/libboot_arch_armv6.a

Bootloader File Structure –Architecture Category

Architecture category contains code useful to specific CPU, system-on-chip, etc.
Libraries and base architectures –Headers
bootable/bootloader/legacy/include/msm7k/*.*
bootable/bootloader/legacy/ arch_msm7k /*.*
Generated library and object file located at:
out/target/product/msm7627_surf/obj/STATIC_LIBRARIES/libboot_arch_msm7k_intermediates/libboot_arch_msm7k.a

Bootloader File Structure –Board Category

Board category contains code useful to a single, specific device
Libraries and base architectures –Configuration
vendor/qcom/msm7627_surf/*.*
vendor/qcom/msm7627_surf/boot/*.*
Generated library and object file located at:
out/target/product/msm7627_surf/obj/STATIC_LIBRARIES/libboot_board_surf_intermediates/libboot_board_surf.a

Bootloader File Structure –Board Configuration

The BoardConfig.mk defines important build variables:
TARGET_BOOTLOADER_LIBS := \libboot_board_surf \libboot_arch_msm7k\libboot_arch_armv6
TARGET_BOOTLOADER_LINK_SCRIPT := \vendor/qcom/$(TARGET_PRODUCT)/boot/boot.ld
BOARD_KERNEL_CMDLINE := mem=203M console=ttyMSM2,115200n8 androidboot.hardware=qcom

Bootloader Configuration

The following primary files require modification for SURF boards:
vendor/qcom/msm7627_surf/boot/board.c –Defines flash partitions and atags, provides board-specific initialization
vendor/qcom/msm7627_surf/boot/panel.c –Panel driver for outputting console messages
vendor/qcom/msm7627_surf/boot/keypad.c –Keypad driver for hot-key controlling
arch_msm7k/android/nand.c –Flash driver for NAND devices
arch_msm7k/hsusb.c –USB driver for fast boot
arch_msm7k/clock.c –Clock driver for setting frequency of ARM11 and AHB
arch_msm7k/uart.c –Serial port driver
arch_msm7k/gpio.c –GPIO driver for bootloader
Note:For QSD, similar modifications would be made under the appropriate QSD architecture subdirectory.

Flash Layout –board.c

Flash partition table (unit –block); the partition in PTABLE must refer to allocation in /AMSS/products/7600/tools/headergen/partition.c
ptentry PTABLE[] = {
{
.start = 300,
.length = 40,
.name = "boot",
},
{
.start = 356,
.length = 512,
.name = "system"
},
{
.start = 868,
.length = 155 + 1024,
.name = "userdata",
},
{
.name = "",
},
};
Partition table
Range
Android partitions
0:APPSBL
230 –233
(1 MB)
Android
Bootloader
0:APPS +
0:FTL +
0:EFS2APPS
300 –339
(5 MB)
boot (kernel)
356 –867
(64 MB)
system
868 –2046
(147 MB)
user data

Command Line –board.c

Use Linux kernel command line (default kernel command line) or specify command line in BoardConfig.mk
const char *board_cmdline(void)
{
return "mem=201M console=ttyMSM2,115200n8";
}
Board machine type
unsigned board_machtype(void)
{
return 1439;
}
To register machine type, see [R1]

Keypad Configuration –keypad.c

android/bootable/bootloader/legacy/arch_msm7k/keypad.c
Configure GPIO for keypad
static unsigned int halibut_row_gpios[] = { 31, 32, 33, 34, 35, 41 };
static unsigned int halibut_col_gpios[] = { 36, 37, 38, 39, 40 };
Configure special key to stop booting Linux
The following example shows two different stop boot key mappings used by two different targets –SURF and FFA
static unsigned int halibut_key_map[] = {
[11] = BOOT_KEY_CONTINUE_BOOT, /* FA on SURF, B on FFA */
[23] = BOOT_KEY_STOP_BOOT, /* FB on SURF */
[27] = BOOT_KEY_STOP_BOOT, /* 2 on FFA */
};
On SURF, pressing the [FB] key will stop booting Linux and the system will enter Fastboot mode; the FFA's special key is [2]

Keypad Configuration –keypad.c (cont.)

Register keypad information
static gpio_keypad_info halibut_keypad = {
.output_gpios = halibut_row_gpios,
.input_gpios = halibut_col_gpios,
.noutputs = ARRAY_SIZE(halibut_row_gpios),
.ninputs = ARRAY_SIZE(halibut_col_gpios),
.key_map = halibut_key_map,
.settle_time = 5000,
.polarity = 0,
.drive_inactive_outputs = 1
};

Panel Configuration –panel.c

The following interfaces are implemented for the Toshiba VGA panel on SURF:
panel_init( ) –Panel ID detection
panel_poweron( ) –Power-on panel
panel_backlight( ) –Control backlight of panel
The MDDI console is implemented to output messages
bootable/bootloader/legacy/arch_msm7k/mddi_console.c
console_init()
console_putc()
console_clear()

Bootloader Framebuffer

console_putc() calls drawglyph() to draw the character on LCD
drawglyph(pixels + cy * 12 * fb_width + cx * 6, FGCOLOR,fb_width, font5x12 + (c -32) * 2);
The font5x12[] is character pattern file
unsigned font5x12[] = {0x00000000, 0x00000000,0x08421080, 0x000200840x00052940, 0x00000000,0x15f52800, 0x0000295f,0x1c52f880, 0x00023e94,0x08855640, 0x0004d542,.......}

Bootloader Framebuffer (cont.)

Default resolution in bootloader is 800 (fb_width) x 480(fb_height)
Color format –565RGB
bit[0:4] –Blue
bit[5:10] –Green
bit[11:15] –Red
Example to splash RGB color on LCD
void splash_image(){
unsigned short *dst = mddi_framebuffer();
unsigned short color,rgb[3] = {0xf800, 0x07E0, 0x001f};
unsigned j,k;
for (j = 0; j < fb_height; j++) {
if ( !(j % (fb_height/3) ) )
color = rgb[ j/(fb_height/3) ];
for (k = 0; k < fb_width; k++ )
*dst++ = color;
}
console_flush();
}

UART Configuration –uart.c

bootable/bootloader/legacy/arch_msm7k/uart.c
uart_init() –Configure UART base address and init UART configuration, uart_init (n) , n = 0 (UART1), 1 (UART2), 2 (UART3)
In uart_init()uwr(UART_CSR_115200, UART_CSR); // to change baud rate
uart_getc() –Get input character from console
uart_putc() –Send output character to console
uart_put() –Send output string to console

USB Driver

bootable/bootloader/legacy/arch_msm7k/hsusb.c
Supports fastboot protocol to download image
Supports Fastboot mode
Protocol defined over USB
Used for flashing Android bootloader, system image, and file system
Mode normally triggered by special key sequence upon startup
Fastboot application
Source files –system/core/fastboot
Fastboot available on Linux, Mac OSX, and Windows versions; for information regarding how to build the fastboot application, refer to [Q3]
Flashes new Android code much faster than JTAG

Bootloader MSM7x27 Clock Configuration –clock.c

bootable/bootloader/legacy/arch_msm7k/clock.c
ARM11 core clock source is determined by A11S_CLK_CNTL (0xC0100100) CLK_SRC1_SEL[12:14] or CLK_SRC0_SEL[4:6] and A11S_CLK_SEL (0xC0100104) CLK_SEL_SRC1N0[0]
MSM7x27 pll speed of Dual mode frequency plan

Bootloader MSM7x27 Clock Configuration –clock.c (cont.)

arm11_clock_init() increases the ARM11 core speed from 19.2 MHz to 600 MHz
C = > A11S_CLK_CNTL, S => A11S_CLK_SEL
C,(CLK_SRC_TCXO << 12) | (DIV_1 << 8) | \
(CLK_SRC_TCXO << 4) | (DIV_1)),
S, ((DIV_4 << 1) | (CLK_SRC0)),
ARM11 : 19.2 MHz / 1 = 19.2 MHz
C, (CLK_SRC_TCXO << 12) | (DIV_1 << 8) | \
(CLK_SRC_PLL2 << 4) | (DIV_5)),
S, ((DIV_4 << 1) | (CLK_SRC1)),
ARM11 : 1200 MHz / 5 = 240 MHz
C, (CLK_SRC_PLL2 << 12) | (DIV_3 << 8) | \
(CLK_SRC_PLL2 << 4) | (DIV_5)),
S, ((DIV_4 << 1) | (CLK_SRC0)),
ARM11 : 1200 MHz / 3 = 400 MHz
C, (CLK_SRC_PLL2 << 12) | (DIV_3 << 8) | \
(CLK_SRC_PLL2 << 4) | (DIV_2)),
S, ((DIV_3 << 1) | (CLK_SRC1)),
ARM11 : 1200 MHz / 2 = 600 MHz

Bootloader QSD Clock Configuration –clock.c

bootable/bootloader/legacy/arch_qsd8k/clock.c
Scorpion core clock source is determined by SPSS_CLK_SEL (0xAC100104) register [2:1]; reset clock source is AXI Bus Clock
arm11_clock_init() sets the Scorpion core clock source to 01: Unbuffered Snapdragon core processor PLL
val = readl(A11S_CLK_SEL);
val &= ~(0x3 << 1); // reset the clock source
val |= (1 << 1);//set clock source to SPLL
writel(val, A11S_CLK_SEL);
The formula for SPLL is CLOCK = TCXO * L * 2, and the value of L can be configured in PLL_FSM_CTL_EXT(0xA8800010)[8:3]
val = readl(SCPLL_CTLE);
val &= ~(0x3F << 3);
val |= (0x14 << 3); //Use 0x1A instead of 0x14 for 998 MHz
writel(val, SCPLL_CTLE); //19.2 MHz*20*2=768 MHz, 19.2 MHz*26*2=998 MHz

Android Images

Output folder is android/out/target/product/msm7627_surf
usbloader –Android bootloader; for compliance with MIBIB architecture, a header is needed
MSM7K –appsboot.mbn (usbloader) and appsboothd.mbn
QSD8K –appsboot.mbn (40 bytes header + usbloader)
boot.img –Image containing (boot header + Linux kernel + ramdisk/rootfs)
system.img –Image containing Android user space applications and libraries, including libc.

Android Images –Bootimage Header

struct boot_img_hdr {
unsigned char magic[BOOT_MAGIC_SIZE];
unsigned kernel_size; /* size in bytes */
unsigned kernel_addr; /* physical load addr 0x10008000 */
unsigned ramdisk_size; /* size in bytes */
unsigned ramdisk_addr; /* physical load addr 0x11000000 */
unsigned tags_addr; /* physical addr for kernel tags
0x10000100 */
unsigned page_size; /* flash page size we assume */
unsigned unused[2]; /* future expansion: should be 0 */
unsigned char cmdline[BOOT_ARGS_SIZE];
unsigned id[8]; /* timestamp / checksum / sha1 / etc */
}

Android Kernel Configuration~

Android Kernel Configuration

Kernel Boot Sequence

Kernel initializing procedure
zImage decompression
/kernel/arch/arm/boot/compressed/head.S
ARM architecture specific kernel code
/kernel/arch/arm/kernel/head.S
/kernel/arch/arm/kernel/head-common.S
Processor-independent kernel code
/kernel/init/main.c
start_kernel()

Memory Map Requirements of Linux Kernel on MSM

Kernel physical memory start address recommended on 2 MB alignment
In file /kernel/arch/arm/kernel/head.S
#if (PHYS_OFFSET & 0x001fffff)
#error "PHYS_OFFSET must be at an even 2MiB boundary!"

1 comment:

  1. Hi!
    Have you any insight on PMIC pm8058 hardware init?
    What is the 19.2MHz clock used for? Is it necessary for the chip to "boot up"? I've got SE WT19i on which the voltage on PM_XTAL_19M_IN and PM_XTAL_19M_OUT is flat, the phone won't boot and I wonder if it is because faulty 19.2MHz resonator or whole pm8058. I'd apreciate any info about it since there is no pm8058 datasheet available :/
    Regards
    Adam

    ReplyDelete