(trunc 2045-2046のマージ)CODEC用のSPI排他制御処理を追加。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/branches/20080724_SDK500rc_branch@2053 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
kamikawa 2008-07-31 11:21:11 +00:00
parent 32b51b6971
commit ed5066b6f3
4 changed files with 38 additions and 55 deletions

View File

@ -99,7 +99,7 @@ static void VBlankIntr(void);
static void InitializeFatfs(void); static void InitializeFatfs(void);
static void InitializeNwm(OSArenaId drvArenaId, OSHeapHandle drvHeapHandle, static void InitializeNwm(OSArenaId drvArenaId, OSHeapHandle drvHeapHandle,
OSArenaId wpaArenaId, OSHeapHandle wpaHeapHandle); OSArenaId wpaArenaId, OSHeapHandle wpaHeapHandle);
static void InitializeCdc(void); static void InitializeCdc(u32 lockId);
static void AdjustVolume(void); static void AdjustVolume(void);
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -123,6 +123,7 @@ void
TwlSpMain(void) TwlSpMain(void)
{ {
OSHeapHandle wramHeapHandle, mainHeapHandle; OSHeapHandle wramHeapHandle, mainHeapHandle;
u32 spiLockId;
// SYSMワークのクリア // SYSMワークのクリア
MI_CpuClear32( SYSMi_GetWork(), sizeof(SYSM_work) ); MI_CpuClear32( SYSMi_GetWork(), sizeof(SYSM_work) );
@ -219,13 +220,20 @@ TwlSpMain(void)
AdjustVolume(); AdjustVolume();
} }
// CODECアクセス用のSPIロックIDを取得するランチャーのみ 2008/07/31)
spiLockId = (u32)OS_GetLockID();
if (spiLockId == OS_LOCK_ID_ERROR)
{
OS_Warning("OS_GetLockID failed.\n");
}
if (OSi_IsCodecTwlMode() == TRUE) if (OSi_IsCodecTwlMode() == TRUE)
{ {
// CODEC 初期化 // CODEC 初期化
// ランチャーのみCDC_InitForFirstBootで実際にCODECの初期化を行う。 // ランチャーのみCDC_InitForFirstBootで実際にCODECの初期化を行う。
// アプリ起動時にはCODECは既に初期化されているためmongooseなどでは // アプリ起動時にはCODECは既に初期化されているためmongooseなどでは
// 簡易的な初期化CDC_InitLibで良い。 2008/07/14 // 簡易的な初期化CDC_InitLibで良い。 2008/07/14
InitializeCdc(); InitializeCdc(spiLockId);
// カメラ初期化 // カメラ初期化
CAMERA_Init(); CAMERA_Init();
@ -279,7 +287,9 @@ TwlSpMain(void)
HOTSW_Init(THREAD_PRIO_HOTSW); HOTSW_Init(THREAD_PRIO_HOTSW);
// 外部デポップ回路を無効にします。(ランチャーのみ 2008/07/14 // 外部デポップ回路を無効にします。(ランチャーのみ 2008/07/14
SPI_Lock(spiLockId);
CDC_DisableExternalDepop(); CDC_DisableExternalDepop();
SPI_Unlock(spiLockId);
while (TRUE) while (TRUE)
{ {
@ -465,7 +475,7 @@ InitializeNwm(OSArenaId drvArenaId, OSHeapHandle drvHeapHandle,
Returns: None. Returns: None.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static void static void
InitializeCdc(void) InitializeCdc(u32 lockId)
{ {
OSThread thread; OSThread thread;
u32 stack[18]; u32 stack[18];
@ -475,7 +485,9 @@ InitializeCdc(void)
(void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX); (void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX);
OS_WakeupThreadDirect(&thread); OS_WakeupThreadDirect(&thread);
CDC_InitForFirstBoot(); // ※ランチャー特殊処理。 SPI_Lock(lockId); // CODEC用SPI排他ロック
CDC_InitForFirstBoot(); // ※ランチャー特殊処理。
SPI_Unlock(lockId); // CODEC用SPI排他ロック
// ダミースレッド破棄 // ダミースレッド破棄
OS_KillThread(&thread, NULL); OS_KillThread(&thread, NULL);

View File

@ -28,6 +28,8 @@
#include "reboot.h" #include "reboot.h"
#include "internal_api.h" #include "internal_api.h"
extern void SPI_Lock(u32 id);
extern void SPI_Unlock(u32 id);
// define data------------------------------------------------------- // define data-------------------------------------------------------
#define MAINP_SEND_IF 0x2000 #define MAINP_SEND_IF 0x2000
@ -141,6 +143,7 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget*
ROM_Header *th = (void*)REBOOTi_GetTwlRomHeaderAddr(); ROM_Header *th = (void*)REBOOTi_GetTwlRomHeaderAddr();
ROM_Header *dh = (void*)REBOOTi_GetRomHeaderAddr(); ROM_Header *dh = (void*)REBOOTi_GetRomHeaderAddr();
BOOL isNtrMode; BOOL isNtrMode;
u32 spiLockId;
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。 (void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。 (void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
@ -304,6 +307,13 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget*
// I2S停止MCLKは動作継続 // I2S停止MCLKは動作継続
reg_SND_SMX_CNT &= ~REG_SND_SMX_CNT_E_MASK; reg_SND_SMX_CNT &= ~REG_SND_SMX_CNT_E_MASK;
spiLockId = (u32)OS_GetLockID();
if (spiLockId == OS_LOCK_ID_ERROR)
{
OS_Warning("%s: OS_GetLockID failed.\n", __FUNCTION__);
}
SPI_Lock(spiLockId); // CODEC用SPI排他ロック
// CODEC再初期化 // CODEC再初期化
CDC_Init(); CDC_Init();
@ -318,6 +328,8 @@ static void BOOTi_RebootCallback( void** entryp, void* mem_list_v, REBOOTTarget*
CDC_GoDsMode(); CDC_GoDsMode();
} }
SPI_Unlock(spiLockId); // CODEC用SPI排他ロック
// I2S再開 // I2S再開
// DSサウンドDSP = 8:0 // DSサウンドDSP = 8:0
// 32KHz // 32KHz

View File

@ -294,24 +294,23 @@ InitializeCdc(void)
{ {
OSThread thread; OSThread thread;
u32 stack[18]; u32 stack[18];
/* u32 spiLockId;
// ランチャー経由で起動した場合はCODECは既に初期化されているため
// コンポーネントがCODECを初期化する必要はありません。 spiLockId = (u32)OS_GetLockID();
// 将来的にはバッサリと切る必要がありますが、 if (spiLockId == OS_LOCK_ID_ERROR)
// 暫定的にI2Sが有効かどうかでCODECが初期化済みかどうかを判定します。
if (reg_SND_SMX_CNT & REG_SND_SMX_CNT_E_MASK)
{ {
return; OS_Warning("OS_GetLockID failed.\n");
} }
*/
/* ダミースレッド作成 */ /* ダミースレッド作成 */
OS_CreateThread(&thread, DummyThread, NULL, OS_CreateThread(&thread, DummyThread, NULL,
(void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX); (void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX);
OS_WakeupThreadDirect(&thread); OS_WakeupThreadDirect(&thread);
/* CODEC 初期化 */ /* CODEC 初期化 */
SPI_Lock(spiLockId);
CDC_Init(); CDC_Init();
CDC_InitMic(); SPI_Unlock(spiLockId);
/* ダミースレッド破棄 */ /* ダミースレッド破棄 */
OS_KillThread(&thread, NULL); OS_KillThread(&thread, NULL);

View File

@ -73,7 +73,6 @@
static void PrintDebugInfo(void); static void PrintDebugInfo(void);
static OSHeapHandle InitializeAllocateSystem(void); static OSHeapHandle InitializeAllocateSystem(void);
static void InitializeFatfs(void); static void InitializeFatfs(void);
static void InitializeCdc(void);
static void DummyThread(void* arg); static void DummyThread(void* arg);
static void ReadUserInfo(void); static void ReadUserInfo(void);
@ -125,12 +124,8 @@ TwlSpMain(void)
InitializeFatfs(); // FAT-FS InitializeFatfs(); // FAT-FS
// InitializeNwm(heapHandle); // TWL 無線 // InitializeNwm(heapHandle); // TWL 無線
MCU_InitIrq(THREAD_PRIO_MCU); // マイコン MCU_InitIrq(THREAD_PRIO_MCU); // マイコン
CDC_InitLib(); // CODECライブラリ初期化
if (OSi_IsCodecTwlMode() == TRUE) CAMERA_Init(); // カメラ
{
InitializeCdc(); // CODEC
CAMERA_Init(); // カメラ
}
SND_Init(THREAD_PRIO_SND); // サウンド SND_Init(THREAD_PRIO_SND); // サウンド
SNDEX_Init(THREAD_PRIO_SNDEX); // サウンド拡張 SNDEX_Init(THREAD_PRIO_SNDEX); // サウンド拡張
@ -249,41 +244,6 @@ InitializeFatfs(void)
OS_KillThread(&thread, NULL); OS_KillThread(&thread, NULL);
} }
/*---------------------------------------------------------------------------*
Name: InitializeCdc
Description: CDCライブラリを初期化するCDC初期化関数内でスレッド休止する
Arguments: None.
Returns: None.
*---------------------------------------------------------------------------*/
static void
InitializeCdc(void)
{
OSThread thread;
u32 stack[18];
/*
// ランチャー経由で起動した場合はCODECは既に初期化されているため
// コンポーネントがCODECを初期化する必要はありません。
// 将来的にはバッサリと切る必要がありますが、
// 暫定的にI2Sが有効かどうかでCODECが初期化済みかどうかを判定します。
if (reg_SND_SMX_CNT & REG_SND_SMX_CNT_E_MASK)
{
return;
}
*/
/* ダミースレッド作成 */
OS_CreateThread(&thread, DummyThread, NULL,
(void*)((u32)stack + (sizeof(u32) * 18)), sizeof(u32) * 18, OS_THREAD_PRIORITY_MAX);
OS_WakeupThreadDirect(&thread);
/* CODEC 初期化 */
CDC_Init();
CDC_InitMic();
/* ダミースレッド破棄 */
OS_KillThread(&thread, NULL);
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: DummyThread Name: DummyThread
Description: FATFSライブラリCDCライブラリを初期化する際に立てるダミーの Description: FATFSライブラリCDCライブラリを初期化する際に立てるダミーの