遇到的問題是:
fail 的機器,開機後,寫入 bootloader (1k~1M 區域),好像沒效。
dd 完 dump 出來看是 OK。
但是重新開機後就恢復沒 dd 的狀態。
如果使用 fastboot flash bootloader,write 完畢會出現:
Warning: fail to get ext csd for MMC!
Error: Fail to switch partition to 1
Writing 'bootloader' FAILED!
然後就掛了。
使用另一個 sd slot 開機後燒錄 eMMC 才會 OK。
以下是 cat /sys/devices/platform/mxsdhc.2/mmc_host/mmc0\:001/boot_info 的內容:
fail 的機器:
boot_info:0x07;
ALT_BOOT_MODE:1 - Supports alternate boot method
DDR_BOOT_MODE:1 - Supports alternate dual data rate during boot
HS_BOOTMODE:1 - Supports high speed timing during boot
boot_size:2048KB
boot_partition:0x48;
BOOT_ACK:1 - Boot acknowledge sent during boot operation
BOOT_PARTITION-ENABLE: 1 - Boot partition 1 enabled
PARTITION_ACCESS:0 - No access to boot partition
boot_bus:0x12
BOOT_MODE:2 - Use dual data rate in boot operation
RESET_BOOT_BUS_WIDTH:0 - Reset bus width to x1, single data rate and backwardcompatible timings after boot operation
BOOT_BUS_WIDTH:2 - x8 (sdr/ddr) bus width in boot operation mode
OK 的機器:
boot_info:0x07;
ALT_BOOT_MODE:1 - Supports alternate boot method
DDR_BOOT_MODE:1 - Supports alternate dual data rate during boot
HS_BOOTMODE:1 - Supports high speed timing during boot
boot_size:2048KB
boot_partition:0x00;
BOOT_ACK:0 - No boot acknowledge sent
BOOT_PARTITION-ENABLE: 0 - Device not boot enabled
PARTITION_ACCESS:0 - No access to boot partition
boot_bus:0x00
BOOT_MODE:0 - Use single data rate + backward compatible timings in boot operation
RESET_BOOT_BUS_WIDTH:0 - Reset bus width to x1, single data rate and backwardcompatible timings after boot operation
BOOT_BUS_WIDTH:0 - x1 (sdr) or x4 (ddr) bus width in boot operation mode
所以 fail 的機器好像 boot partition 被 enable 了 --
因為 BOOT_ACK 被trigger。
這個在 imx53 上是 boot mode pin,由 gpio 決定的。
所以使用 eMMC 開機時,mmc host 依照 boot mode送出了 boot_ack,
所以 eMMC 的 boot partition 被 enable 了,並且是 write protected。
使用另一格 sd 開機, emmc 得 host 由 software config,所以沒有 enable boot_ack,所以沒有 write protected。
OK 的機器, boot ack pin 是正確的,所以 boot partition 是 disable。
實際上 boot partition 的功能可以用 MMC command 來改變,
就是利用 ext_csd 來改變 boot parition 的功能/狀態。
這一篇
Re: Patch: eMMC boot partition needs to be deactivated for linux to find user partitions 就是作這樣的事:
在 linux kernel mmc driver 啟動時,把 boot partition 功能關閉。
在 driver/mmc/core/mmc.c 的 mmc_init_card( ) 加上:
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index db54b2d..709be9f 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -826,6 +826,20 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
}
}
+ /* ensure eMMC private booting PARTITION is not enabled
+ */
+ if (card->ext_csd.boot_config != 0) {
+ printk(KERN_WARNING "%s: disable boot partition\n",
+ mmc_hostname(card->host));
+ err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
+ EXT_CSD_BOOT_CONFIG,0x0);
+ if (err) {
+ printk(KERN_WARNING "%s: disable boot partition failed\n",
+ mmc_hostname(card->host));
+ err=0;
+ }
+ }
+
/*
* Compute bus speed.
*/
這樣 kernel 起來後,eMMC 就都一定可以 write 了。
只剩下 uboot,,, fastboot 一樣無法燒錄 bootloader 和 kernel...
看 uboot code,是在 write 完後,switch partition 時, failed。
但是不使用 boot partition 時,根本就沒有 partition。
所以直接把 uboot 的
diff --git a/include/configs/mx53_smd_android.h b/include/configs/mx53_smd_android.h
index 553a920..28c214a 100755
--- a/include/configs/mx53_smd_android.h
+++ b/include/configs/mx53_smd_android.h
@@ -263,7 +263,7 @@
/* detect whether ESDHC1 or ESDHC3 is boot device */
#define CONFIG_DYNAMIC_MMC_DEVNO
- #define CONFIG_BOOT_PARTITION_ACCESS
+ #undef CONFIG_BOOT_PARTITION_ACCESS
#define CONFIG_EMMC_DDR_MODE
#define CONFIG_EMMC_DDR_PORT_DETECT
/* port 1 (ESDHC3) is 8 bit */