こんにちは、
MC_ME などの一部のモジュールでは、図 1 に示すようにレジスタ保護を設定できますが、CMU_0 などの他のモジュールではこの機能を使用できず、図 2 に示すようにソフト ロック ビットが存在しません。
もう一つの質問は、保護レジスタリストで、なぜ異なるモジュールが同じベースアドレスを持つのかということです。図3に示すように、CMU0 と CMU1 のベース アドレスは同じ 0xFBFB0200 ですが、これは正しいですか?
2021-04-13_151624.png
2021-04-13_151502.png
2021-04-13_152957.png
こんにちは、ピーターさん。
これらは、MPC5746C のレジスタ保護の下でロック メカニズムを実装しているモジュールです。 -
0xFFFB0140, /* CMU------------*/
0xFFFB0040, /* FXOSC----------*/
0xFFFB0180, /* MC_CGM --------*/
0xFFFB8000, /* MC_ME ---------*/
0xFFFA8000, /* MC_RGM --------*/
0xFFF50000, /* MEMU_0 -------*/
0xFFFB0080, /* PLLDIG --------*/
0xFFFA0400, /* PMCDIG --------*/
0xFFFC0000, /* SIUL2 ---------*/
0xFFFB0100, /* SXOSC ---------*/
0xFFF9C000 /* LPU_CTL -------*/
私が直面しているのは、アクセスしようとすると一部のモジュールの GCR と SLB ビットがバス エラーをスローすることです。同様に、ソフト/ハード ロックが機能しているモジュールでは、いくつかのレジスタ セットで同じ問題がCAN発生します。スクリーンショットのサンプルを 2 つ添付します。最初のものは動作しており、すべてのレジスタ/ミラー/SLB および GCR アドレスが有効になっていることがわかりますが、2 番目のCASEでは SLB と GCR を使用しようとするとエラーが発生します。
この異なる動作の理由は何でしょうか?ご希望であれば、レジスタ/ミラー/SLB および GCR アドレスの手動計算結果を添付CANます。
こんにちは、ピーター。
表2-77のCMUの「オフセット」の値を0x200、0x208、0x20Cなどに変更すると、より理解しやすくなると思います。でも今はとにかく理解できました。ありがとうございます。
2021-04-16_184156.png
よろしくお願いいたします。
ジャンバー
こんにちは、ピーター。
お返事ありがとうございます。今では、重要なポイントである NOTE の意味がわかっており、テストも行いましたが、うまく機能しています。
よろしくお願いいたします。
ジャンバー
こんにちは、
簡単にするために、レジスタ保護を構成するために使用できるマクロを次に示します。
/*PowerPC*/
/*-----------------------------------------------------------------------------------------------------------*/
#define REGPROTPPMIRROR 0x2000
#define REGPROTPPSLBR 0x3800
#define REGPROTPPGCR 0x3FFC
#define WRITE_WITH_LOCK_PP_8BIT(registeraddress, value)
#define WRITE_WITH_LOCK_PP_16BIT(registeraddress, value)
#define WRITE_WITH_LOCK_PP_32BIT(registeraddress, value)
#define GET_SOFTLOCK_PP(modulebaseaddress, registeraddress, value)
#define CLR_SOFTLOCK_PP_32BIT(modulebaseaddress, registeraddress)
#define CLR_SOFTLOCK_PP_16BIT(modulebaseaddress, registeraddress)
#define CLR_SOFTLOCK_PP_8BIT(modulebaseaddress, registeraddress)
#define SET_SOFTLOCK_PP_32BIT(modulebaseaddress, registeraddress)
#define SET_SOFTLOCK_PP_16BIT(modulebaseaddress, registeraddress)
#define SET_SOFTLOCK_PP_8BIT(modulebaseaddress, registeraddress)
#define SET_HARDLOCK_PP(modulebaseaddress)
#define USER_ACCESS_FORBIDDEN_PP(modulebaseaddress)
#define USER_ACCESS_ALLOWED_PP(modulebaseaddress)
ユースケースの例:
//16k - 32 bit,CAN1
CAN_6.MCR.B.MDIS = 0x0;
WRITE_WITH_LOCK_16K_32BIT((&CAN_6.MCR.R), 0xD890000F);
GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik);
CAN_6.MCR.B.MDIS = 0x0;
CLR_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R);
GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik);
CAN_6.MCR.B.MDIS = 0x0;
SET_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R);
GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik);
//SET_HARDLOCK_16k(&CAN_6);
CLR_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R);
GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik);
CAN_6.MCR.B.MDIS = 0x1;
USER_ACCESS_FORBIDDEN_16k(&CAN_6);
GET_GCR_16K(&CAN_6,&GCRvalue);
CAN_6.MCR.B.MDIS = 0x0;
USER_ACCESS_ALLOWED_16k(&CAN_6);
GET_GCR_16K(&CAN_6,&GCRvalue);
CAN_6.MCR.B.MDIS = 0x0;
SET_HARDLOCK_16k(&CAN_6);
GET_GCR_16K(&CAN_6,&GCRvalue);
こんにちは、
メモは正しいです。
すべての CMU のベース アドレスは0xFBFB_0000です。
ベース アドレスが 0xFBFB0000 の場合、SoftLock ビットは 0xFBFB0000+0x3800=0xFBFB3800 になるはずですが、下の図に示すように、このアドレスはまだアクセスできません。CMU のミラー アドレス、ソフトロック アドレス、ハードロック アドレスを計算する方法を教えてください。
あなたの計算は正しくありません。
レジスタのベース アドレスを取得する必要があります。0xFBFB_0200 は CMU モジュールに対してのみ有効で、他のペリフェラル の場合、ベースはモジュールのベース アドレスになります。
petervlna_1-1618563997092.png
petervlna_0-1618563954927.png
SO、CMU0_ CSR レジスタのソフト ロックの場合は、0xFBFB_2200 に書き込みます。
ロック レジスタは、CMU0_CSR のアドレス 0xFBFB_3880 に表示されます。
よろしくお願いいたします。
ピーター
うーん、奇妙ですね、
私はこれに気づいていませんでした。住所の計算方法を考えてみます。
ここでテストさせてください。できるだけ早くご連絡いたします。
よろしくお願いいたします。
ピーター
こんにちは、ピーター。
答えを見つけたと思うのですが、理解できません。スクリーンショットをありがとうございます。注記を確認したところ、「すべての CMU モジュールは、ベース アドレスが 16k - 0xFBFB_0000 に揃えられた同じ保護領域にあります」とありましたが、これはどういう意味ですか?
ベース アドレスが 0xFBFB0000 の場合、SoftLock ビットは 0xFBFB0000+0x3800=0xFBFB3800 になるはずですが、下の図に示すように、このアドレスはまだアクセスできません。CMU のミラー アドレス、ソフトロック アドレス、ハードロック アドレスを計算する方法を教えてください。
他のモジュールと違ってSO面白いです。
2021-04-15_164430.png
2021-04-15_164141.png
よろしくお願いいたします。
ジャンバー
こんにちは、ピーター。
ご返信よろしくお願いします。
「付録 A に記載されているレジスタのみがレジスタ保護によってロックできます。 」、私が混乱したのは、CMU0 モジュールが付録 A に記載されているにもかかわらず、その SoftLock ビットにアクセスできないことです。質問にスクリーンショットを投稿しました。
よろしくお願いいたします。
ジャンバー
こんにちは、
レジスタ保護によってロックできるのは、付録 A に記載されているレジスタのみです。
petervlna_0-1618472142468.png
SO、モジュール内のすべてのレジスタがこの機能をサポートしているわけではありません。通常、関連するのはセーフティのみです。
もう一つの質問は、保護レジスタリストで、なぜ異なるモジュールが同じベースアドレスを持つのかということです。図3に示すように、CMU0 と CMU1 のベース アドレスは同じ 0xFBFB0200 ですが、これは正しいですか?
そうですね、これはマニュアルのコピー&ペーストの誤字です。代わりにマニュアルの補足をご覧ください。
住所は次のとおりです:
#define CMU_0 (*(揮発性構造体 CMU_tag *) 0xFBFB0200UL)
#define CMU_1 (*(揮発性構造体 CMU_tag *) 0xFBFB0240UL)
#define CMU_2 (*(揮発性構造体 CMU_tag *) 0xFBFB0280UL)
#CMU_3 を定義 (*(揮発性構造体 CMU_tag *) 0xFBFB02C0UL)
#define CMU_4 (*(揮発性構造体 CMU_tag *) 0xFBFB0300UL)
petervlna_1-1618472584102.png
よろしくお願いいたします。
ピーター
誰か助けてくれませんか?
MC_ME、CMU、ADC、CTU、PWM をテストしましたが、CMU のみがソフトロックの設定に失敗し、他のモジュールは正常にソフトロックを設定できます。なぜ?