製品技術部のリクエストに対応。

・NandInitializer と同じプログラムで基板検査も実施するためにカメラやサウンドなどこれまで削っていたライブラリをリンクするようにしました。
 マイコンをアドレス指定でアクセスできる関数を追加しました。CODECのモードをDSモードへと遷移させる関数をARM9側に用意しました。
 (同一プログラムでCODEC-TWLモードとCODEC-DSモードの両方をテストするため)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1076 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
kamikawa 2008-04-08 01:05:13 +00:00
parent 6265e414db
commit 95645a3dba
9 changed files with 159 additions and 155 deletions

View File

@ -74,7 +74,7 @@ Ltdautoload SCRWRAM
Library libathdrv_sp$(LIBSUFFIX).a
Library libfs_sp$(LIBSUFFIX).a
Library libcard_sp$(LIBSUFFIX).a
# Library libcamera_sp$(LIBSUFFIX).a
Library libcamera_sp$(LIBSUFFIX).a
Object * (.wram)
Object * (.ltdwram)

View File

@ -56,7 +56,7 @@ LINCLUDES = $(ROOT)/build/libraries/spi/ARM7/include ../common/include
LLIBRARIES += libwl_sp$(TWL_LIBSUFFIX).a \
libsdio_sp$(TWL_LIBSUFFIX).a \
libathdrv_sp$(TWL_LIBSUFFIX).a \
libwpa_sp$(TWL_LIBSUFFIX).a \
libwpa_sp$(TWL_LIBSUFFIX).a
LDEPENDS_NEF = $(TWL_LIBS) $(LLIBRARIES)

View File

@ -77,7 +77,7 @@ Ltdautoload SCRWRAM
Library libathdrv_sp$(LIBSUFFIX).a
Library libfs_sp$(LIBSUFFIX).a
Library libcard_sp$(LIBSUFFIX).a
# Library libcamera_sp$(LIBSUFFIX).a
Library libcamera_sp$(LIBSUFFIX).a
Object * (.wram)
Object * (.ltdwram)

View File

