Загрузка Андроида с помощью Uboot

Материал из Toshiba AC100 wiki
Перейти к навигации Перейти к поиску

Сборник вопросов связанных с Uboot и Андроидом


Пока все в кучу, а там видно будет

Текущие проблемы мешающие загрузке

  • Висяк с тем что не находится root= и init=
    • При использовании uboot не распаковывается initrd - включение CONFIG_INITRD_TAG исправляет ситуацию (логи fastboot, uboot, uboot fixed).
  • tegra_dvfs: rate 666000000 too high for dvfs on ...
    • Лечится включением TEGRA_PREINIT_CLOCKS в ядре
  • rcu_sched_state detected stall on CPU 1

При использовании ядра в котором еще нет tegra_udc и используется freescale udc драйвер

  • Ядро виснет при исполнении функции tegra_init_early в arch/arm/mach-tegra/common.c, при запуске tegra_clk_init_from_table(common_clk_init_table);
  • Теперь андроид грузится из юбута, в логе много софткрешей и мусора

Test drive

  • Накатить через рековери систему собраную для теста http://dl.dropbox.com/u/32472722/uboot/cm_ac100-ota-eng.zombah.zip
  • Скачать набор uboot для внешней сдкарты fat32, тут http://dl.dropbox.com/u/32472722/uboot/boot.tar.gz
  • Бутнуть тошу в рековери режим
  • Вставить заряженую сд карту
  • Бутнуть тошу коммандой nvflash --bl ./u-boot-dtb-tegra.bin --go , заряженный бутлоадер лежит внутри boot.tar.gz
    • Смотреть в консоль

Загрузка штатного ядра и рамдиска юбутом

Можно не выносить ядра и рамдиск на отдельный носитель, а читать их с диска прям самим юбутом:

mmc dev 0
mmc read 0x1000000 0x3404 0x12ac   
mmc read 0x2200000 0x46b0 0x150
bootz 0x1000000 0x2200000

Инфа из разных мест о работе uboot с android

  • boot.scr от самсунга
setenv android_cmd loglevel=4 console=ram sec_debug.enable=0 sec_debug.enable_user=0 sec_log=0x100000@0x4d900000 s3cfb.bootloaderfb=0x5ec00000 ld9040.get_lcdtype=0x2 consoleblank=0 lpj=3981312 vmalloc=144m;

if test $sgs2_bootmode_val -eq 1; then
	setenv android_cmd ${android_cmd} bootmode=2;
fi
setenv bootargs ${android_cmd}

setenv devtype mmc
setenv devnum 0
setenv kernel_part 0xb
setenv kernel_name /boot/android.uimg
setenv loadaddr 0x4EF08000

echo Load Address:${loadaddr};
echo Cmdline:${bootargs};

if fatload ${devtype} ${devnum}:${kernel_part} ${loadaddr} ${kernel_name}; then
	bootm ${loadaddr};
	exit 0;
elif ext2load ${devtype} ${devnum}:${kernel_part} ${loadaddr} ${kernel_name}; then
	bootm ${loadaddr};
	exit 0;
else
	echo failed to boot custom image;
fi
  • Нужно описание нашего emmc на тему юбута, типа где начинается бут лоадер, где ядро, где инитрд. А то разбирают сомнения, нужно упорядочить инфу в одной таблице.

Загрузка cm-10 beta4 u-boot'ом

Boot Kernel size = 2580708 Boot Initrd size = 170677 Recovery Kernel size = 2580708 Recovery Initrd size = 1859967

Boot Kernel offset: start = 5376 + 1 = 5377 - 2048 = 3329 x 4=13316 (0x3404) (для 32гб модели) size = 2580708 + 2048 = 2582756 - 1 = 2582755 / 2048 = 1261 x 4 = 5044 (0x13b4)

Boot Initrd offset: start = 0x3404 + 0x13b4 = 0x47b8 size = 170677 + 2048 = 172725 / 2048 = 84 x 4 = 336 (0x150)

