TS-X2/X3バックライト輝度変更の動的切り替えのためのマイコンスレッド追加。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@664 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-02-15 00:31:07 +00:00
parent 1f3312d787
commit 7db4bae3db
18 changed files with 990 additions and 16 deletions

View File

@ -66,6 +66,7 @@ ifeq ($(CODEGEN_PROC),ARM9)
SYSMENU_LIBS ?= \
liblcfg$(TWL_LIBSUFFIX).a \
libsysmenu$(TWL_LIBSUFFIX).a \
libsysmmcu$(TWL_LIBSUFFIX).a \
libmbloader$(TWL_LIBSUFFIX).a \
libacsign$(TWL_LIBSUFFIX).a \
libboot$(TWL_LIBSUFFIX).a \
@ -74,9 +75,10 @@ else # ($(CODEGEN_PROC),ARM7)
SYSMENU_LIBS ?= \
libsysmenu_sp$(TWL_LIBSUFFIX).a \
libsysmmcu_sp$(TWL_LIBSUFFIX).a \
libmbloader_sp$(TWL_LIBSUFFIX).a \
libboot_sp$(TWL_LIBSUFFIX).a \
libhotsw_sp$(TWL_LIBSUFFIX).a
libhotsw_sp$(TWL_LIBSUFFIX).a \
endif

View File

@ -59,7 +59,8 @@ Autoload WRAM
libreboot_sp$(LIBSUFFIX).a \
libhotsw_sp$(LIBSUFFIX).a \
libreloc_info_sp$(LIBSUFFIX).a \
libsysmenu_sp$(LIBSUFFIX).a
libsysmenu_sp$(LIBSUFFIX).a \
libsysmmcu_sp$(LIBSUFFIX).a \
Library libsdio_sp$(LIBSUFFIX).a

View File

@ -36,6 +36,7 @@
#include <twl/mcu.h>
#include <twl/hw/common/mmap_wramEnv.h>
#include <sysmenu.h>
#include <sysmenu/mcu.h>
#include <firm/memorymap.h>
#include "nvram_sp.h"
#include "pm_pmic.h"
@ -50,6 +51,7 @@
/* Priorities of each threads */
#define THREAD_PRIO_SPI 2
#define THREAD_PRIO_MCU 4 // 暫定
#define THREAD_PRIO_SYSMMCU 6
#define THREAD_PRIO_SND 6
#define THREAD_PRIO_FATFS 8
#define THREAD_PRIO_RTC 12
@ -121,9 +123,6 @@ TwlSpMain(void)
OS_InitTick();
PrintDebugInfo();
// PXIコールバックの設定
SYSM_InitPXI();
// ランチャーパラメター取得Cold/Hotスタート判定含む
ReadLauncherParameter();
@ -158,6 +157,9 @@ TwlSpMain(void)
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
// PXIコールバックの設定
SYSM_InitPXI(THREAD_PRIO_SYSMMCU);
// ファイルシステム初期化
FS_Init(FS_DMA_NOT_USE);
FS_CreateReadServerThread(THREAD_PRIO_FS);

View File

@ -22,7 +22,7 @@ include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS_P = reloc_info sysmenu mb_loader acsign boot hotsw namut
SUBDIRS_P = reloc_info sysmenu mb_loader acsign boot hotsw namut mcu
#----------------------------------------------------------------------------

View File

