From 63c9a50447ac0c97f12a193f2befe4b4137f1a19 Mon Sep 17 00:00:00 2001 From: nakasima Date: Wed, 14 Jan 2009 11:50:51 +0000 Subject: [PATCH] =?UTF-8?q?ARM9=E3=81=AE=E3=83=81=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=9E=E3=83=BC=E3=82=9232bit=E3=81=B8?= =?UTF-8?q?=E6=8B=A1=E5=BC=B5=EF=BC=88=E3=82=A2=E3=83=A9=E3=83=BC=E3=83=A0?= =?UTF-8?q?=E3=81=AE32bit=E5=8C=96=E3=81=AF=E3=82=BF=E3=82=A4=E3=83=9E?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E4=BB=95=E6=A7=98=E3=81=8B=E3=82=89=E9=99=A4?= =?UTF-8?q?=E7=AE=97=E3=81=8C=E9=A0=BB=E7=B9=81=E3=81=AB=E5=85=A5=E3=82=8A?= =?UTF-8?q?=E3=81=9D=E3=81=86=EF=BC=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@173 b871894f-2f95-9b40-918c-086798483c85 --- .../build/libraries/os/common/os_tick.c | 71 +++++++++++++++---- trunk/bootrom/include/brom/os/common/alarm.h | 4 ++ trunk/bootrom/include/brom/os/common/tick.h | 28 ++++++-- 3 files changed, 85 insertions(+), 18 deletions(-) diff --git a/trunk/bootrom/build/libraries/os/common/os_tick.c b/trunk/bootrom/build/libraries/os/common/os_tick.c index 866f412..ae881ac 100644 --- a/trunk/bootrom/build/libraries/os/common/os_tick.c +++ b/trunk/bootrom/build/libraries/os/common/os_tick.c @@ -20,10 +20,13 @@ //---------------------------------------------------------------------- #ifdef SDK_ARM9 //---- timer interrupt mask (must be same number with OSi_TICK_TIMER) -#define OSi_TICK_IE_TIMER (OS_IE_TIMER0 << OSi_TICK_TIMER) +#define OSi_TICK_IE_TIMER (OS_IE_TIMER0 << OSi_TICK_TIMER) //---- timer control setting for tick -#define OSi_TICK_TIMERCONTROL ( REG_OS_TM0CNT_H_E_MASK | REG_OS_TM0CNT_H_I_MASK | OS_TIMER_PRESCALER_64 ) +#define OSi_TICK_TIMERCONTROL ( REG_OS_TM0CNT_H_E_MASK | REG_OS_TM0CNT_H_I_MASK | OS_TIMER_PRESCALER_64 ) +#ifdef OS_TICK_USE_2TIMERS +#define OSi_TICK_TIMERCONTROL_H ( REG_OS_TM1CNT_H_E_MASK | REG_OS_TM1CNT_H_I_MASK | REG_OS_TM1CNT_H_CH_MASK ) +#endif // OS_TICK_USE_2TIMERS #endif // SDK_ARM9 //---- flag for initialization tick @@ -74,7 +77,12 @@ void osInitTick(void) #else // SDK_ARM9 //---- setting timer osSetTimerControl(OSi_TICK_TIMER, 0); - osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)0); +#ifdef OS_TICK_USE_2TIMERS + osSetTimerControl(OSi_TICK_TIMER_H, 0); + osSetTimerCount(OSi_TICK_TIMER_H, (u16)0); + osSetTimerControl(OSi_TICK_TIMER_H, (u16)OSi_TICK_TIMERCONTROL_H); +#endif // OS_TICK_USE_2TIMERS + osSetTimerCount(OSi_TICK_TIMER, (u16)0); osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL); #endif // SDK_ARM9 @@ -125,6 +133,11 @@ static void i_osCountUpTick(void) osStartTimer(OSi_TICK_TIMER, OS_TICK_LO_LIMIT, 0); #else // SDK_ARM9 osSetTimerControl(OSi_TICK_TIMER, 0); +#ifdef OS_TICK_USE_2TIMERS + osSetTimerControl(OSi_TICK_TIMER_H, 0); + osSetTimerCount(OSi_TICK_TIMER_H, (u16)0); + osSetTimerControl(OSi_TICK_TIMER_H, (u16)OSi_TICK_TIMERCONTROL_H); +#endif // OS_TICK_USE_2TIMERS osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)0); osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL); #endif // SDK_ARM9 @@ -132,6 +145,10 @@ static void i_osCountUpTick(void) i_osNeedResetTimer = FALSE; } +#ifdef OS_TICK_USE_2TIMERS + osIsInterruptPendingID((OSIntrID)(OSi_TICK_IE_TIMER_ID-1)); +#endif // OS_TICK_USE_2TIMERS + // これはやらなくても、毎回コールバックがかかるから問題ない? // //---- reset callback // OSi_EnterTimerCallback(OSi_TICK_TIMER, (void (*)(void *))i_osCountUpTick, 0); @@ -148,28 +165,41 @@ static void i_osCountUpTick(void) *---------------------------------------------------------------------------*/ u64 osGetTick(void) { - vu32 countL; - vu64 countH; + u32 countL; + u64 countH; OSIntrMode prev = osDisableInterrupts(); SDK_ASSERT(i_osUseTick); +#ifndef OS_TICK_USE_2TIMERS countL = osGetTimerCount(OSi_TICK_TIMER); +#else // OS_TICK_USE_2TIMERS + { + u32 countM; + + countM = osGetTimerCount(OSi_TICK_TIMER_H); + countL = osGetTimerCount(OSi_TICK_TIMER); + if (osIsInterruptPendingID((OSIntrID)(OSi_TICK_IE_TIMER_ID-1)) && + // OSi_TICK_TIMERオーバーフロー対策 + !(countL & OS_TICK_LO_MSB) + ) + { + countM++; + } + countL |= countM << 16; + } +#endif // OS_TICK_USE_2TIMERS + #ifdef SDK_ARM11 + // ARM11はダウンカウンタ、ARM9はアップカウンタの違いはここで補正される countL = OS_TICK_LO_LIMIT - countL; #endif // SDK_ARM11 countH = i_osTickCounter; //---- check if timer interrupt bit is on if (osIsInterruptPendingID(OSi_TICK_IE_TIMER_ID) && - // countLが0xFFFFで直後に割り込み要求が来た場合の対策 -#ifdef SDK_ARM11 - // ダウンカウンタなので - (countL & OS_TICK_LO_MSB) -#else // SDK_ARM9 - // アップカウンタなので + // countLが0xFFFFFFFFで直後に割り込み要求が来た場合の対策 !(countL & OS_TICK_LO_MSB) -#endif // SDK_ARM9 ) { countH++; @@ -191,11 +221,14 @@ u64 osGetTick(void) Returns: tick value (only u16 part) *---------------------------------------------------------------------------*/ +#ifndef OS_TICK_USE_2TIMERS +// OS_TICK_USE_2TIMERS 有効時は正常値を取得できない OSTimerCount osGetTickLo(void) { SDK_ASSERT(OSi_UseTick); return osGetTimerCount(OSi_TICK_TIMER); } +#endif // OS_TICK_USE_2TIMERS /*---------------------------------------------------------------------------* Name: i_osSetTick @@ -203,9 +236,13 @@ OSTimerCount osGetTickLo(void) Description: set tick value Arguments: count value of tick to be set + OS_TICK_USE_2TIMERS 有効時はLOタイマーの + オーバーフローでHIタイマーがカウントアップするため、 + count = 0 以外では正常に動作しない Returns: None *---------------------------------------------------------------------------*/ +#ifndef OS_TICK_USE_2TIMERS void i_osSetTick(u64 count) { OSIntrMode prev; @@ -225,12 +262,20 @@ void i_osSetTick(u64 count) #else // SDK_ARM9 osSetTimerControl(OSi_TICK_TIMER, 0); +#ifdef OS_TICK_USE_2TIMERS + osSetTimerControl(OSi_TICK_TIMER_H, 0); +#endif // OS_TICK_USE_2TIMERS osClearInterruptPendingID(OSi_TICK_IE_TIMER_ID); - osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)(count & OS_TICK_LO_MASK)); +#ifdef OS_TICK_USE_2TIMERS + osSetTimerCount(OSi_TICK_TIMER_H, (u16)0); + osSetTimerControl(OSi_TICK_TIMER_H, (u16)OSi_TICK_TIMERCONTROL_H); +#endif // OS_TICK_USE_2TIMERS + osSetTimerCount(OSi_TICK_TIMER, (u16)(count & OS_TICK_LO_MASK)); osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL); #endif // SDK_ARM9 (void)osRestoreInterrupts(prev); } +#endif // OS_TICK_USE_2TIMERS diff --git a/trunk/bootrom/include/brom/os/common/alarm.h b/trunk/bootrom/include/brom/os/common/alarm.h index 4b6cacc..daa3fd7 100644 --- a/trunk/bootrom/include/brom/os/common/alarm.h +++ b/trunk/bootrom/include/brom/os/common/alarm.h @@ -28,7 +28,11 @@ extern "C" { //---------------------------------------------------------------------- //---- timer number alarm uses +#ifndef OS_TICK_USE_2TIMERS #define OSi_ALARM_TIMER OS_TIMER_1 +#else // OS_TICK_USE_2TIMERS +#define OSi_ALARM_TIMER OS_TIMER_2 +#endif // OS_TICK_USE_2TIMERS //---- timer interrupt ID #ifdef SDK_ARM11 diff --git a/trunk/bootrom/include/brom/os/common/tick.h b/trunk/bootrom/include/brom/os/common/tick.h index b010d94..6e2b70d 100644 --- a/trunk/bootrom/include/brom/os/common/tick.h +++ b/trunk/bootrom/include/brom/os/common/tick.h @@ -39,32 +39,50 @@ extern void i_osSetTick( u64 ); //---------------------------------------------------------------------- +//---- ARM9 use 2 timers +#ifdef SDK_ARM9 +#define OS_TICK_USE_2TIMERS +#endif // SDK_ARM9 + //---- timer number tick uses -#define OSi_TICK_TIMER OS_TIMER_0 +#define OSi_TICK_TIMER OS_TIMER_0 +#ifdef OS_TICK_USE_2TIMERS +#define OSi_TICK_TIMER_H ((OSTimer)(OSi_TICK_TIMER + 1)) +#endif // OS_TICK_USE_2TIMERS //---- timer interrupt ID #ifdef SDK_ARM11 #define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER + OSi_TICK_TIMER)) #else // SDK_ARM9 +#ifndef OS_TICK_USE_2TIMERS #define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER0 + OSi_TICK_TIMER)) +#else // OS_TICK_USE_2TIMERS +#define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER0 + OSi_TICK_TIMER_H)) +#endif // OS_TICK_USE_2TIMERS #endif // SDK_ARM9 //---- conversion tick count <-> real time count #ifdef SDK_ARM11 #define OS_TICK_CLOCK HW_CPU_CLOCK #define OS_TICK_PRESCALE 1 -#define OS_TICK_HI_SHIFT 28 // 2の累乗単位でチック管理するのであれば32は指定できない(ロード値0では割り込みが発生しないため。最大31) -#define OS_TICK_HI_LSB (1ULL<>1)) +#define OS_TICK_HI_LSB (1ULL<>1)) +#else // OS_TICK_USE_2TIMERS +#define OS_TICK_HI_SHIFT 32 // 初期値0でも割り込み発生 +#define OS_TICK_LO_MASK ((u32)(OS_TICK_HI_LSB-1)) +#define OS_TICK_LO_MSB ((u32)(OS_TICK_HI_LSB>>1)) +#endif // OS_TICK_USE_2TIMERS +#define OS_TICK_HI_LSB (1ULL<