mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
ARM9のチックタイマーを32bitへ拡張(アラームの32bit化はタイマーの仕様から除算が頻繁に入りそう)。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@173 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
parent
8bd2222bd2
commit
63c9a50447
@ -20,10 +20,13 @@
|
|||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
#ifdef SDK_ARM9
|
#ifdef SDK_ARM9
|
||||||
//---- timer interrupt mask (must be same number with OSi_TICK_TIMER)
|
//---- 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
|
//---- 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
|
#endif // SDK_ARM9
|
||||||
|
|
||||||
//---- flag for initialization tick
|
//---- flag for initialization tick
|
||||||
@ -74,7 +77,12 @@ void osInitTick(void)
|
|||||||
#else // SDK_ARM9
|
#else // SDK_ARM9
|
||||||
//---- setting timer
|
//---- setting timer
|
||||||
osSetTimerControl(OSi_TICK_TIMER, 0);
|
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);
|
osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL);
|
||||||
#endif // SDK_ARM9
|
#endif // SDK_ARM9
|
||||||
|
|
||||||
@ -125,6 +133,11 @@ static void i_osCountUpTick(void)
|
|||||||
osStartTimer(OSi_TICK_TIMER, OS_TICK_LO_LIMIT, 0);
|
osStartTimer(OSi_TICK_TIMER, OS_TICK_LO_LIMIT, 0);
|
||||||
#else // SDK_ARM9
|
#else // SDK_ARM9
|
||||||
osSetTimerControl(OSi_TICK_TIMER, 0);
|
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);
|
osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)0);
|
||||||
osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL);
|
osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL);
|
||||||
#endif // SDK_ARM9
|
#endif // SDK_ARM9
|
||||||
@ -132,6 +145,10 @@ static void i_osCountUpTick(void)
|
|||||||
i_osNeedResetTimer = FALSE;
|
i_osNeedResetTimer = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef OS_TICK_USE_2TIMERS
|
||||||
|
osIsInterruptPendingID((OSIntrID)(OSi_TICK_IE_TIMER_ID-1));
|
||||||
|
#endif // OS_TICK_USE_2TIMERS
|
||||||
|
|
||||||
// これはやらなくても、毎回コールバックがかかるから問題ない?
|
// これはやらなくても、毎回コールバックがかかるから問題ない?
|
||||||
// //---- reset callback
|
// //---- reset callback
|
||||||
// OSi_EnterTimerCallback(OSi_TICK_TIMER, (void (*)(void *))i_osCountUpTick, 0);
|
// OSi_EnterTimerCallback(OSi_TICK_TIMER, (void (*)(void *))i_osCountUpTick, 0);
|
||||||
@ -148,28 +165,41 @@ static void i_osCountUpTick(void)
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
u64 osGetTick(void)
|
u64 osGetTick(void)
|
||||||
{
|
{
|
||||||
vu32 countL;
|
u32 countL;
|
||||||
vu64 countH;
|
u64 countH;
|
||||||
|
|
||||||
OSIntrMode prev = osDisableInterrupts();
|
OSIntrMode prev = osDisableInterrupts();
|
||||||
SDK_ASSERT(i_osUseTick);
|
SDK_ASSERT(i_osUseTick);
|
||||||
|
|
||||||
|
#ifndef OS_TICK_USE_2TIMERS
|
||||||
countL = osGetTimerCount(OSi_TICK_TIMER);
|
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
|
#ifdef SDK_ARM11
|
||||||
|
// ARM11はダウンカウンタ、ARM9はアップカウンタの違いはここで補正される
|
||||||
countL = OS_TICK_LO_LIMIT - countL;
|
countL = OS_TICK_LO_LIMIT - countL;
|
||||||
#endif // SDK_ARM11
|
#endif // SDK_ARM11
|
||||||
countH = i_osTickCounter;
|
countH = i_osTickCounter;
|
||||||
|
|
||||||
//---- check if timer interrupt bit is on
|
//---- check if timer interrupt bit is on
|
||||||
if (osIsInterruptPendingID(OSi_TICK_IE_TIMER_ID) &&
|
if (osIsInterruptPendingID(OSi_TICK_IE_TIMER_ID) &&
|
||||||
// countLが0xFFFFで直後に割り込み要求が来た場合の対策
|
// countLが0xFFFFFFFFで直後に割り込み要求が来た場合の対策
|
||||||
#ifdef SDK_ARM11
|
|
||||||
// ダウンカウンタなので
|
|
||||||
(countL & OS_TICK_LO_MSB)
|
|
||||||
#else // SDK_ARM9
|
|
||||||
// アップカウンタなので
|
|
||||||
!(countL & OS_TICK_LO_MSB)
|
!(countL & OS_TICK_LO_MSB)
|
||||||
#endif // SDK_ARM9
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
countH++;
|
countH++;
|
||||||
@ -191,11 +221,14 @@ u64 osGetTick(void)
|
|||||||
|
|
||||||
Returns: tick value (only u16 part)
|
Returns: tick value (only u16 part)
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef OS_TICK_USE_2TIMERS
|
||||||
|
// OS_TICK_USE_2TIMERS 有効時は正常値を取得できない
|
||||||
OSTimerCount osGetTickLo(void)
|
OSTimerCount osGetTickLo(void)
|
||||||
{
|
{
|
||||||
SDK_ASSERT(OSi_UseTick);
|
SDK_ASSERT(OSi_UseTick);
|
||||||
return osGetTimerCount(OSi_TICK_TIMER);
|
return osGetTimerCount(OSi_TICK_TIMER);
|
||||||
}
|
}
|
||||||
|
#endif // OS_TICK_USE_2TIMERS
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: i_osSetTick
|
Name: i_osSetTick
|
||||||
@ -203,9 +236,13 @@ OSTimerCount osGetTickLo(void)
|
|||||||
Description: set tick value
|
Description: set tick value
|
||||||
|
|
||||||
Arguments: count value of tick to be set
|
Arguments: count value of tick to be set
|
||||||
|
OS_TICK_USE_2TIMERS 有効時はLOタイマーの
|
||||||
|
オーバーフローでHIタイマーがカウントアップするため、
|
||||||
|
count = 0 以外では正常に動作しない
|
||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef OS_TICK_USE_2TIMERS
|
||||||
void i_osSetTick(u64 count)
|
void i_osSetTick(u64 count)
|
||||||
{
|
{
|
||||||
OSIntrMode prev;
|
OSIntrMode prev;
|
||||||
@ -225,12 +262,20 @@ void i_osSetTick(u64 count)
|
|||||||
|
|
||||||
#else // SDK_ARM9
|
#else // SDK_ARM9
|
||||||
osSetTimerControl(OSi_TICK_TIMER, 0);
|
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);
|
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);
|
osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL);
|
||||||
|
|
||||||
#endif // SDK_ARM9
|
#endif // SDK_ARM9
|
||||||
|
|
||||||
(void)osRestoreInterrupts(prev);
|
(void)osRestoreInterrupts(prev);
|
||||||
}
|
}
|
||||||
|
#endif // OS_TICK_USE_2TIMERS
|
||||||
|
|||||||
@ -28,7 +28,11 @@ extern "C" {
|
|||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
//---- timer number alarm uses
|
//---- timer number alarm uses
|
||||||
|
#ifndef OS_TICK_USE_2TIMERS
|
||||||
#define OSi_ALARM_TIMER OS_TIMER_1
|
#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
|
//---- timer interrupt ID
|
||||||
#ifdef SDK_ARM11
|
#ifdef SDK_ARM11
|
||||||
|
|||||||
@ -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
|
//---- 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
|
//---- timer interrupt ID
|
||||||
#ifdef SDK_ARM11
|
#ifdef SDK_ARM11
|
||||||
#define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER + OSi_TICK_TIMER))
|
#define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER + OSi_TICK_TIMER))
|
||||||
#else // SDK_ARM9
|
#else // SDK_ARM9
|
||||||
|
#ifndef OS_TICK_USE_2TIMERS
|
||||||
#define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER0 + OSi_TICK_TIMER))
|
#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
|
#endif // SDK_ARM9
|
||||||
|
|
||||||
//---- conversion tick count <-> real time count
|
//---- conversion tick count <-> real time count
|
||||||
#ifdef SDK_ARM11
|
#ifdef SDK_ARM11
|
||||||
#define OS_TICK_CLOCK HW_CPU_CLOCK
|
#define OS_TICK_CLOCK HW_CPU_CLOCK
|
||||||
#define OS_TICK_PRESCALE 1
|
#define OS_TICK_PRESCALE 1
|
||||||
#define OS_TICK_HI_SHIFT 28 // 2の累乗単位でチック管理するのであれば32は指定できない(ロード値0では割り込みが発生しないため。最大31)
|
#define OS_TICK_HI_SHIFT 28 // 2の累乗単位でチック管理するのであれば32は指定できない(初期値0では割り込みが発生しないため、最大31)
|
||||||
#define OS_TICK_HI_LSB (1ULL<<OS_TICK_HI_SHIFT)
|
|
||||||
#define OS_TICK_LO_MASK ((u32)(OS_TICK_HI_LSB-1))
|
#define OS_TICK_LO_MASK ((u32)(OS_TICK_HI_LSB-1))
|
||||||
#define OS_TICK_LO_MSB ((u32)(OS_TICK_HI_LSB>>1))
|
#define OS_TICK_LO_MSB ((u32)(OS_TICK_HI_LSB>>1))
|
||||||
|
#define OS_TICK_HI_LSB (1ULL<<OS_TICK_HI_SHIFT)
|
||||||
#define OS_TICK_LO_LIMIT OS_TICK_HI_LSB
|
#define OS_TICK_LO_LIMIT OS_TICK_HI_LSB
|
||||||
#else // SDK_ARM9
|
#else // SDK_ARM9
|
||||||
#define OS_TICK_CLOCK HW_SYSTEM_CLOCK
|
#define OS_TICK_CLOCK HW_SYSTEM_CLOCK
|
||||||
#define OS_TICK_PRESCALE 64
|
#define OS_TICK_PRESCALE 64
|
||||||
#define OS_TICK_HI_SHIFT 16 // ロード値0でも割り込み発生
|
#ifndef OS_TICK_USE_2TIMERS
|
||||||
#define OS_TICK_HI_LSB (1ULL<<OS_TICK_HI_SHIFT)
|
#define OS_TICK_HI_SHIFT 16 // 初期値0でも割り込み発生
|
||||||
#define OS_TICK_LO_MASK ((u16)(OS_TICK_HI_LSB-1))
|
#define OS_TICK_LO_MASK ((u16)(OS_TICK_HI_LSB-1))
|
||||||
#define OS_TICK_LO_MSB ((u16)(OS_TICK_HI_LSB>>1))
|
#define OS_TICK_LO_MSB ((u16)(OS_TICK_HI_LSB>>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<<OS_TICK_HI_SHIFT)
|
||||||
#define OS_TICK_LO_LIMIT OS_TICK_HI_LSB
|
#define OS_TICK_LO_LIMIT OS_TICK_HI_LSB
|
||||||
#endif // SDK_ARM9
|
#endif // SDK_ARM9
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user