ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2013年4月16日 星期二

mmc 4.4, boot partition --- disable emmc boot partiton function in kernel & uboot

遇到的問題是:

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 */

沒有留言:

標籤

網誌存檔