@ -0,0 +1,52 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# Copyright 2008 Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
# Company Ltd., and are protected by Federal copyright law. They may
# not be disclosed to third parties or copied or duplicated in any form,
# in whole or in part, without the prior written consent of Nintendo.
#
# $Date:: #$
# $Rev: $
# $Author: $
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TWL_PROC = ARM7
#----------------------------------------------------------------------------
SRCDIR = ./src
INCDIR = ./include ../common/include
SRCS = mcu.c
TARGET_LIB = libsysmmcu_sp$(TWL_LIBSUFFIX).a
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
include $(TWLSDK_ROOT)/build/libraries/reboot/commondefs.reboot
INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)
#----------------------------------------------------------------------------
do-build: $(TARGETS)
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,261 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: mcu.c
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2008-01-25#$
$Rev: 3844 $
$Author: yutaka $
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu/mcu.h>
#include <twl/ltdwram_begin.h>
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
#define MCUTEST_MESSAGE_ARRAY_MAX 4 // スレッド同期用メッセージキューのサイズ
#define MCUTEST_THREAD_STACK_SIZE 512 // スレッドのスタックサイズ
#define MCUTEST_THREAD_PRIORITY 6
// アライメント調整してコピーする
#define MCU_UNPACK_U16(d, s) \
(*(d) = (u16)((((u8*)s)[0] << 0) | (((u8*)s)[1] << 8)))
#define MCU_UNPACK_U32(d, s) \
(*(d) = (u32)((((u8*)s)[0] << 0) | (((u8*)s)[1] << 8) | (((u8*)s)[2] << 16) | (((u8*)s)[3] << 24)))
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
typedef struct SYSMMcuWork
{
u32 total;
u32 current;
SYSMMcuCommand command;
u8 data[MCUTEST_PXI_DATA_SIZE_MAX]; // 後続データ格納用
OSMessageQueue msgQ; // スレッド同期用メッセージキュー
OSMessage msgArray[MCUTEST_MESSAGE_ARRAY_MAX];
// メッセージを格納するバッファ
OSThread thread; // MCU用スレッド
u64 stack[MCUTEST_THREAD_STACK_SIZE / sizeof(u64)];
// MCU用スレッドのスタック
}
SYSMMcuWork;
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static BOOL mcuInitialized;
static SYSMMcuWork mcuWork;
static u8 mcu_ver;
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static void SYSM_McuPxiCallback(PXIFifoTag tag, u32 data, BOOL err);
static void SYSM_ReturnMcuResult(SYSMMcuCommand command, SYSMMcuPxiResult result);
static void SYSM_ReturnMcuResultEx(SYSMMcuCommand command, SYSMMcuPxiResult result, u8 size, u8* data);
static void SYSM_McuThread(void *arg);
#if 0
static void SYSM_McuHandlerExternalDC(void)
{
OS_TPrintf("MCU_IE_EXTERNAL_DC_TRIGGER\n");
SYSM_ReturnMcuResult(MCU_TEST_COMMAND_INTERRUPT, (SYSMMcuPxiResult)MCU_IE_EXTERNAL_DC_TRIGGER);
}
#endif
static void SYSM_McuHandlerBatteryLow(void)
{
OS_TPrintf("MCU_IE_BATTERY_LOW_TRIGGER\n");
SYSM_ReturnMcuResult(MCU_TEST_COMMAND_INTERRUPT, (SYSMMcuPxiResult)MCU_IE_BATTERY_LOW_TRIGGER);
}
static void SYSM_McuHandlerBatteryEmpty(void)
{
OS_TPrintf("MCU_IE_BATTERY_EMPTY_TRIGGER\n");
SYSM_ReturnMcuResult(MCU_TEST_COMMAND_INTERRUPT, (SYSMMcuPxiResult)MCU_IE_BATTERY_EMPTY_TRIGGER);
}
static void SYSM_McuHandlerPowerSwitch(void)
{
OS_TPrintf("MCU_IE_POWER_SWITCH_PRESSED\n");
SYSM_ReturnMcuResult(MCU_TEST_COMMAND_INTERRUPT, (SYSMMcuPxiResult)MCU_IE_POWER_SWITCH_PRESSED);
}
static void SYSM_McuHandlerPowerOffRequest(void)
{
OS_TPrintf("MCU_IE_POWER_OFF_REQUEST\n");
SYSM_ReturnMcuResult(MCU_TEST_COMMAND_INTERRUPT, (SYSMMcuPxiResult)MCU_IE_POWER_OFF_REQUEST);
}
static void SYSM_McuHandlerResetRequest(void)
{
OS_TPrintf("MCU_IE_RESET_REQUEST\n");
SYSM_ReturnMcuResult(MCU_TEST_COMMAND_INTERRUPT, (SYSMMcuPxiResult)MCU_IE_RESET_REQUEST);
}
#ifdef SDK_SUPPORT_PMIC_2
// マイコンバージョン取得
u8 SYSMi_GetMcuVersion( void )
{
return (u8)(mcu_ver >> MCU_REG_VER_INFO_VERSION_SHIFT);
}
#endif // SDK_SUPPORT_PMIC_2
// 初期化
void SYSM_InitMcuPxi( u32 prio )
{
if (mcuInitialized)
{
return;
}
mcuInitialized = TRUE;
OS_InitMessageQueue(&mcuWork.msgQ, mcuWork.msgArray, MCUTEST_MESSAGE_ARRAY_MAX);
OS_CreateThread(&mcuWork.thread, SYSM_McuThread, 0,
(void *)(mcuWork.stack + (MCUTEST_THREAD_STACK_SIZE / sizeof(u64))),
MCUTEST_THREAD_STACK_SIZE, prio);
OS_WakeupThreadDirect(&mcuWork.thread);
PXI_Init();
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_MCUTEST, SYSM_McuPxiCallback);
#ifdef SDK_SUPPORT_PMIC_2
// マイコンバージョン取得
mcu_ver = (u8)(MCU_ReadRegister( MCU_REG_VER_INFO_ADDR ));
#endif // SDK_SUPPORT_PMIC_2
#if 0
#if 0
MCU_SetIrqFunction(MCU_IE_EXTERNAL_DC_TRIGGER, McuHandlerExternalDC);
#endif
MCU_SetIrqFunction(MCU_IE_BATTERY_LOW_TRIGGER, McuHandlerBatteryLow);
MCU_SetIrqFunction(MCU_IE_BATTERY_EMPTY_TRIGGER, McuHandlerBatteryEmpty);
MCU_SetIrqFunction(MCU_IE_POWER_SWITCH_PRESSED, McuHandlerPowerSwitch);
MCU_SetIrqFunction(MCU_IE_POWER_OFF_REQUEST, McuHandlerPowerOffRequest);
MCU_SetIrqFunction(MCU_IE_RESET_REQUEST, McuHandlerResetRequest);
{
OSTick tick = OS_GetTick();
MCU_ReadRegister(0x70);
OS_TPrintf("Read: %d usec\n", (u32)OS_TicksToMicroSeconds(OS_GetTick()-tick));
tick = OS_GetTick();
MCU_WriteRegister(0x70, 0);
OS_TPrintf("Write: %d usec\n", (u32)OS_TicksToMicroSeconds(OS_GetTick()-tick));
}
// PMICへの電源ボタン割り込み削除 (あれば)
OS_DisableIrqMaskEx(OS_IE_GPIO33_0);
// (再)初期化
MCU_InitIrq(1);
#endif
}
static void SYSM_McuPxiCallback(PXIFifoTag tag, u32 data, BOOL err)
{
#pragma unused( tag )
if (err)
{
return;
}
if (data & MCUTEST_PXI_START_BIT) // 先頭データ
{
mcuWork.total = (u8)((data & MCUTEST_PXI_DATA_NUMS_MASK) >> MCUTEST_PXI_DATA_NUMS_SHIFT);
mcuWork.current = 0;
mcuWork.command = (SYSMMcuCommand)((data & MCUTEST_PXI_COMMAND_MASK) >> MCUTEST_PXI_COMMAND_SHIFT);
mcuWork.data[mcuWork.current++] = (u8)((data & MCUTEST_PXI_1ST_DATA_MASK) >> MCUTEST_PXI_1ST_DATA_SHIFT);
}
else if (mcuWork.command) // 後続データ
{
mcuWork.data[mcuWork.current++] = (u8)((data & 0xFF0000) >> 16);
mcuWork.data[mcuWork.current++] = (u8)((data & 0x00FF00) >> 8);
mcuWork.data[mcuWork.current++] = (u8)((data & 0x0000FF) >> 0);
}
if (mcuWork.current >= mcuWork.total)
{
switch (mcuWork.command)
{
case MCU_TEST_COMMAND_READ_REGISTER:
case MCU_TEST_COMMAND_WRITE_REGISTER:
if (!OS_SendMessage(&mcuWork.msgQ, NULL, OS_MESSAGE_NOBLOCK))
{
SYSM_ReturnMcuResult(mcuWork.command, MCU_PXI_RESULT_FATAL_ERROR);
}
break;
default:
SYSM_ReturnMcuResult(mcuWork.command, MCU_PXI_RESULT_INVALID_COMMAND);
}
}
}
static void SYSM_ReturnMcuResult(SYSMMcuCommand command, SYSMMcuPxiResult result)
{
u32 pxiData = (u32)(MCUTEST_PXI_START_BIT | MCUTEST_PXI_RESULT_BIT |
((command << MCUTEST_PXI_COMMAND_SHIFT) & MCUTEST_PXI_COMMAND_MASK) |
((1 << MCUTEST_PXI_DATA_NUMS_SHIFT) & MCUTEST_PXI_DATA_NUMS_MASK) |
((result << MCUTEST_PXI_1ST_DATA_SHIFT) & MCUTEST_PXI_1ST_DATA_MASK));
while (0 > PXI_SendWordByFifo(PXI_FIFO_TAG_MCUTEST, pxiData, 0))
{
}
}
static void SYSM_ReturnMcuResultEx(SYSMMcuCommand command, SYSMMcuPxiResult result, u8 size, u8* data)
{
u32 pxiData = (u32)(MCUTEST_PXI_START_BIT | MCUTEST_PXI_RESULT_BIT |
((command << MCUTEST_PXI_COMMAND_SHIFT) & MCUTEST_PXI_COMMAND_MASK) |
(((size+1) << MCUTEST_PXI_DATA_NUMS_SHIFT) & MCUTEST_PXI_DATA_NUMS_MASK) |
((result << MCUTEST_PXI_1ST_DATA_SHIFT) & MCUTEST_PXI_1ST_DATA_MASK));
OSIntrMode enabled = OS_DisableInterrupts();
int i;
while (0 > PXI_SendWordByFifo(PXI_FIFO_TAG_MCUTEST, pxiData, 0))
{
}
for (i = 0; i < size; i+= 3)
{
pxiData = (u32)((data[i] << 16) | (data[i+1] << 8) | data[i+2]);
while (0 > PXI_SendWordByFifo(PXI_FIFO_TAG_MCUTEST, pxiData, 0))
{
}
}
OS_RestoreInterrupts(enabled);
}
static void SYSM_McuThread(void *arg)
{
#pragma unused( arg )
OSMessage msg;
u8 value;
while (TRUE)
{
(void)OS_ReceiveMessage(&mcuWork.msgQ, &msg, OS_MESSAGE_BLOCK);
switch (mcuWork.command)
{
case MCU_TEST_COMMAND_READ_REGISTER:
value = MCU_ReadRegister(mcuWork.data[0]);
SYSM_ReturnMcuResultEx(mcuWork.command, MCU_PXI_RESULT_SUCCESS, 1, &value);
break;
case MCU_TEST_COMMAND_WRITE_REGISTER:
value = (u8)MCU_WriteRegister(mcuWork.data[0], mcuWork.data[1]);
SYSM_ReturnMcuResult(mcuWork.command, value ? MCU_PXI_RESULT_SUCCESS : MCU_PXI_RESULT_ILLEGAL_STATUS);
break;
default:
SYSM_ReturnMcuResult(mcuWork.command, MCU_PXI_RESULT_INVALID_COMMAND);
}
mcuWork.command = MCU_TEST_COMMAND_NULL;
}
}
#include <twl/ltdwram_end.h>

