このドキュメントの目的は、MX6 Android R13.4.1に基づくPORリブートイベントのリカバリモードをサポートする方法を紹介することです。
Android R13.4.1をMX6 SabreSDボードで起動した場合、再起動の理由はWatchdogです。ただし、再起動の理由がウォッチドッグからPORに変更された場合、工場出荷時のリセット後にリカバリモードに入るのに失敗します。
R13.4.1 では、SRC_GPR10 のビット 8 がリカバリ モードの永続ビットとして使用されます。このビットは、U-boot がこのビットを使用してどのモードに入るべきかを区別できるように、再起動後も保持されることが期待されます。ただし、すべての SRC レジスタは、i.MX6DQRM セクション 59.4.1.2.3 IPP_RESET_B (POR) に従って POR シーケンスでリセットされます。したがって、再起動の理由が POR の場合、ソフトウェアが再起動前に設定した場合でも、リカバリ モードの永続ビットはクリアされます。これにより、ブートローダーは再起動後にリカバリモードに入らなくなります。
i.MX6DQRMによると、SNVS_LP汎用レジスタは32ビットのリードライトレジスタを提供し、パワーダウンモード中に32ビットデータを保持するために任意のアプリケーションで使用できます。したがって、POR イベントのリカバリ モードをサポートするために、SNVS_LP レジスタを使用してリカバリ モードの永続ビットを格納できます。適用するには、以下の変更が必要です(patches.tar.gz参照)
差分 --git a/cpu/arm_cortexa8/mx6/generic.cb/cpu/arm_cortexa8/mx6/generic.c
インデックス257c930..BD47130 100644
--- a/cpu/arm_cortexa8/mx6/generic.c
+++ b/cpu/arm_cortexa8/mx6/generic.c
@@ -1146,14 +1146,14 @@ int check_and_clean_recovery_flag(ボイド)
{
int flag_set = 0;
u32 reg;
- reg = readl(SRC_BASE_ADDR + SRC_GPR10);
+ reg = readl(SNVS_BASE_ADDR + SNVS_LPGPR);
flag_set=!!(reg & ANDROID_RECOVERY_BOOT);
/* ここで無限にループする場合に備えて清掃してください.... */
if(flag_set){
reg &= ~ANDROID_RECOVERY_BOOT;
- writel(reg, SRC_BASE_ADDR + SRC_GPR10);
+ writel(reg, SNVS_BASE_ADDR + SNVS_LPGPR);
}
flag_setを返します。
@@ -1168,14 +1168,15 @@ int fastboot_check_and_clean_flag(無効)
{
int flag_set = 0;
u32 reg;
- reg = readl(SRC_BASE_ADDR + SRC_GPR10);
+
+ reg = readl(SNVS_BASE_ADDR + SNVS_LPGPR);
flag_set = !!(reg & ANDROID_FASTBOOT_BOOT);
/* ここで無限にループする場合に備えて清掃してください.... */
if(flag_set){
reg &= ~ANDROID_FASTBOOT_BOOT;
- writel(reg, SRC_BASE_ADDR + SRC_GPR10);
+ writel(reg, SNVS_BASE_ADDR + SNVS_LPGPR);
}
flag_setを返します。
差分 --git a/include/asm-arm/arch-mx6/mx6.hb/include/asm-arm/arch-mx6/mx6.h
index efb90c2..45381e2 100644
--- a/include/asm-arm/arch-mx6/mx6.h
+++ b/include/asm-arm/arch-mx6/mx6.h
@@ -732,6 +732,8 @@
#define SRC_GPR9 0x40
#define SRC_GPR10 0x44
+#define SNVS_LPGPR 0x68
+
/* ボードIDを取得 */
#define board_is_rev(system_rev, rev) (((system_rev & 0x0F00) == rev) ? 1 : 0)
#define chip_is_type(system_rev、rev)\
差分 --git a/arch/arm/mach-mx6/system.cb/アーチ/arm/mach-MX6/system.c
インデックス6d24f22..61649c5 100644
--- a/arch/arm/mach-MX6/system.c
+++ b/arch/arm/mach-MX6/system.c
@@ -563,7 +563,7 @@ void mxc_clear_mfgmode(void)
#endif
#ifdef CONFIG_MXC_REBOOT_ANDROID_CMD
-/* この機能は、入力するSRC_GPR10[7-8]ビットにビットを設定します
+/* この機能は、入力するSNVS_LPGPR[7-8]ビットにビットを設定します
*特別なブートモード。これらのビットはウォッチドッグリセットではクリアされないため、
* ブートローダーで確認して、別のモードに入ることを選択できます。
@@ -574,18 +574,18 @@ ボイド do_switch_recovery(ボイド)
{
u32 reg;
- reg = __raw_readl(SRC_BASE_ADDR + SRC_GPR10);
+ reg = __raw_readl(MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR);
reg |= ANDROID_RECOVERY_BOOT;
- __raw_writel(reg、SRC_BASE_ADDR + SRC_GPR10);
+ __raw_writel(reg, MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR);
}
ボイドdo_switch_fastboot(ボイド)
{
u32 reg;
- reg = __raw_readl(SRC_BASE_ADDR + SRC_GPR10);
+ reg = __raw_readl(MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR);
reg |= ANDROID_FASTBOOT_BOOT;
- __raw_writel(reg、SRC_BASE_ADDR + SRC_GPR10);
+ __raw_writel(reg, MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR);
}
#endif
差分 --git a/arch/arm/plat-mxc/include/mach/mx6.hb /アーチ/アーム/プラット-mxc /インクルード/マッハ/mx6.h
index 48b04b1..bb22de0 100644
--- a/arch/arm/plat-mxc/include/mach/mx6.h
+++ b/arch/arm/plat-mxc/include/mach/mx6.h
@@ -302,6 +302,8 @@
#define SRC_GPR9 0x40
#define SRC_GPR10 0x44
+#define SNVS_LPGPR 0x68
+
/* GPCオフセット */
#define MXC_GPC_CNTR_OFFSET 0x0