@ -16,14 +16,14 @@
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <twl/exi/ARM7/genPort2.h>
#include <twl/exi/ARM7/genPort2.h>
#include "kami_pxi.h"
#include "fifo.h"
#include "twl/cdc.h"
#include "formatter.h"
#include "nvram.h"
#include "nvram.h"
#include <twl/ltdmain_begin.h>
#include <twl/mcu.h>
//#include <c:/TWL_SDK/build/libraries/fatfs/ARM7.TWL/include/twl/rtfs.h>
//#include <c:/TWL_SDK/build/libraries/fatfs/ARM7.TWL/include/twl/devices/sdmc/ARM7/sdmc.h>
@ -126,12 +126,11 @@ static void KamiPxiCallback(PXIFifoTag tag, u32 data, BOOL err)
{
switch (kamiWork.command)
{
case CODEC_READ_REGISTER:
case CODEC_WRITE_REGISTER:
case GPIO333_WRITE:
case EXE_FORMAT:
case KAMI_EXE_FORMAT:
case KAMI_NAND_IO:
case KAMI_NVRAM_IO:
case KAMI_MCU_IO:
case KAMI_CDC_GO_DSMODE:
if (!OS_SendMessage(&kamiWork.msgQ, NULL, OS_MESSAGE_NOBLOCK))
{
KamiReturnResult(kamiWork.command, KAMI_PXI_RESULT_FATAL_ERROR);
@ -185,8 +184,7 @@ static void KamiThread(void *arg)
(void)OS_ReceiveMessage(&kamiWork.msgQ, &msg, OS_MESSAGE_BLOCK);
switch (kamiWork.command)
{
////////////////////////////////////////////////////////
case EXE_FORMAT:
case KAMI_EXE_FORMAT:
{
result = ExeFormat((FormatMode)kamiWork.data[0]); // Quick or Full
if (result)
@ -248,7 +246,36 @@ static void KamiThread(void *arg)
}
break;
////////////////////////////////////////////////////////
case KAMI_MCU_IO:
{
BOOL is_read;
u32 reg_no;
void* buffer;
u32 value;
is_read = (BOOL)kamiWork.data[0];
KAMI_UNPACK_U32(&reg_no, &kamiWork.data[1]);
KAMI_UNPACK_U32((u32 *)(&buffer), &kamiWork.data[5]);
KAMI_UNPACK_U32(&value, &kamiWork.data[9]);
if (is_read)
{
*(u8 *)buffer = MCU_ReadRegister( (u8)reg_no );
}
else
{
MCU_WriteRegister( (u8)reg_no, (u8)value );
}
KamiReturnResult(kamiWork.command, KAMI_PXI_RESULT_SUCCESS);
}
break;
case KAMI_CDC_GO_DSMODE:
{
CDC_GoDsMode();
KamiReturnResult(kamiWork.command, KAMI_PXI_RESULT_SUCCESS);
}
break;
default:
KamiReturnResult(kamiWork.command, KAMI_PXI_RESULT_INVALID_COMMAND);

View File

@ -25,6 +25,7 @@
#include <twl/sea.h>
#include <twl/fatfs.h>
#include <twl/nwm.h>
#include <twl/camera.h>
#include <twl/mcu.h>
#include <twl/cdc.h>
#include <nitro/snd.h>
@ -111,13 +112,12 @@ TwlSpMain(void)
(void)GX_VBlankIntr(TRUE);
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
///////////////////////////////
// 強制AESモード
AttachAES();
// フォーマットを行うためにFATFS_Initの前にHW_SD_NAND_CONTEXT_BUFのクリアが必要
MI_CpuClear8((void *)HW_SD_NAND_CONTEXT_BUF, HW_SD_NAND_CONTEXT_BUF_END - HW_SD_NAND_CONTEXT_BUF);
///////////////////////////////
/* 各ライブラリ初期化 */
AES_Init(); // AES
SEA_Init(); // SEA
@ -126,13 +126,15 @@ TwlSpMain(void)
InitializeFatfs(); // FAT-FS
// InitializeNwm(heapHandle); // TWL 無線
MCU_InitIrq(THREAD_PRIO_MCU); // マイコン
if (OSi_IsCodecTwlMode() == TRUE)
{
InitializeCdc(); // CODEC
// CAMERA_Init(); // カメラ
CAMERA_Init(); // カメラ
}
// SND_Init(THREAD_PRIO_SND); // サウンド
// SNDEX_Init(THREAD_PRIO_SNDEX); // サウンド拡張
SND_Init(THREAD_PRIO_SND); // サウンド
SNDEX_Init(THREAD_PRIO_SNDEX); // サウンド拡張
RTC_Init(THREAD_PRIO_RTC); // RTC
// WVR_Begin(heapHandle); // NITRO 無線
SPI_Init(THREAD_PRIO_SPI);

View File

@ -58,13 +58,15 @@ typedef void (*KAMICallback)(KAMIResult result, void *arg);
void KamiPxiInit( void );
KAMIResult CDC_ReadRegister(u8 page, u8 reg_no, u8* pData);
KAMIResult CDC_WriteRegister(u8 page, u8 reg_no, u8 value);
KAMIResult GPIO333_Write(BOOL value);
KAMIResult ExeFormatAsync(FormatMode format_mode, KAMICallback callback);
KAMIResult kamiNandIo(u32 block, void* buffer, u32 count, BOOL is_read);
KAMIResult kamiNvramIo(u32 address, void* buffer, u32 size, BOOL is_read);
KAMIResult kamiMcuIo(u32 reg_no, void* buffer, u32 value, BOOL is_read);
KAMIResult kamiCDC_GoDsMode( void );
// (重要)
// ARM7が読み書きするためリード後はInvalidate、ライト前はフラッシュしてください。
//
static KAMIResult kamiNandRead(u32 block, void* buffer, u32 count)
{
return kamiNandIo(block, buffer, count, TRUE);
@ -81,8 +83,14 @@ static KAMIResult kamiNvramWrite(u32 adress, void* buffer, u32 size)
{
return kamiNvramIo(adress, buffer, size, FALSE);
}
static KAMIResult kamiMcuRead(u8 reg_no, void* buffer)
{
return kamiMcuIo((u32)reg_no, buffer, 0, TRUE);
}
static KAMIResult kamiMcuWrite(u8 reg_no, u8 value)
{
return kamiMcuIo((u32)reg_no, NULL, (u32)value, FALSE);
}
/*===========================================================================*/

View File

@ -77,12 +77,14 @@ void KamiPxiInit( void )
{
}
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_KAMITEST, KamiPxiCallback);
if ( 0 > PXI_SendWordByFifo(PXI_FIFO_TAG_KAMITEST, 0, 0))
if ( 0 > PXI_SendWordByFifo(PXI_FIFO_TAG_KAMITEST, KAMITEST_PXI_START_BIT | (KAMI_TEST_COMMAND << KAMITEST_PXI_COMMAND_SHIFT), 0))
{
return;
}
}
///////////////////////////////////////////////////////////////////
//typedef void (*KAMICallback)(KAMIResult result, void *arg);
@ -94,127 +96,6 @@ void CDC_ReadCallback(KAMIResult result, void* arg)
}
*/
/*---------------------------------------------------------------------------*
Name: CODEC
Description:
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult CDC_ReadRegister(u8 page, u8 reg_no, u8* pData)
{
OSIntrMode enabled;
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = (u8*)pData;
if (KamiSendPxiCommand(CODEC_READ_REGISTER, 2, page))
{
KamiSendPxiData(&reg_no);
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: CODEC
Description:
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult CDC_WriteRegister(u8 page, u8 reg_no, u8 value)
{
OSIntrMode enabled;
u8 data[2];
int i;
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = 0;
// データ作成
data[0] = reg_no;
data[1] = value;
if (KamiSendPxiCommand(CODEC_WRITE_REGISTER, 3, page))
{
for (i = 0; i < 2; i++)
{
KamiSendPxiData(&data[i]);
}
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: GPIO333
Description:
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult GPIO333_Write(BOOL value)
{
OSIntrMode enabled;
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = 0;
if (KamiSendPxiCommand(GPIO333_WRITE, 1, (u8)value))
{
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: ƒtƒH<EFBFBD>[ƒ}ƒbƒgŽÀ<EFBFBD>sŠÖ<EFBFBD>
@ -243,7 +124,7 @@ KAMIResult ExeFormatAsync(FormatMode format_mode, KAMICallback callback)
kamiWork.arg = 0;
kamiWork.data = 0;
if (KamiSendPxiCommand(EXE_FORMAT, 1, format_mode) == FALSE)
if (KamiSendPxiCommand(KAMI_EXE_FORMAT, 1, format_mode) == FALSE)
{
return KAMI_RESULT_SEND_ERROR;
}
@ -306,6 +187,7 @@ KAMIResult kamiNandIo(u32 block, void* buffer, u32 count, BOOL is_read)
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiNvramIo(u32 address, void* buffer, u32 size, BOOL is_read)
{
OSIntrMode enabled;
@ -342,10 +224,95 @@ KAMIResult kamiNvramIo(u32 address, void* buffer, u32 size, BOOL is_read)
}
return KAMI_RESULT_SEND_ERROR;
}
///////////////////////////////////////////////////////////////////
/////////
/*---------------------------------------------------------------------------*
Name: MCUアクセス関数
Description:
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiMcuIo(u32 reg_no, void* buffer, u32 value, BOOL is_read)
{
OSIntrMode enabled;
u8 data[12];
int i;
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = 0;
// データ作成
KAMI_PACK_U32(&data[0], &reg_no);
KAMI_PACK_U32(&data[4], &buffer);
KAMI_PACK_U32(&data[8], &value);
if (KamiSendPxiCommand(KAMI_MCU_IO, 12, (u8)is_read))
{
for (i = 0; i < 12; i+=3)
{
KamiSendPxiData(&data[i]);
}
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
Name: kamiCDC_GoDsMode
Description: CODECをDSモードへ遷移させる関数
Arguments: None.
Returns:
*---------------------------------------------------------------------------*/
KAMIResult kamiCDC_GoDsMode( void )
{
OSIntrMode enabled;
// ロック
enabled = OS_DisableInterrupts();
if (kamiWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return KAMI_RESULT_BUSY;
}
kamiWork.lock = TRUE;
(void)OS_RestoreInterrupts(enabled);
kamiWork.callback = NULL;
kamiWork.arg = 0;
kamiWork.data = 0;
if (KamiSendPxiCommand(KAMI_CDC_GO_DSMODE, 0, (u8)0))
{
KamiWaitBusy();
return (KAMIResult)kamiWork.result;
}
return KAMI_RESULT_SEND_ERROR;
}
/*---------------------------------------------------------------------------*
PXI関連
*---------------------------------------------------------------------------*/
static BOOL KamiSendPxiCommand(KamiCommand command, u8 size, u8 data)
{
u32 pxiData = (u32)(KAMITEST_PXI_START_BIT |

View File

@ -71,7 +71,7 @@ TwlMain()
OS_InitReset();
GX_Init();
FX_Init();
// SND_Init();
SND_Init();
TP_Init();
RTC_Init();

View File

@ -59,12 +59,12 @@ KAMIPxiResult;
typedef enum KamiCommand
{
CODEC_READ_REGISTER,
CODEC_WRITE_REGISTER,
GPIO333_WRITE,
EXE_FORMAT,
KAMI_TEST_COMMAND,
KAMI_EXE_FORMAT,
KAMI_NAND_IO,
KAMI_NVRAM_IO
KAMI_NVRAM_IO,
KAMI_MCU_IO,
KAMI_CDC_GO_DSMODE
}
KamiCommand;