於16年2月多購買了tiny4412sdk-1506,用友善之臂(以下簡稱友善)的superboot是可以進入linux,而用三星原始的uboot_tiny4412-20130729則不可以。出現現象是卡在“OK”,偶爾能繼續跑下去。根據以往開發的經驗,可以知道這絕對是ddr3配置的問題,查看“Tiny4412-1306-Schematic”是4顆ddr3@16bit,用到一個控制器兩個片選(chip0,chip1),而“Tiny4412-1412-Schematic”(對應我購買的PCB)是2顆ddr3@16bit,只需要一個控制器一個片選(chip0)。
(1306版本最好是兩個控制器一個片選,能把ddr3帶寬提升到64bit,可能技術/成本原因沒實現)
以下是我做的補丁包,代碼如下:
diff -uNrp uboot_tiny4412/board/samsung/tiny4412/mem_init_tiny4412.S uboot_tiny4412_kevin/board/samsung/tiny4412/mem_init_tiny4412.S --- uboot_tiny4412/board/samsung/tiny4412/mem_init_tiny4412.S 2016-04-11 12:32:03.511480729 +0800 +++ uboot_tiny4412_kevin/board/samsung/tiny4412/mem_init_tiny4412.S 2016-04-01 01:39:09.950628589 +0800 @@ -67,12 +67,12 @@ mem_ctrl_asm_init: ldr r1, =0x0FFF301A str r1, [r0, #DMC_CONCONTROL] - ldr r1, =0x00312640 + ldr r1, =0x00302640 @這里只有一個chip0 str r1, [r0, #DMC_MEMCONTROL] - ldr r1, =0x40e01323 + ldr r1, =0x40C01333 @Row是15bit,偏移地址是0x3FFFFFFF(1GB) str r1, [r0, #DMC_MEMCONFIG0] - ldr r1, =0x60e01323 + ldr r1, =0x80C01333 @可以不修改,這里只為了說明控制器0地址到達0x7FFFFFFF str r1, [r0, #DMC_MEMCONFIG1] #ifdef CONFIG_IV_SIZE @@ -97,11 +97,11 @@ mem_ctrl_asm_init: str r1, [r0, #DMC_TIMINGPOWER] #endif #ifdef MCLK_400 - ldr r1, =0x4046654f + ldr r1, =0x6946654f @根據ddr3顆粒規格書微調參數 str r1, [r0, #DMC_TIMINGROW] @TimingRow - ldr r1, =0x46400506 + ldr r1, =0x46460506 @根據ddr3顆粒規格書微調參數 str r1, [r0, #DMC_TIMINGDATA] @TimingData - ldr r1, =0x52000a3c + ldr r1, =0x5200183c @根據ddr3顆粒規格書微調參數 str r1, [r0, #DMC_TIMINGPOWER] @TimingPower #endif @@ -133,7 +133,7 @@ mem_ctrl_asm_init: 4: subs r2, r2, #1 bne 4b -#if 1 +#if 0 @去掉chip1代碼 /* chip 1 */ ldr r1, =0x07100000 str r1, [r0, #DMC_DIRECTCMD] @@ -209,12 +209,12 @@ mem_ctrl_asm_init: ldr r1, =0x0FFF301A str r1, [r0, #DMC_CONCONTROL] - ldr r1, =0x00312640 + ldr r1, =0x00302640 str r1, [r0, #DMC_MEMCONTROL] - ldr r1, =0x40e01323 @Interleaved? + ldr r1, =0x40c01333 @Interleaved? str r1, [r0, #DMC_MEMCONFIG0] - ldr r1, =0x60e01323 + ldr r1, =0x80C01323 str r1, [r0, #DMC_MEMCONFIG1] #ifdef CONFIG_IV_SIZE @@ -239,11 +239,11 @@ mem_ctrl_asm_init: str r1, [r0, #DMC_TIMINGPOWER] #endif #ifdef MCLK_400 - ldr r1, =0x4046654f + ldr r1, =0x6946654f @根據ddr3顆粒規格書微調參數 str r1, [r0, #DMC_TIMINGROW] @TimingRow - ldr r1, =0x46400506 + ldr r1, =0x46460506 @根據ddr3顆粒規格書微調參數 str r1, [r0, #DMC_TIMINGDATA] @TimingData - ldr r1, =0x52000a3c + ldr r1, =0x5200183c @根據ddr3顆粒規格書微調參數 str r1, [r0, #DMC_TIMINGPOWER] @TimingPower #endif @@ -275,7 +275,7 @@ mem_ctrl_asm_init: 4: subs r2, r2, #1 bne 4b -#if 1 +#if 0 @去掉chip1代碼 /* chip 1 */ ldr r1, =0x07100000 str r1, [r0, #DMC_DIRECTCMD] diff -uNrp uboot_tiny4412/board/samsung/tiny4412/tiny4412.c uboot_tiny4412_kevin/board/samsung/tiny4412/tiny4412.c --- uboot_tiny4412/board/samsung/tiny4412/tiny4412.c 2016-04-11 12:32:03.511480729 +0800 +++ uboot_tiny4412_kevin/board/samsung/tiny4412/tiny4412.c 2016-03-29 21:37:21.071493254 +0800 @@ -195,6 +195,14 @@ void dram_init_banksize(void) gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE; gd->bd->bi_dram[3].start = PHYS_SDRAM_4; gd->bd->bi_dram[3].size = PHYS_SDRAM_4_SIZE; + gd->bd->bi_dram[4].start = PHYS_SDRAM_5; //BANK數量改變 + gd->bd->bi_dram[4].size = PHYS_SDRAM_5_SIZE; + gd->bd->bi_dram[5].start = PHYS_SDRAM_6; + gd->bd->bi_dram[5].size = PHYS_SDRAM_6_SIZE; + gd->bd->bi_dram[6].start = PHYS_SDRAM_7; + gd->bd->bi_dram[6].size = PHYS_SDRAM_7_SIZE; + gd->bd->bi_dram[7].start = PHYS_SDRAM_8; + gd->bd->bi_dram[7].size = PHYS_SDRAM_8_SIZE; #ifdef CONFIG_TRUSTZONE gd->bd->bi_dram[nr_dram_banks - 1].size -= CONFIG_TRUSTZONE_RESERVED_DRAM; diff -uNrp uboot_tiny4412/drivers/mmc/mmc.c uboot_tiny4412_kevin/drivers/mmc/mmc.c --- uboot_tiny4412/drivers/mmc/mmc.c 2016-04-11 12:32:04.479480708 +0800 +++ uboot_tiny4412_kevin/drivers/mmc/mmc.c 2016-03-30 01:03:42.119732762 +0800 @@ -955,7 +955,7 @@ static int mmc_read_ext_csd(struct mmc * ext_csd_struct = ext_csd[EXT_CSD_REV]; host->ext_csd.boot_size_multi = ext_csd[BOOT_SIZE_MULTI]; - if (ext_csd_struct > 5) { + if (ext_csd_struct > 7) { //若不修改,進入uboot會提示無法識別版本,原因是友善用的emmc顆粒版本較高 printf("unrecognised EXT_CSD structure " "version %d\n", ext_csd_struct); err = -1; diff -uNrp uboot_tiny4412/include/configs/tiny4412.h uboot_tiny4412_kevin/include/configs/tiny4412.h --- uboot_tiny4412/include/configs/tiny4412.h 2016-04-11 20:37:03.834845777 +0800 +++ uboot_tiny4412_kevin/include/configs/tiny4412.h 2016-04-11 16:13:01.719191442 +0800 @@ -278,9 +278,9 @@ #ifdef CONFIG_EVT0_STABLE #define CONFIG_NR_DRAM_BANKS 2 #else -#define CONFIG_NR_DRAM_BANKS 4 +#define CONFIG_NR_DRAM_BANKS 8 //BANK提高到8 #endif -#define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */ +#define SDRAM_BANK_SIZE 0x08000000 /* 128 MB */ //每個BANK容量減小 #define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE /* SDRAM Bank #1 */ #define PHYS_SDRAM_1_SIZE SDRAM_BANK_SIZE #define PHYS_SDRAM_2 (CONFIG_SYS_SDRAM_BASE + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */ @@ -326,7 +326,7 @@ */ /* Fastboot variables */ #define CFG_FASTBOOT_TRANSFER_BUFFER (0x48000000) -#define CFG_FASTBOOT_TRANSFER_BUFFER_SIZE (0x18000000) /* 384MB */ +#define CFG_FASTBOOT_TRANSFER_BUFFER_SIZE (0x30000000) /* 768MB */ //當初為了調原生uboot啟動android5.0修改,這里跟uboot啟動無關 #define CFG_FASTBOOT_ADDR_KERNEL (0x40008000) #define CFG_FASTBOOT_ADDR_RAMDISK (0x41000000) #define CFG_FASTBOOT_PAGESIZE (2048) // Page size of booting device
以上的注釋都是patch之后后續加上,只為了方便閱讀。修改后的uboot啟動android 4.2是可以正常啟動,但無法運行android 5.0(啟動一段時間后自動跑飛),問了其他人均表示此現象。
詢問友善說是uboot問題。應該是superboot做了其他處理,這里沒有能力繼續研究下去。
1:友善的售后做的很差,把客戶當傻X;
2:開源力度相當低;
3:硬件&PCB設計很差。
以上三點理由讓我不會再選擇友善的產品!