mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
タイマーライブラリ追加。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@87 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
parent
c17002f94f
commit
63c169ea3c
46
trunk/bootrom/build/libraries/os/ARM11/Makefile
Normal file
46
trunk/bootrom/build/libraries/os/ARM11/Makefile
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: CtrBrom - libraries - os
|
||||||
|
# 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 =
|
||||||
|
SUBMAKES =
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# build ARM & THUMB libraries
|
||||||
|
BROM_CODEGEN_ALL ?= TRUE
|
||||||
|
|
||||||
|
SRCDIR = . ../common
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
os_timer.c \
|
||||||
|
|
||||||
|
TARGET_LIB = libos$(BROM_LIBSUFFIX).a
|
||||||
|
|
||||||
|
include $(CTRBROM_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
INSTALL_TARGETS = $(TARGETS)
|
||||||
|
INSTALL_DIR = $(BROM_INSTALL_LIBDIR)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
include $(CTRBROM_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
334
trunk/bootrom/build/libraries/os/ARM11/os_timer.c
Normal file
334
trunk/bootrom/build/libraries/os/ARM11/os_timer.c
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - libraries - OS
|
||||||
|
File: os_timer.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:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#include <brom/os.h>
|
||||||
|
#include <brom/memorymap.h>
|
||||||
|
|
||||||
|
void timer_handler(void);
|
||||||
|
|
||||||
|
#if 0 // miya
|
||||||
|
static void i_osTimerInterruptHandler(void);
|
||||||
|
static void i_osWatchdogInterruptHandler( void );
|
||||||
|
#endif
|
||||||
|
static void i_osStartTimer( u32 count, u8 preScale, OSTimerRepeat repeat, OSTimerIntrReq ireq );
|
||||||
|
static void i_osStartWatchDog( u32 count, u8 preScale, OSTimerRepeat repeat, OSTimerIntrReq ireq,
|
||||||
|
OSWatchdogMode watchdogMode );
|
||||||
|
|
||||||
|
static u32 osTimerClock = OS_TIMER_CLOCK_DEFAULT;
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInitTimer
|
||||||
|
|
||||||
|
Description: Initialize Timers
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osInitTimer( void )
|
||||||
|
{
|
||||||
|
static BOOL isInit;
|
||||||
|
|
||||||
|
if ( isInit == FALSE )
|
||||||
|
{
|
||||||
|
isInit = TRUE;
|
||||||
|
|
||||||
|
osInitInterrupt();
|
||||||
|
|
||||||
|
osTimerClock = OS_TIMER_CLOCK_DEFAULT;
|
||||||
|
|
||||||
|
osDisableTimerAndWatchdog();
|
||||||
|
osStopTimer();
|
||||||
|
osStopWatchDog();
|
||||||
|
|
||||||
|
osSetInterruptHandler( OS_INTR_ID_TIMER, timer_handler );
|
||||||
|
//osSetInterruptHandler( OS_INTR_ID_TIMER, timer_handler );
|
||||||
|
//osSetInterruptHandler( OS_INTR_ID_WATCHDOG, i_osWatchdogInterruptHandler );
|
||||||
|
|
||||||
|
reg_OS_IDR_SET_IE0 = REG_OS_IDR_SET_IE0_TM_MASK;
|
||||||
|
|
||||||
|
osEnableTimerAndWatchdog();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osTimerInterruptHandler
|
||||||
|
|
||||||
|
Description: Timer interrupt handler
|
||||||
|
|
||||||
|
Arguments: None.
|
||||||
|
|
||||||
|
Returns: None.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#if 0 // miya
|
||||||
|
static void i_osTimerInterruptHandler( void )
|
||||||
|
{
|
||||||
|
reg_OS_CPUTM_EVT = HW_CPUTM_EVT_FLAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osWatchdogInterruptHandler
|
||||||
|
|
||||||
|
Description: Watchdog interrupt handler
|
||||||
|
|
||||||
|
Arguments: None.
|
||||||
|
|
||||||
|
Returns: None.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
static void i_osWatchdogInterruptHandler( void )
|
||||||
|
{
|
||||||
|
reg_OS_CPUWD_EVT = HW_CPUWD_EVT_FLAG;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osStartTimerWithUSec
|
||||||
|
|
||||||
|
Description: Start Timer
|
||||||
|
|
||||||
|
Arguments: micro second
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osStartTimerWithUSec( u32 usec, u8 preScale )
|
||||||
|
{
|
||||||
|
u32 count = ((usec) * (osTimerClock / 1000)) / (preScale+1) / 1000;
|
||||||
|
|
||||||
|
i_osStartTimer( count, preScale, OS_TM_AUTO_RELOAD, OS_TM_INTR_REQ_ENABLE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osStartTimerWithMSec
|
||||||
|
|
||||||
|
Description: Start Timer
|
||||||
|
|
||||||
|
Arguments: milli second
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osStartTimerWithMSec( u32 msec, u8 preScale )
|
||||||
|
{
|
||||||
|
u32 count = (((msec) * osTimerClock / 1000)) / (preScale+1);
|
||||||
|
|
||||||
|
i_osStartTimer( count, preScale, OS_TM_AUTO_RELOAD, OS_TM_INTR_REQ_ENABLE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osStartTimer
|
||||||
|
|
||||||
|
Description: Start Timer
|
||||||
|
|
||||||
|
Arguments: interval
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osStartTimer( u32 count, u8 preScale )
|
||||||
|
{
|
||||||
|
i_osStartTimer( count, preScale, OS_TM_AUTO_RELOAD, OS_TM_INTR_REQ_ENABLE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osStartWatchdog
|
||||||
|
|
||||||
|
Description: Start Watchdog
|
||||||
|
|
||||||
|
Arguments: interval
|
||||||
|
watchdogMode
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osStartWatchDog( u32 count, u8 preScale, OSWatchdogMode watchdogMode )
|
||||||
|
{
|
||||||
|
i_osStartWatchDog( count, preScale, OS_TM_AUTO_RELOAD, OS_TM_INTR_REQ_DISABLE, watchdogMode );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osStartTimer
|
||||||
|
|
||||||
|
Description: Start Timer
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void i_osStartTimer( u32 count, u8 preScale, OSTimerRepeat repeat, OSTimerIntrReq ireq )
|
||||||
|
{
|
||||||
|
OSIntrMode intr = osDisableInterrupts();
|
||||||
|
|
||||||
|
reg_OS_TM_CNT = 0;
|
||||||
|
reg_OS_TM_LD = count;
|
||||||
|
reg_OS_TM_CNT = REG_OS_TM_CNT_E_MASK | repeat | ireq
|
||||||
|
| ((preScale <<REG_OS_TM_CNT_PS_SHIFT) & REG_OS_TM_CNT_PS_MASK);
|
||||||
|
|
||||||
|
osRestoreInterrupts( intr );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osStartWatchdog
|
||||||
|
|
||||||
|
Description: Start Watchdog
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void i_osStartWatchDog( u32 count, u8 preScale, OSTimerRepeat repeat, OSTimerIntrReq ireq,
|
||||||
|
OSWatchdogMode watchdogMode )
|
||||||
|
{
|
||||||
|
reg_OS_WD_CNT = 0;
|
||||||
|
reg_OS_WD_LD = count;
|
||||||
|
reg_OS_WD_CNT = REG_OS_WD_CNT_E_MASK | repeat | ireq
|
||||||
|
| ((preScale <<REG_OS_WD_CNT_PS_SHIFT) & REG_OS_WD_CNT_PS_MASK)
|
||||||
|
| watchdogMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osStopTimer
|
||||||
|
|
||||||
|
Description: Stop Timer
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osStopTimer( void )
|
||||||
|
{
|
||||||
|
reg_OS_TM_CNT = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osStopWatchdog
|
||||||
|
|
||||||
|
Description: Stop Watchdog
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osStopWatchDog( void )
|
||||||
|
{
|
||||||
|
reg_OS_WD_CNT = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osResetWatchdog
|
||||||
|
|
||||||
|
Description: Reset Watchdog
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osResetWatchdog( void )
|
||||||
|
{
|
||||||
|
reg_OS_WD_RST = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osDisableWatchdog
|
||||||
|
|
||||||
|
Description: Disable Watchdog
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osDisableWatchdog( void )
|
||||||
|
{
|
||||||
|
reg_OS_WD_DIS = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <brom/code32.h>
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osEnableTimerAndWatchdog
|
||||||
|
|
||||||
|
Description: Enable Timer & Watchdog
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: previous status
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
ASM BOOL osEnableTimerAndWatchdog( void )
|
||||||
|
{
|
||||||
|
stmfd sp!, {r4, lr} // stack requires 8byte alignment
|
||||||
|
|
||||||
|
bl __cpp(osDisableInterrupts)
|
||||||
|
|
||||||
|
mrc p15, 0, r4, c15, c12, 0
|
||||||
|
orr r1, r4, #HW_C15_COUNT_ENABLE
|
||||||
|
mcr p15, 0, r1, c15, c12, 0
|
||||||
|
|
||||||
|
// 引数 r0 は osDisableInterrupts の返り値
|
||||||
|
bl __cpp(osRestoreInterrupts)
|
||||||
|
|
||||||
|
and r0, r4, #HW_CPUTM_ENABLE // retuen value
|
||||||
|
ldmfd sp!, {r4, pc} // stack requires 8byte alignment
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osDisableTimerAndWatchdog
|
||||||
|
|
||||||
|
Description: Enable Timer & Watchdog
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: previous status
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
ASM BOOL osDisableTimerAndWatchdog( void )
|
||||||
|
{
|
||||||
|
stmfd sp!, {r4, lr} // stack requires 8byte alignment
|
||||||
|
|
||||||
|
bl __cpp(osDisableInterrupts)
|
||||||
|
|
||||||
|
mrc p15, 0, r4, c15, c12, 0
|
||||||
|
bic r1, r4, #HW_C15_COUNT_ENABLE
|
||||||
|
mcr p15, 0, r1, c15, c12, 0
|
||||||
|
|
||||||
|
// 引数 r0 は osDisableInterrupts の返り値
|
||||||
|
bl __cpp(osRestoreInterrupts)
|
||||||
|
|
||||||
|
and r0, r4, #HW_CPUTM_ENABLE // retuen value
|
||||||
|
ldmfd sp!, {r4, pc} // stack requires 8byte alignment
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <brom/codereset.h>
|
||||||
|
|
||||||
|
/*====== End of main.c ======*/
|
||||||
55
trunk/bootrom/build/libraries/os/ARM9/Makefile
Normal file
55
trunk/bootrom/build/libraries/os/ARM9/Makefile
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlBrom - libraries_sp - os
|
||||||
|
# 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 =
|
||||||
|
#SUBMAKES = Makefile.CALLTRACE \
|
||||||
|
# Makefile.FUNCTIONCOST
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# build ARM & THUMB libraries
|
||||||
|
BROM_CODEGEN_ALL ?= TRUE
|
||||||
|
|
||||||
|
# Codegen for sub processer
|
||||||
|
BROM_PROC = ARM9
|
||||||
|
|
||||||
|
SRCDIR = . ../common
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
os_tick.c \
|
||||||
|
os_timer.c \
|
||||||
|
|
||||||
|
TARGET_LIB = libos_sp$(BROM_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
include $(CTRBROM_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
INSTALL_TARGETS = $(TARGETS)
|
||||||
|
INSTALL_DIR = $(BROM_INSTALL_LIBDIR)
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
include $(CTRBROM_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
201
trunk/bootrom/build/libraries/os/ARM9/os_tick.c
Normal file
201
trunk/bootrom/build/libraries/os/ARM9/os_tick.c
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - libraries - OS
|
||||||
|
File: os_tick.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:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#include <brom/os.h>
|
||||||
|
#include <brom/memorymap.h>
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
//---- 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 )
|
||||||
|
|
||||||
|
//---- timer number tick uses
|
||||||
|
#define OSi_TICK_TIMER OS_TIMER_3
|
||||||
|
|
||||||
|
//---- timer interrupt mask (must be same number with OSi_TICK_TIMER)
|
||||||
|
#define OSi_TICK_IE_TIMER REG_OS_IF_T3_MASK
|
||||||
|
|
||||||
|
//---- timer interrupt ID
|
||||||
|
#define OSi_TICK_IE_TIMER_ID OS_INTR_ID_TIMER3
|
||||||
|
|
||||||
|
//---- flag for initialization tick
|
||||||
|
static u16 i_osUseTick = FALSE;
|
||||||
|
|
||||||
|
//---- tick counter
|
||||||
|
vu64 i_osTickCounter;
|
||||||
|
|
||||||
|
//---- flag for need to re-set timer
|
||||||
|
BOOL i_osNeedResetTimer = FALSE;
|
||||||
|
|
||||||
|
extern u16 i_osIsTimerReserved(int timerNum);
|
||||||
|
extern void i_osSetTimerReserved(int timerNum);
|
||||||
|
|
||||||
|
static void i_osCountUpTick(void);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInitTick
|
||||||
|
|
||||||
|
Description: initialize 'tick system'
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osInitTick(void)
|
||||||
|
{
|
||||||
|
if (!i_osUseTick)
|
||||||
|
{
|
||||||
|
i_osUseTick = TRUE;
|
||||||
|
|
||||||
|
//---- OS reserves OSi_TICK_TIMER timer
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(OSi_TICK_TIMER));
|
||||||
|
i_osSetTimerReserved(OSi_TICK_TIMER);
|
||||||
|
|
||||||
|
//---- setting timer
|
||||||
|
i_osTickCounter = 0;
|
||||||
|
i_osSetTimerControl(OSi_TICK_TIMER, 0);
|
||||||
|
i_osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)0);
|
||||||
|
i_osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL);
|
||||||
|
|
||||||
|
//---- set interrupt callback
|
||||||
|
osSetInterruptHandler( OS_INTR_ID_TIMER3, i_osCountUpTick );
|
||||||
|
osSetMultiInterruptMask( OS_INTR_ID_TIMER3, (OSIntrMask)0xffffffff ); // ?, osInitTimerの真似
|
||||||
|
|
||||||
|
//---- enable timer interrupt
|
||||||
|
osEnableInterruptID(OSi_TICK_IE_TIMER_ID);
|
||||||
|
|
||||||
|
//---- need to reset
|
||||||
|
i_osNeedResetTimer = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osIsTickAvailable
|
||||||
|
|
||||||
|
Description: check tick system is available
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: if available, TRUE.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL osIsTickAvailable(void)
|
||||||
|
{
|
||||||
|
return i_osUseTick;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osCountUpTick
|
||||||
|
|
||||||
|
Description: timer interrupt handle.
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
static void i_osCountUpTick(void)
|
||||||
|
{
|
||||||
|
i_osTickCounter++;
|
||||||
|
|
||||||
|
//---- setting for timer
|
||||||
|
if (i_osNeedResetTimer)
|
||||||
|
{
|
||||||
|
i_osSetTimerControl(OSi_TICK_TIMER, 0);
|
||||||
|
i_osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)0);
|
||||||
|
i_osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL);
|
||||||
|
|
||||||
|
i_osNeedResetTimer = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// これはやらなくても、毎回コールバックがかかるから問題ない?
|
||||||
|
// //---- reset callback
|
||||||
|
// OSi_EnterTimerCallback(OSi_TICK_TIMER, (void (*)(void *))i_osCountUpTick, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osGetTick
|
||||||
|
|
||||||
|
Description: get tick value
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: tick value
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
u64 osGetTick(void)
|
||||||
|
{
|
||||||
|
vu16 countL;
|
||||||
|
vu64 countH;
|
||||||
|
|
||||||
|
OSIntrMode prev = osDisableInterrupts();
|
||||||
|
SDK_ASSERT(i_osUseTick);
|
||||||
|
|
||||||
|
countL = *(REGType16 *)((u32)REG_TM0CNT_L_ADDR + OSi_TICK_TIMER * 4);
|
||||||
|
countH = i_osTickCounter & 0xffffffffffffULL;
|
||||||
|
|
||||||
|
//---- check if timer interrupt bit is on
|
||||||
|
if (reg_OS_IF & OSi_TICK_IE_TIMER && !(countL & 0x8000))
|
||||||
|
{
|
||||||
|
countH++;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)osRestoreInterrupts(prev);
|
||||||
|
|
||||||
|
return (countH << 16) | countL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osGetTickLo
|
||||||
|
|
||||||
|
Description: get tick value (only u16 part)
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: tick value (only u16 part)
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
u16 osGetTickLo(void)
|
||||||
|
{
|
||||||
|
SDK_ASSERT(OSi_UseTick);
|
||||||
|
return *(REGType16 *)((u32)REG_TM0CNT_L_ADDR + OSi_TICK_TIMER * 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osSetTick
|
||||||
|
|
||||||
|
Description: set tick value
|
||||||
|
|
||||||
|
Arguments: count value of tick to be set
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void osSetTick(u64 count)
|
||||||
|
{
|
||||||
|
OSIntrMode prev;
|
||||||
|
|
||||||
|
SDK_ASSERT(i_osUseTick);
|
||||||
|
prev = osDisableInterrupts();
|
||||||
|
|
||||||
|
reg_OS_IF = OSi_TICK_IE_TIMER;
|
||||||
|
|
||||||
|
i_osNeedResetTimer = TRUE;
|
||||||
|
|
||||||
|
i_osTickCounter = (u64)(count >> 16);
|
||||||
|
|
||||||
|
i_osSetTimerControl(OSi_TICK_TIMER, 0);
|
||||||
|
i_osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)(count & 0xffff));
|
||||||
|
i_osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL);
|
||||||
|
|
||||||
|
(void)osRestoreInterrupts(prev);
|
||||||
|
}
|
||||||
274
trunk/bootrom/build/libraries/os/ARM9/os_timer.c
Normal file
274
trunk/bootrom/build/libraries/os/ARM9/os_timer.c
Normal file
@ -0,0 +1,274 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: CtrBrom - libraries - OS
|
||||||
|
File: os_timer.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:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#include <brom/os.h>
|
||||||
|
#include <brom/memorymap.h>
|
||||||
|
|
||||||
|
void timer_handler(void);
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
#define REG_OS_TMCNT_H_E_MASK REG_OS_TM0CNT_H_E_MASK
|
||||||
|
#define REG_OS_TMCNT_H_I_MASK REG_OS_TM0CNT_H_I_MASK
|
||||||
|
#define REG_OS_TMCNT_H_CH_MASK REG_OS_TM1CNT_H_CH_MASK
|
||||||
|
|
||||||
|
//---- if OS reserved each timer, bit=1
|
||||||
|
static u8 i_osTimerReserved[OS_TIMER_NUM];
|
||||||
|
|
||||||
|
u8 i_osIsTimerReserved(int timerNum);
|
||||||
|
void i_osSetTimerReserved(int timerNum);
|
||||||
|
void i_osUnsetTimerReserved(int timerNum);
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: osInitTimer
|
||||||
|
|
||||||
|
Description: Initialize Timers
|
||||||
|
|
||||||
|
Arguments: None
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void osInitTimer( void )
|
||||||
|
{
|
||||||
|
static BOOL isInit;
|
||||||
|
|
||||||
|
if ( isInit == FALSE )
|
||||||
|
{
|
||||||
|
isInit = TRUE;
|
||||||
|
|
||||||
|
osInitInterrupt();
|
||||||
|
|
||||||
|
i_osStopTimer64();
|
||||||
|
|
||||||
|
{
|
||||||
|
OSIntrMask imask = 0xffffffff;
|
||||||
|
|
||||||
|
osSetInterruptHandler( OS_INTR_ID_TIMER1, timer_handler );
|
||||||
|
osSetMultiInterruptMask( OS_INTR_ID_TIMER1, imask );
|
||||||
|
}
|
||||||
|
|
||||||
|
osEnableInterruptID( OS_INTR_ID_TIMER1 );
|
||||||
|
|
||||||
|
i_osStartTimer32( OS_TIMER32_01, (u32)i_osMSecToTick32( 1 ), OS_TIMER_PRESCALER_64 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//================================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osIsTimerReserved
|
||||||
|
|
||||||
|
Description: check if specified timer is reserved for OS
|
||||||
|
|
||||||
|
Arguments: timerNum : timerNo (0-3)
|
||||||
|
|
||||||
|
Returns: non-0 if reserved
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
u8 i_osIsTimerReserved( int timer_id )
|
||||||
|
{
|
||||||
|
return i_osTimerReserved[timer_id];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osSetTimerReserved
|
||||||
|
|
||||||
|
Description: set specified timer to reserved for OS
|
||||||
|
|
||||||
|
Arguments: timerNum : timerNo (0-3)
|
||||||
|
|
||||||
|
Returns: None.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void i_osSetTimerReserved( int timer_id )
|
||||||
|
{
|
||||||
|
i_osTimerReserved[timer_id] = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osUnsetTimerReserved
|
||||||
|
|
||||||
|
Description: unset specified timer to reserved for OS
|
||||||
|
|
||||||
|
Arguments: timerNum : timerNo (0-3)
|
||||||
|
|
||||||
|
Returns: None.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void i_osUnsetTimerReserved( int timer_id )
|
||||||
|
{
|
||||||
|
i_osTimerReserved[timer_id] = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//================================================================================
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osStartTimer
|
||||||
|
|
||||||
|
Description: set timer(s) and start
|
||||||
|
|
||||||
|
Arguments: id timerNo
|
||||||
|
count count value to be set to timer
|
||||||
|
preScale preScale
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
//
|
||||||
|
// use 1 timer, 16bit counter, timer<id> interrupt occurs by overflow
|
||||||
|
//
|
||||||
|
void i_osStartTimer( OSTimer id, u16 count, OSTimerPrescaler preScale )
|
||||||
|
{
|
||||||
|
SDK_ASSERT(OS_TIMER_0 <= id && id <= OS_TIMER_3);
|
||||||
|
SDK_ASSERT(OS_TIMER_PRESCALER_1 <= preScale && preScale <= OS_TIMER_PRESCALER_1024);
|
||||||
|
//---- check if system reserved
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id));
|
||||||
|
|
||||||
|
i_osSetTimerCount(id, (u16)~count);
|
||||||
|
i_osSetTimerControl(id, (u16)(REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_I_MASK | preScale));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// use 2 timers, 32bit counter, timer<id+1> interrupt occurs by overflow
|
||||||
|
//
|
||||||
|
void i_osStartTimer32( OSTimer32 id, u32 count, OSTimerPrescaler preScale )
|
||||||
|
{
|
||||||
|
SDK_ASSERT(OS_TIMER32_01 <= id && id <= OS_TIMER32_23);
|
||||||
|
SDK_ASSERT(OS_TIMER_PRESCALER_1 <= preScale && preScale <= OS_TIMER_PRESCALER_1024);
|
||||||
|
//---- check if system reserved
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id + 1));
|
||||||
|
|
||||||
|
i_osSetTimerCount((OSTimer)((int)id + 1), (u16)((~count >> 16) & 0xffff));
|
||||||
|
i_osSetTimerCount((OSTimer)id, (u16)(~count & 0xffff));
|
||||||
|
|
||||||
|
i_osSetTimerControl((OSTimer)((int)id + 1),
|
||||||
|
REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_I_MASK | REG_OS_TMCNT_H_CH_MASK);
|
||||||
|
i_osSetTimerControl((OSTimer)id, (u16)(REG_OS_TMCNT_H_E_MASK | preScale));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// use 3 timers, 48bit counter, timer<id+2> interrupt occurs by overflow
|
||||||
|
//
|
||||||
|
void i_osStartTimer48( OSTimer48 id, u64 count, OSTimerPrescaler preScale )
|
||||||
|
{
|
||||||
|
SDK_ASSERT(OS_TIMER48_012 <= id && id <= OS_TIMER48_123);
|
||||||
|
SDK_ASSERT(OS_TIMER_PRESCALER_1 <= preScale && preScale <= OS_TIMER_PRESCALER_1024);
|
||||||
|
//---- check if system reserved
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id + 1));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id + 2));
|
||||||
|
|
||||||
|
i_osSetTimerCount((OSTimer)((int)id + 2), (u16)((~count >> 32) & 0xffff));
|
||||||
|
i_osSetTimerCount((OSTimer)((int)id + 1), (u16)((~count >> 16) & 0xffff));
|
||||||
|
i_osSetTimerCount((OSTimer)id, (u16)(~count & 0xffff));
|
||||||
|
|
||||||
|
i_osSetTimerControl((OSTimer)((int)id + 2),
|
||||||
|
REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_I_MASK | REG_OS_TMCNT_H_CH_MASK);
|
||||||
|
i_osSetTimerControl((OSTimer)((int)id + 1), REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_CH_MASK);
|
||||||
|
i_osSetTimerControl((OSTimer)id, (u16)(REG_OS_TMCNT_H_E_MASK | preScale));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// use all 4 timers, 64bit counter, timer3 interrupt occurs by overflow
|
||||||
|
//
|
||||||
|
void i_osStartTimer64( u64 count, OSTimerPrescaler preScale )
|
||||||
|
{
|
||||||
|
SDK_ASSERT(OS_TIMER_PRESCALER_1 <= preScale && preScale <= OS_TIMER_PRESCALER_1024);
|
||||||
|
//---- check if system reserved
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_0));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_1));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_2));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_3));
|
||||||
|
|
||||||
|
i_osSetTimerCount(OS_TIMER_3, (u16)((~count >> 48) & 0xffff));
|
||||||
|
i_osSetTimerCount(OS_TIMER_2, (u16)((~count >> 32) & 0xffff));
|
||||||
|
i_osSetTimerCount(OS_TIMER_1, (u16)((~count >> 16) & 0xffff));
|
||||||
|
i_osSetTimerCount(OS_TIMER_0, (u16)(~count & 0xffff));
|
||||||
|
|
||||||
|
i_osSetTimerControl(OS_TIMER_3,
|
||||||
|
REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_I_MASK | REG_OS_TMCNT_H_CH_MASK);
|
||||||
|
i_osSetTimerControl(OS_TIMER_2, REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_CH_MASK);
|
||||||
|
i_osSetTimerControl(OS_TIMER_1, REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_CH_MASK);
|
||||||
|
i_osSetTimerControl(OS_TIMER_0, (u16)(REG_OS_TMCNT_H_E_MASK | preScale));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: i_osStopTimer
|
||||||
|
|
||||||
|
Description: stop timer(s)
|
||||||
|
|
||||||
|
Arguments: id timerNo
|
||||||
|
|
||||||
|
Returns: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
//
|
||||||
|
// stop a timer
|
||||||
|
//
|
||||||
|
void i_osStopTimer( OSTimer id )
|
||||||
|
{
|
||||||
|
SDK_ASSERT(OS_TIMER_0 <= id && id <= OS_TIMER_3);
|
||||||
|
//---- check if system reserved
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id));
|
||||||
|
|
||||||
|
i_osSetTimerControl(id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// stop 2 timers
|
||||||
|
//
|
||||||
|
void i_osStopTimer32( OSTimer32 id )
|
||||||
|
{
|
||||||
|
SDK_ASSERT(OS_TIMER32_01 <= id && id <= OS_TIMER32_23);
|
||||||
|
//---- check if system reserved
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id + 1));
|
||||||
|
|
||||||
|
i_osStopTimer((OSTimer)((int)id + 1));
|
||||||
|
i_osStopTimer((OSTimer)id);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// stop 3 timers
|
||||||
|
//
|
||||||
|
void i_osStopTimer48( OSTimer48 id )
|
||||||
|
{
|
||||||
|
SDK_ASSERT(OS_TIMER48_012 <= id && id <= OS_TIMER48_123);
|
||||||
|
//---- check if system reserved
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id + 1));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(id + 2));
|
||||||
|
|
||||||
|
i_osStopTimer((OSTimer)((int)id + 2));
|
||||||
|
i_osStopTimer((OSTimer)((int)id + 1));
|
||||||
|
i_osStopTimer((OSTimer)id);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// stop all 4 timers
|
||||||
|
//
|
||||||
|
void i_osStopTimer64( void )
|
||||||
|
{
|
||||||
|
//---- check if system reserved
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_0));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_1));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_2));
|
||||||
|
SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_3));
|
||||||
|
|
||||||
|
i_osStopTimer(OS_TIMER_3);
|
||||||
|
i_osStopTimer(OS_TIMER_2);
|
||||||
|
i_osStopTimer(OS_TIMER_1);
|
||||||
|
i_osStopTimer(OS_TIMER_0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
34
trunk/bootrom/build/libraries/os/Makefile
Normal file
34
trunk/bootrom/build/libraries/os/Makefile
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: CtrBrom - libraries - os
|
||||||
|
# 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$
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
include $(CTRBROM_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SUBDIRS = ARM11
|
||||||
|
|
||||||
|
#ifdef CTR_WITH_ARM9
|
||||||
|
SUBDIRS += ARM9
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
include $(CTRBROM_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
@ -24,6 +24,8 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define OS_TIMER_CLOCK_DEFAULT HW_CPU_CLOCK
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
//---- timer ID
|
//---- timer ID
|
||||||
@ -41,6 +43,20 @@ typedef enum
|
|||||||
}
|
}
|
||||||
OSWatchdogMode;
|
OSWatchdogMode;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
OS_TM_AUTO_RELOAD = HW_CPUTM_AUTO_RELOAD,
|
||||||
|
OS_TM_SINGLE_SHOT = HW_CPUTM_SINGLE_SHOT
|
||||||
|
}
|
||||||
|
OSTimerRepeat;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
OS_TM_INTR_REQ_ENABLE = HW_CPUTM_INTR_ENABLE,
|
||||||
|
OS_TM_INTR_REQ_DISABLE = 0
|
||||||
|
}
|
||||||
|
OSTimerIntrReq;
|
||||||
|
|
||||||
|
|
||||||
void osInitTimer( void );
|
void osInitTimer( void );
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user