View File

@ -0,0 +1,52 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# Copyright 2008 Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
# Company Ltd., and are protected by Federal copyright law. They may
# not be disclosed to third parties or copied or duplicated in any form,
# in whole or in part, without the prior written consent of Nintendo.
#
# $Date:: 2008-02-07#$
# $Rev: 612 $
# $Author: yutaka $
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TWL_PROC = ARM9
#----------------------------------------------------------------------------
SRCDIR = ./src
INCDIR = ./include ../common/include
SRCS = mcu.c
TARGET_LIB = libsysmmcu$(TWL_LIBSUFFIX).a
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
include $(TWLSDK_ROOT)/build/libraries/reboot/commondefs.reboot
INSTALL_TARGETS = $(TARGETS)
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)
#----------------------------------------------------------------------------
do-build: $(TARGETS)
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,311 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: mcu.c
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2008-01-29#$
$Rev: 3905 $
$Author: yutaka $
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu/mcu.h>
#define DMA_WILL_STOP // MCU_GetMaxLinesRoundならdefine、MCU_GET_MAX_LINESならundef
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
// 詰めてコピーする
#define MCU_PACK_U16(d, s) \
((d)[0] = (u8)((*((u16*)s) >> 0) & 0xFF), \
(d)[1] = (u8)((*((u16*)s) >> 8) & 0xFF))
#define MCU_PACK_U32(d, s) \
((d)[0] = (u8)((*((u32*)s) >> 0) & 0xFF), \
(d)[1] = (u8)((*((u32*)s) >> 8) & 0xFF), \
(d)[2] = (u8)((*((u32*)s) >> 16) & 0xFF), \
(d)[3] = (u8)((*((u32*)s) >> 24) & 0xFF))
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
typedef struct SYSMMcuWork
{
BOOL lock;
SYSMMcuCommand command;
SYSMMcuPxiResult result;
SYSMMcuCallback callback;
SYSMMcuCallback handler;
void* arg;
u32 total;
u32 current;
u8* data;
}
SYSMMcuWork;
#include <twl/ltdmain_begin.h>
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static BOOL mcuInitialized;
static SYSMMcuWork mcuWork;
static u8 mcu_ver;
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static BOOL SYSM_SendMcuPxiCommand(SYSMMcuCommand command, u8 size, u8 data);
static void SYSM_SendMcuPxiData(u8 *pData);
static void SYSM_McuPxiCallback(PXIFifoTag tag, u32 data, BOOL err);
static void SYSM_DoneMcu(SYSMMcuResult result);
static void SYSM_WaitMcuBusy(void);
// 初期化
void SYSM_InitMcuPxi( void )
{
if (mcuInitialized)
{
return;
}
mcuInitialized = TRUE;
mcuWork.lock = TRUE;
mcuWork.handler = NULL;
PXI_Init();
while ( !PXI_IsCallbackReady(PXI_FIFO_TAG_MCUTEST, PXI_PROC_ARM7 ))
{
}
PXI_SetFifoRecvCallback(PXI_FIFO_TAG_MCUTEST, SYSM_McuPxiCallback);
mcuWork.lock = TRUE;
mcuWork.callback = NULL;
if ( 0 > PXI_SendWordByFifo(PXI_FIFO_TAG_MCUTEST, 0, 0))
{
return;
}
while (*(vu32*)&mcuWork.lock)
{
}
#ifdef SDK_SUPPORT_PMIC_2
// マイコンバージョン取得
while ( SYSM_ReadMcuRegisterAsync( MCU_REG_VER_INFO_ADDR, &mcu_ver, NULL, NULL ) != MCU_RESULT_SUCCESS ) {}
#endif // SDK_SUPPORT_PMIC_2
}
#ifdef SDK_SUPPORT_PMIC_2
// マイコンバージョン取得
u8 SYSMi_GetMcuVersion( void )
{
return (u8)(mcu_ver >> MCU_REG_VER_INFO_VERSION_SHIFT);
}
#endif // SDK_SUPPORT_PMIC_2
SYSMMcuResult SYSM_ReadMcuRegisterAsync( u8 addr, u8 *pValue, SYSMMcuCallback callback, void* arg )
{
OSIntrMode enabled = OS_DisableInterrupts();
if (mcuWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return MCU_RESULT_BUSY;
}
mcuWork.lock = TRUE;
mcuWork.callback = callback;
mcuWork.arg = arg;
mcuWork.data = pValue;
(void)OS_RestoreInterrupts(enabled);
if (SYSM_SendMcuPxiCommand(MCU_TEST_COMMAND_READ_REGISTER, 1, (u8)addr))
{
return MCU_RESULT_SUCCESS;
}
return MCU_RESULT_SEND_ERROR;
}
SYSMMcuResult SYSM_WriteMcuRegisterAsync( u8 addr, u8 value, SYSMMcuCallback callback, void* arg )
{
OSIntrMode enabled;
u8 data[3];
enabled = OS_DisableInterrupts();
if (mcuWork.lock)
{
(void)OS_RestoreInterrupts(enabled);
return MCU_RESULT_BUSY;
}
mcuWork.lock = TRUE;
mcuWork.callback = callback;
mcuWork.arg = arg;
mcuWork.data = NULL;
data[0] = value;
(void)OS_RestoreInterrupts(enabled);
if (SYSM_SendMcuPxiCommand(MCU_TEST_COMMAND_WRITE_REGISTER, 2, (u8)addr))
{
SYSM_SendMcuPxiData(data);
return MCU_RESULT_SUCCESS;
}
return MCU_RESULT_SEND_ERROR;
}
void SYSM_SetMcuInterruptHandler( SYSMMcuCallback handler )
{
mcuWork.handler = handler;
}
/////////
static BOOL SYSM_SendMcuPxiCommand(SYSMMcuCommand command, u8 size, u8 data)
{
u32 pxiData = (u32)(MCUTEST_PXI_START_BIT |
((command << MCUTEST_PXI_COMMAND_SHIFT) & MCUTEST_PXI_COMMAND_MASK) |
((size << MCUTEST_PXI_DATA_NUMS_SHIFT) & MCUTEST_PXI_DATA_NUMS_MASK) |
((data << MCUTEST_PXI_1ST_DATA_SHIFT) & MCUTEST_PXI_1ST_DATA_MASK));
if (0 > PXI_SendWordByFifo(PXI_FIFO_TAG_MCUTEST, pxiData, 0))
{
return FALSE;
}
return TRUE;
}
static void SYSM_SendMcuPxiData(u8 *pData)
{
u32 pxiData = (u32)((pData[0] << 16) | (pData[1] << 8) | pData[2]);
while (0 > PXI_SendWordByFifo(PXI_FIFO_TAG_MCUTEST, pxiData, 0))
{
}
}
static void SYSM_McuPxiCallback(PXIFifoTag tag, u32 data, BOOL err)
{
#pragma unused( tag )
if (err)
{
SYSM_DoneMcu(MCU_RESULT_FATAL_ERROR);
return;
}
if (data & MCUTEST_PXI_START_BIT) // 先頭データ
{
if (data & MCUTEST_PXI_RESULT_BIT)
{
mcuWork.total = (u8)((data & MCUTEST_PXI_DATA_NUMS_MASK) >> MCUTEST_PXI_DATA_NUMS_SHIFT);
mcuWork.current = 0;
mcuWork.command = (SYSMMcuCommand)((data & MCUTEST_PXI_COMMAND_MASK) >> MCUTEST_PXI_COMMAND_SHIFT);
mcuWork.result = (SYSMMcuPxiResult)((data & MCUTEST_PXI_1ST_DATA_MASK) >> MCUTEST_PXI_1ST_DATA_SHIFT);
}
else // 未知のデータ
{
SYSM_DoneMcu(MCU_RESULT_FATAL_ERROR);
return;
}
}
else if (mcuWork.command) // 後続データ
{
if (mcuWork.data == NULL)
{
SYSM_DoneMcu(MCU_RESULT_FATAL_ERROR);
return;
}
if (mcuWork.current < mcuWork.total-1)
{
mcuWork.data[mcuWork.current++] = (u8)((data & 0xFF0000) >> 16);
}
if (mcuWork.current < mcuWork.total-1)
{
mcuWork.data[mcuWork.current++] = (u8)((data & 0x00FF00) >> 8);
}
if (mcuWork.current < mcuWork.total-1)
{
mcuWork.data[mcuWork.current++] = (u8)((data & 0x0000FF) >> 0);
}
}
if (mcuWork.command == MCU_TEST_COMMAND_NULL)
{
SYSM_DoneMcu(MCU_RESULT_SUCCESS);
return;
}
if (mcuWork.command == MCU_TEST_COMMAND_INTERRUPT)
{
if (mcuWork.handler)
{
mcuWork.handler(MCU_RESULT_SUCCESS, (void*)mcuWork.result);
}
return;
}
if (mcuWork.current == mcuWork.total-1)
{
SYSMMcuResult result;
switch (mcuWork.result)
{
case MCU_PXI_RESULT_SUCCESS: // alias MCU_PXI_RESULT_SUCCESS_TRUE
result = MCU_RESULT_SUCCESS; // alias MCU_RESULT_SUCCESS_TRUE
break;
case MCU_PXI_RESULT_SUCCESS_FALSE:
result = MCU_RESULT_SUCCESS_FALSE;
break;
case MCU_PXI_RESULT_INVALID_COMMAND:
result = MCU_RESULT_INVALID_COMMAND;
break;
case MCU_PXI_RESULT_INVALID_PARAMETER:
result = MCU_RESULT_ILLEGAL_PARAMETER;
break;
case MCU_PXI_RESULT_ILLEGAL_STATUS:
result = MCU_RESULT_ILLEGAL_STATUS;
break;
case MCU_PXI_RESULT_BUSY:
result = MCU_RESULT_BUSY;
break;
default:
result = MCU_RESULT_FATAL_ERROR;
}
SYSM_DoneMcu(result);
mcuWork.command = MCU_TEST_COMMAND_NULL;
return;
}
}
static void SYSM_DoneMcu(SYSMMcuResult result)
{
SYSMMcuCallback callback = mcuWork.callback;
void* arg = mcuWork.arg;
mcuWork.callback = NULL;
mcuWork.arg = NULL;
if (mcuWork.lock)
{
mcuWork.lock = FALSE;
}
if (callback)
{
callback(result, arg);
}
}
extern void PXIi_HandlerRecvFifoNotEmpty(void);
static void SYSM_WaitMcuBusy(void)
{
volatile BOOL *p = &mcuWork.lock;
while (*p)
{
if (OS_GetCpsrIrq() == OS_INTRMODE_IRQ_DISABLE)
{
PXIi_HandlerRecvFifoNotEmpty();
}
}
}
#include <twl/ltdmain_end.h>

