S5P4418的启动方式
我的板子是g4418box,默认的从eMMC启动,如果插入了SD卡那么就从SD启动,具体的板子需要看HW设计。
SD卡的layout
在layout之前我们需要知道各个分区的大小,而编译出来的img是sparse的ext4,所以需要先convert到标准的ext4,然后再mount,mount之后可以看到对应的size:
loop0 7:0 0 754M 0 loop /home/hexiongjun/Test/system
loop1 7:1 0 428M 0 loop /home/hexiongjun/Test/cache
loop2 7:2 0 5.6G 0 loop /home/hexiongjun/Test/data
对SD卡分区
使用Gparted的分区后情况如下,注意size与extension分区:
分区后的情况如下:
sdc 8:32 1 7.4G 0 disk
├─sdc1 8:33 1 100M 0 part /media/hexiongjun/boot
├─sdc2 8:34 1 1G 0 part /media/hexiongjun/system
├─sdc3 8:35 1 668M 0 part /media/hexiongjun/cache
├─sdc4 8:36 1 1K 0 part
├─sdc5 8:37 1 2G 0 part
ramdisk的处理
我们可以按照以前的做法将ramdisk打包成cpio的gzip,但是这样的话如果要修改ramdisk里面的内容会比较麻烦,修改方法可以看我以前的博客。所以这里决定使用专门一个分区放ramdisk,同时也将uImage也放在这个boot分区
修改fstab
因为默认编译出来的是从eMMC中启动,而我们需要更改fstab,让vold知道如何mount我们的分区,
在修改之前我们需要确定分区的mmcblk number,这个可以直接启动ramdisk最小系统就行了,因为ramdisk启动完成后没有启动其他的service也是可以使用的。
root@g4418:/ # ls /dev/block/
loop0
loop1
loop2
loop3
loop4
loop5
loop6
loop7
mmcblk0
mmcblk0boot0
mmcblk0boot1
mmcblk0p1
mmcblk0p2
mmcblk0p3
mmcblk0p4
mmcblk0p5
mmcblk0p6
mmcblk0p7
mmcblk1
mmcblk1p1
mmcblk1p2
mmcblk1p3
mmcblk1p4
mmcblk1p5
mmcblk1p6
platform
vold
我们我们需要确定哪个是eMMC哪个是SD卡,这个可以对比以前的fstab完成:
/dev/block/platform/dw_mmc.2/by-num/p2 /system ext4 rw wait
/dev/block/platform/dw_mmc.2/by-num/p3 /cache ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
/dev/block/platform/dw_mmc.2/by-num/p7 /data ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
可以看到emmc是mmcblk0,而靠近reset button的SD是mmcblk1.
最主要的是system,cache,data,修改后的如下:
root@g4418:/ # cat /fstab.g4418
# Android fstab file.
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
/dev/block/mmcblk1p2 /system ext4 rw wait
/dev/block/mmcblk1p3 /cache ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
/dev/block/mmcblk1p5 /data ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,check
/devices/platform/nxp-ehci/usb1/1-1/1-1.2/1-1.2:1.0 /storage/usbdisk1 vfat defaults voldmanaged=usbdisk1:auto,noemulatedsd
/devices/platform/nxp-ehci/usb1/1-1/1-1.2/1-1.2.1 /storage/usbdisk1 vfat defaults voldmanaged=usbdisk1:auto,noemulatedsd
/devices/platform/nxp-ehci/usb1/1-1/1-1.2/1-1.2.2 /storage/usbdisk2 vfat defaults voldmanaged=usbdisk2:auto,noemulatedsd
/devices/platform/nxp-ehci/usb1/1-1/1-1.2/1-1.2.3 /storage/usbdisk3 vfat defaults voldmanaged=usbdisk3:auto,noemulatedsd
/devices/platform/nxp-ehci/usb1/1-1/1-1.2/1-1.2.4 /storage/usbdisk4 vfat defaults voldmanaged=usbdisk4:auto,noemulatedsd
/devices/platform/dwc_otg/usb2/2-1/2-1:1.0 /storage/usbdisk5 vfat defaults voldmanaged=usbdisk5:auto,noemulatedsd
/devices/platform/dwc_otg/usb2/2-1/2-1.1 /storage/usbdisk5 vfat defaults voldmanaged=usbdisk5:auto,noemulatedsd
/devices/platform/dwc_otg/usb2/2-1/2-1.2 /storage/usbdisk6 vfat defaults voldmanaged=usbdisk6:auto,noemulatedsd
/devices/platform/dwc_otg/usb2/2-1/2-1.3 /storage/usbdisk7 vfat defaults voldmanaged=usbdisk7:auto,noemulatedsd
/devices/platform/dwc_otg/usb2/2-1/2-1.4 /storage/usbdisk8 vfat defaults voldmanaged=usbdisk8:auto,noemulatedsd
#/devices/platform/dw_mmc.0/mmc_host/mmc1/mmc1 /storage/sdcard1 vfat defaults voldmanaged=sdcard1:auto
#/devices/platform/dw_mmc.1/mmc_host/mmc2/mmc2 /storage/sdcard2 vfat defaults voldmanaged=sdcard2:auto
需要注意的是,需要将原来最后的mmc1的mount注释掉。否则会出问题。
烧写image到各个SD卡分区
类似的命令如下:
sudo dd if=out/target/product/g4418/system_ext4.img of=/dev/sdc2 bs=10M
sudo dd if=out/target/product/g4418/cache_ext4.img of=/dev/sdc3 bs=10M
然后拷贝ramdisk,与uImage:
sudo cp ./linux/kernel/kernel-3.4.39/arch/arm/boot/uImage /media/hexiongjun/boot
sudo cp -r out/target/product/g4418/root/* /media/hexiongjun/
修改bootargs
默认启动后的bootargs如下:
console=ttyAMA0,115200n8 androidboot.hardware=g4418 androidboot.console=ttyAMA0 androidboot.serialno=0123456789abcdef initrd=0x49000000,0x200000 init=/init lcd=vs070cxn tp=gslx680
我们将ramdisk放到了boot分区,需要将其指定为boot:
set bootargs 'lcd=vs070cxn tp=gslx680 root=/dev/mmcblk1p1'
bootcmd的修改
默认的是这样子的:
ext4load mmc 0:1 0x48000000 uImage;ext4load mmc 0:1 0x49000000 root.img.gz;bootm 0x48000000
我们已经不需要ramdisk了:
ext4load mmc 0:1 0x48000000 uImage;bootm 0x48000000
启动
启动后我们查看一下是否所有的service都已经启动完成,分区是否正确mount。
root@g4418:/ # mount
rootfs / rootfs rw 0 0
/dev/root / ext4 ro,relatime,data=ordered 0 0
devtmpfs /dev devtmpfs rw,relatime,size=413380k,nr_inodes=103345,mode=755 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,relatime,mode=750,gid=1000 0 0
none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/memcg cgroup rw,relatime,memory 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/mmcblk1p2 /system ext4 rw,relatime,data=ordered 0 0
/dev/block/mmcblk1p3 /cache ext4 rw,nosuid,nodev,noatime,nomblk_io_submit,errors=panic,data=ordered 0 0
/dev/block/mmcblk1p5 /data ext4 rw,nosuid,nodev,noatime,nomblk_io_submit,errors=panic,data=ordered 0 0
/sys/kernel/debug /sys/kernel/debug debugfs rw,relatime 0 0
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,noexec,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
可以看到data system与cache分区都正确mount了。
去掉healthd的不停的log输出
使用stop healthd即可完成。
完整的启动log
--------------------------------------------------------------------------------
Second Boot by Nexell Co. : Built on Nov 19 2014 20:10:38
--------------------------------------------------------------------------------
PLL0: 600000000 PLL1: 800000000 PLL2: 780000000 PLL3: 800000000
Divider0 PLL: 1 CPU:800000000 CPU BUS:200000000
Divider1 PLL: 0 BCLK:300000000 PCLK:150000000
Divider2 PLL: 3 MDCLK:800000000 MCLK:800000000
MBCLK:400000000 MPCLK:200000000
Divider3 PLL: 0 G3D BCLK:300000000
Divider4 PLL: 0 MPEG BCLK:300000000 MPEG PCLK:150000000
123
DDR3 POR Init Start
phy init
########## READ/GATE Level ##########
DDR3 Init Done!
Loading from sdmmc...
Image Loading Done!
Launch to 0x40100000
U-Boot 2014.07 (Jul 13 2016 - 13:41:56)
PLL : [0] = 600000000, [1] = 800000000, [2] = 780000000, [3] = 800000000
PLL1: CPU FCLK = 800000000, HCLK = 200000000
PLL0: BUS BCLK = 300000000, PCLK = 150000000
PLL3: MEM MCLK = 800000000, DCLK = 800000000, BCLK = 400000000, PCLK = 200000000
PLL0: G3D BCLK = 300000000
PLL0: MPG BCLK = 300000000, PCLK = 150000000
I2C: ready
DRAM: 1 GiB
Heap = 0x43000000~0x45000000
Code = 0x42c00000~0x42c74a04
GLD = 0x42bffeb8
GLBD = 0x42bffe68
SP = 0x42bffe68,0x42bffe48(CURR)
PC = 0x42c069d8
TAGS = 0x40000100
PAGE = 0x42c80000~0x42c8c000
MACH = [4330]
VER = 1
BOARD= [g4418]
MMC: NXP DWMMC: 0, NXP DWMMC: 1, NXP DWMMC: 2
In: serial
Out: serial
Err: serial
switch to partitions #0, OK
mmc2(part 0) is current device
DONE: Logo bmp 1024 by 600 (3bpp), len=1843254
DRAW: 0x47000000 -> 0x46000000
DONE: Logo bmp 1024 by 600 (3bpp), len=1843254
DRAW: 0x47000000 -> 0x46000000
RGB: display.0
Hit any key to stop autoboot: 0
G4418#
G4418#
G4418#
G4418#
G4418#
G4418# set bootargs 'lcd=vs070cxn tp=gslx680 root=/dev/mmcblk1p1'
G4418# ext4load mmc 0:1 0x48000000 uImage;ext4load mmc 0:1 0x49000000 root.img.gz;bootm 0x48000000
** File not found root.img.gz **
## Booting kernel from Legacy Image at 48000000 ...
Image Name: Linux-3.4.39-graperain
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4475624 Bytes = 4.3 MiB
Load Address: 40008000
Entry Point: 40008000
Verifyi