S5P4418 使用SD卡启动Android系统

本文详细介绍了S5P4418芯片如何配置SD卡启动Android系统,包括SD卡分区布局、ramdisk处理、修改bootargs和bootcmd,以及启动过程中的日志优化。通过这些步骤,确保Android系统能够成功从SD卡启动并正常运行。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值