View File

@ -0,0 +1,30 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# Copyright 2008 Nintendo. All rights reserved.
#
# These coded instructions, statements, and computer programs contain
# proprietary information of Nintendo of America Inc. and/or Nintendo
# Company Ltd., and are protected by Federal copyright law. They may
# not be disclosed to third parties or copied or duplicated in any form,
# in whole or in part, without the prior written consent of Nintendo.
#
# $Date:: #$
# $Rev: $
# $Author: $
#----------------------------------------------------------------------------
TARGET_FIRM = SYSTEMMENU
SUBDIRS = ARM7 ARM9
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
do-build: $(TARGETS)
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -17,6 +17,7 @@
#include <twl.h>
#include <sysmenu.h>
#include <sysmenu/mcu.h>
#include <spi.h>
#include "internal_api.h"
@ -46,7 +47,17 @@ void SYSM_SetBackLightBrightness( u8 brightness )
if( brightness > LCFG_TWL_BACKLIGHT_LEVEL_MAX ) {
OS_Panic( "Backlight brightness over : %d\n", brightness );
}
( void )SYSMi_SendPXICommand( SYSM_PXI_COMM_BL_BRIGHT, brightness );
#ifdef SDK_SUPPORT_PMIC_2
if ( SYSMi_GetMcuVersion() <= 1 )
{
( void )PMi_WriteRegister( REG_PMIC_BL_BRT_B_ADDR, brightness );
}
else
#endif // SDK_SUPPORT_PMIC_2
{
( void )SYSM_WriteMcuRegisterAsync( MCU_REG_BL_ADDR, brightness, NULL, NULL );
}
// ( void )SYSMi_SendPXICommand( SYSM_PXI_COMM_BL_BRIGHT, brightness );
LCFG_TSD_SetBacklightBrightness( brightness );