mmc read 0x1000000 0x3404 0x13b4 mmc read 0x2200000 0x47b8 0x150

Recovery Kernel offset: start = 2816 + 1 = 2817 - 2048 = 769 x 4 = 3076 (0xc04) (для 32гб модели) size = 2580708 + 2048 = 2582756 - 1 = 2582755 / 2048 = 1261 x 4 = 5044 (0x13b4) (в андроиде в рековери у нас пока ядро тоже что и бут имидже)

Recovery Initrd offset: start = 0xc04 + 0x13b4 = 0x1fb8 size = 1859967 + 2048 = 1862015 / 2048 = 909 x 4 = 3636 (0xe34)

mmc read 0x1000000 0xc04 0x13b4 mmc read 0x2200000 0x1fb8 0xe34

Добавляем функции в u-boot

diff --git a/include/configs/paz00.h b/include/configs/paz00.h
index b0c6ff4..85bf5cc 100644
--- a/include/configs/paz00.h
+++ b/include/configs/paz00.h
@@ -80,6 +80,35 @@
 #define CONFIG_SYS_I2C_INIT_BOARD 1
 #define CONFIG_TEGRA_NVEC 1
 
+/* Support kernel 3.1 initrd */
+#define CONFIG_INITRD_TAG 1
+
+#define PAZ00_DEVICE_SETTINGS \
+        "legacybootkernelstart=0x3404\0" \
+        "legacybootkernelsize=0x13b4\0" \
+        "legacybootinitrdstart=0x47b8\0" \
+        "legacybootinitrdsize=0x150\0" \
+        "legacybootkernelmemoffset=0x1000000\0" \
+        "legacybootinitrdmemoffset=0x2200000\0" \
+        "legacyrecoverykernelstart=0xc04\0" \
+        "legacyrecoverykernelsize=0x13b4\0" \
+        "legacyrecoveryinitrdstart=0x1fb8\0" \
+        "legacyrecoveryinitrdsize=0xe34\0" \
+        "legacymmcdev=mmc dev 0\0" \
+        "legacyboot=${legacymmcdev};" \
+                   "mmc read ${legacybootkernelmemoffset} " \
+                   "${legacybootkernelstart} ${legacybootkernelsize};" \
+                   "mmc read ${legacybootinitrdmemoffset} " \
+                   "${legacybootinitrdstart} ${legacybootinitrdsize};" \
+                   "bootz ${legacybootkernelmemoffset} ${legacyinitrdmemoffset}\0" \
+        "legacyrecovery=${legacymmcdev};" \
+                   "mmc read ${legacybootkernelmemoffset} " \
+                   "${legacyrecoverykernelstart} ${legacyrecoverykernelsize};" \
+                   "mmc read ${legacybootinitrdmemoffset} " \
+                   "${legacyrecoveryinitrdstart} ${legacyrecoveryinitrdsize};" \
+                   "bootz ${legacybootkernelmemoffset} ${legacyinitrdmemoffset}\0" \
+        ""
+
 #include "tegra-common-post.h"
 
 #endif /* __CONFIG_H */
diff --git a/include/configs/tegra-common-post.h b/include/configs/tegra-common-post.h
index 222de86..2392c1d 100644
--- a/include/configs/tegra-common-post.h
+++ b/include/configs/tegra-common-post.h
@@ -150,7 +150,8 @@
 #define CONFIG_EXTRA_ENV_SETTINGS \
        TEGRA_DEVICE_SETTINGS \
        MEM_LAYOUT_ENV_SETTINGS \
-       BOOTCMDS_COMMON
+       BOOTCMDS_COMMON \
+    PAZ00_DEVICE_SETTINGS
 
 #if defined(CONFIG_TEGRA20_SFLASH) || defined(CONFIG_TEGRA20_SLINK) || defined(CONFIG_TEGRA114_SPI)
 #define CONFIG_FDT_SPI