View File

@ -18,6 +18,7 @@
#include <twl.h>
#include <twl/mcu.h>
#include <sysmenu.h>
#include <sysmenu/mcu.h>
#include "internal_api.h"
#ifdef SDK_ARM7
#include <pm_pmic.h>
@ -44,11 +45,14 @@ typedef union SYSMPXIPacket {
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
static volatile BOOL s_sending[SYSM_PXI_COMM_NUM];
static u8 mcu_ver;
// const data------------------------------------------------------------------
// PXI<58>‰Šú‰»
#ifdef SDK_ARM9
void SYSM_InitPXI( void )
#else // SDK_ARM7
void SYSM_InitPXI( u32 mcu_prio )
#endif // SDK_ARM7
{
static BOOL isInitialized;
int i;
@ -59,15 +63,18 @@ void SYSM_InitPXI( void )
}
isInitialized = TRUE;
// マイコンPXI初期化とマイコンバージョン取得
#ifdef SDK_ARM9
SYSM_InitMcuPxi();
#else // SDK_ARM7
SYSM_InitMcuPxi( mcu_prio );
#endif // SDK_ARM7
for (i=0; i<SYSM_PXI_COMM_NUM; i++)
{
s_sending[i] = FALSE;
}
#if defined(SDK_ARM7) && defined(SDK_SUPPORT_PMIC_2)
mcu_ver = (u8)(MCU_ReadRegister( MCU_REG_VER_INFO_ADDR ) >> MCU_REG_VER_INFO_VERSION_SHIFT);
#endif // SDK_ARM7 && SDK_SUPPORT_PMIC_2
//---- setting PXI
PXI_Init();
#ifdef SDK_ARM9
@ -141,7 +148,7 @@ void SYSMi_PXIFifoRecvCallback( PXIFifoTag tag, u32 data, BOOL err )
{
case SYSM_PXI_COMM_BL_BRIGHT:
#ifdef SDK_SUPPORT_PMIC_2
if ( mcu_ver <= 1 )
if ( SYSMi_GetMcuVersion() <= 1 )
{
PMi_SetRegister( REG_PMIC_BL_BRT_B_ADDR, (u8)packet.data );
}

View File

@ -22,6 +22,8 @@ SUBDIRS = \
../../../components/hyena.TWL
# ../../../libraries_sysmenu/reloc_info \
# ../../../libraries_sysmenu/boot \
# ../../../libraries_sysmenu/mcu \
# $(TWLSDK_ROOT)/build/libraries/reboot \
#----------------------------------------------------------------------------

View File

@ -91,7 +91,6 @@ void TwlMain( void )
SYSM_Init( Alloc, Free ); // OS_Initの前でコールする必要あり。
OS_Init();
SYSM_SetArena(); // OS_Initの後でコールする必要あり。
SYSM_InitPXI(); // OS_Initの後でコールする必要あり。
// OS初期化------------------------
OS_InitTick();
@ -100,6 +99,8 @@ void TwlMain( void )
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
SYSM_InitPXI(); // 割り込み許可後にコールする必要あり。
FS_Init( FS_DMA_NOT_USE );
#ifdef DEBUG_LAUNCHER_DUMP

39
include/sysmenu/mcu.h Normal file
View File

@ -0,0 +1,39 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL - MCU
File: mcu.h
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2007-09-06$
$Rev: 651 $
$Author: nakasima $
*---------------------------------------------------------------------------*/
#ifndef SYSM_MCU_H_
#define SYSM_MCU_H_
#include <twl/mcu.h>
#include <sysmenu/mcu/common/fifo.h>
#ifdef SDK_ARM9
#include <sysmenu/mcu/ARM9/mcu.h>
#else // SDK_ARM7
#include <sysmenu/mcu/ARM7/mcu.h>
#endif // SDK_ARM7
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
} /* extern "C" */
#endif
/* SYSM_MCU_H_ */
#endif

View File

@ -0,0 +1,44 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: mcu.h
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2008-01-23#$
$Rev: 3784 $
$Author: yutaka $
*---------------------------------------------------------------------------*/
#ifndef SYSM_MCU_ARM7_H_
#define SYSM_MCU_ARM7_H_
/*---------------------------------------------------------------------------*
è<EFBFBD>è`
*---------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
/*===========================================================================*/
void SYSM_InitMcuPxi( u32 prio );
u8 SYSMi_GetMcuVersion( void );
/*===========================================================================*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SYSM_MCU_ARM7_H_ */
/*---------------------------------------------------------------------------*
End of file
*---------------------------------------------------------------------------*/

View File

@ -0,0 +1,69 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: mcu.h
Copyright 2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2008-01-23#$
$Rev: 3784 $
$Author: yutaka $
*---------------------------------------------------------------------------*/
#ifndef SYSM_MCU_ARM9_H_
#define SYSM_MCU_ARM9_H_
#include <twl/mcu.h>
#include <twl/mcu/ARM7/mcu_reg.h>
#include "../common/fifo.h"
/*---------------------------------------------------------------------------*
è<EFBFBD>è`
*---------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
typedef enum SYSMMcuResult
{
MCU_RESULT_SUCCESS = 0,
MCU_RESULT_SUCCESS_TRUE = 0,
MCU_RESULT_SUCCESS_FALSE,
MCU_RESULT_BUSY,
MCU_RESULT_ILLEGAL_PARAMETER,
MCU_RESULT_SEND_ERROR,
MCU_RESULT_INVALID_COMMAND,
MCU_RESULT_ILLEGAL_STATUS,
MCU_RESULT_FATAL_ERROR,
MCU_RESULT_MAX
}
SYSMMcuResult;
typedef void (*SYSMMcuCallback)(SYSMMcuResult result, void *arg);
/*===========================================================================*/
void SYSM_InitMcuPxi( void );
u8 SYSMi_GetMcuVersion( void );
SYSMMcuResult SYSM_ReadMcuRegisterAsync( u8 addr, u8* pValue, SYSMMcuCallback callback, void* arg );
SYSMMcuResult SYSM_WriteMcuRegisterAsync( u8 addr, u8 value, SYSMMcuCallback callback, void* arg );
void SYSM_SetMcuInterruptHandler( SYSMMcuCallback handler );
/*===========================================================================*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SYSM_MCU_ARM9_H_ */
/*---------------------------------------------------------------------------*
End of file
*---------------------------------------------------------------------------*/

View File

@ -0,0 +1,86 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - mcu-test - include
File: fifo.h
Copyright 2007 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: 2008-01-25#$
$Rev: 3844 $
$Author: yutaka $
*---------------------------------------------------------------------------*/
#ifndef SYSM_MCU_COMMON_FIFO_H_
#define SYSM_MCU_COMMON_FIFO_H_
#include <twl/types.h>
#include <sysmenu/sysmenu_lib/common/pxi.h>
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
#define MCUTEST_PXI_CONTINUOUS_PACKET_MAX 2
#define MCUTEST_PXI_DATA_SIZE_MAX ((MCUTEST_PXI_CONTINUOUS_PACKET_MAX-1)*3+1) // 最大データ数
#define MCUTEST_PXI_START_BIT 0x02000000 // 先頭パケットを意味する
#define MCUTEST_PXI_RESULT_BIT 0x00008000 // PXIの応答を示す
#define MCUTEST_PXI_DATA_NUMS_SHIFT 16 // データ数位置
#define MCUTEST_PXI_DATA_NUMS_MASK 0x00ff0000 // データ数領域
#define MCUTEST_PXI_COMMAND_SHIFT 8 // コマンド格納部分の位置
#define MCUTEST_PXI_COMMAND_MASK 0x00007f00 // コマンド格納部分のマスク
#define MCUTEST_PXI_1ST_DATA_SHIFT 0 // 先頭パケットのデータ位置
#define MCUTEST_PXI_1ST_DATA_MASK 0x000000ff // 先頭パケットのデータ領域
#ifdef __cplusplus
extern "C" {
#endif
/*===========================================================================*/
typedef enum McuTestCommand
{
MCU_TEST_COMMAND_NULL = 0,
MCU_TEST_COMMAND_READ_REGISTER,
MCU_TEST_COMMAND_WRITE_REGISTER,
MCU_TEST_COMMAND_INTERRUPT,
MCU_TEST_COMMAND_MAX
}
SYSMMcuCommand;
// 応答定義
typedef enum SYSMMcuPxiResult
{
MCU_PXI_RESULT_SUCCESS = 0, // 処理成功 (void/void*型) // 場合により後続パケットあり
MCU_PXI_RESULT_SUCCESS_TRUE = 0, // 処理成功 (BOOL型)
MCU_PXI_RESULT_SUCCESS_FALSE, // 処理成功 (BOOL型)
MCU_PXI_RESULT_INVALID_COMMAND, // 不正なPXIコマンド
MCU_PXI_RESULT_INVALID_PARAMETER, // 不正なパラメータ
MCU_PXI_RESULT_ILLEGAL_STATUS, // MCUの状態により処理を実行不可
MCU_PXI_RESULT_BUSY, // 他のリクエストを実行中
MCU_PXI_RESULT_FATAL_ERROR, // その他何らかの原因で処理に失敗
MCU_PXI_RESULT_MAX
}
SYSMMcuPxiResult;
/*===========================================================================*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SYSM_MCU_COMMON_FIFO_H_ */
/*---------------------------------------------------------------------------*
End of file
*---------------------------------------------------------------------------*/

View File

@ -27,7 +27,8 @@ extern "C" {
//----------------------------------------------------------------------
// PXIコマンド
//----------------------------------------------------------------------
#define SYSMENU_PXI_FIFO_TAG PXI_FIFO_TAG_USER_1
#define SYSMENU_PXI_FIFO_TAG (PXI_MAX_FIFO_TAG - 1)
#define PXI_FIFO_TAG_MCUTEST (PXI_MAX_FIFO_TAG - 2)
typedef enum SYSMPXICommand {
SYSM_PXI_COMM_BL_BRIGHT = 0,
@ -41,7 +42,11 @@ typedef enum SYSMPXICommand {
*---------------------------------------------------------------------------*/
// PXI初期化
#ifdef SDK_ARM9
void SYSM_InitPXI( void );
#else // SDK_ARM7
void SYSM_InitPXI( u32 mcu_prio );
#endif // SDK_ARM7
// PXIコマンド送信
BOOL SYSMi_TrySendPXICommand( SYSMPXICommand cmd, u16 data );
@ -50,7 +55,6 @@ BOOL SYSMi_SendPXICommand( SYSMPXICommand command, u16 data );
// PXIコマンド受信
void SYSMi_PXIFifoRecvCallback( PXIFifoTag tag, u32 data, BOOL err );
#ifdef __cplusplus
}
#endif