175 lines
4.1 KiB
C
175 lines
4.1 KiB
C
|
/*Copyright 2020-2021 T-Head Semiconductor Co., Ltd.
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
*/
|
||
|
/*
|
||
|
* timer.h -- The interface functions and Mcros for SMART
|
||
|
*
|
||
|
*/
|
||
|
#include "config.h"
|
||
|
|
||
|
#ifndef __CSKY_DEMO_TIMER_H
|
||
|
#define __CSKY_DEMO_TIMER_H
|
||
|
|
||
|
#define TIMER_PERIOD 0xffffffff
|
||
|
|
||
|
extern int Loop_Num;
|
||
|
|
||
|
typedef struct CKS_TIMER
|
||
|
{
|
||
|
volatile unsigned int LoadCount; /* The value to be loaded into Timer */
|
||
|
volatile unsigned int CurrentValue; /* Timer Current Value */
|
||
|
volatile unsigned int Control; /* Timer Control Register */
|
||
|
volatile unsigned int EOI; /* Timer Clears the interrupt status */
|
||
|
volatile unsigned int IntStatus; /* Timer Contains the interrupt status */
|
||
|
}CKStruct_TIMER,* CKPStruct_TIMER;
|
||
|
|
||
|
#define SMART_TIMER_BASE 0x40011000
|
||
|
|
||
|
///* Contains the interrupt status of all timers in the component. */
|
||
|
//#define SMART_TIMER_INTSTATUS 0x10011028
|
||
|
//
|
||
|
///* Returns all zeroes (0) and clears all active interrupts */
|
||
|
//#define SMART_TIMER_EOI 0x1001102c
|
||
|
//
|
||
|
///* Contains the unmasked interrupt status of all timers in the component */
|
||
|
//#define SMART_TIMER_RAW_INTSTATUS (volatile unsigned int *)0x10011030
|
||
|
|
||
|
/*
|
||
|
* Start timer.
|
||
|
*/
|
||
|
static int start_timer()
|
||
|
{
|
||
|
#if CONFIG_SYS_SPARK
|
||
|
return 0;
|
||
|
#endif
|
||
|
CKPStruct_TIMER pTimer = (CKPStruct_TIMER)(SMART_TIMER_BASE);
|
||
|
pTimer->LoadCount = TIMER_PERIOD;
|
||
|
asm("":::"memory");
|
||
|
pTimer->Control = 0x00000003;
|
||
|
return pTimer->CurrentValue;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int start_set_timer(int a)
|
||
|
{
|
||
|
#if CONFIG_SYS_SPARK
|
||
|
return 0;
|
||
|
#endif
|
||
|
CKPStruct_TIMER pTimer = (CKPStruct_TIMER)(SMART_TIMER_BASE);
|
||
|
pTimer->LoadCount = a;
|
||
|
asm("":::"memory");
|
||
|
pTimer->Control = 0x00000003;
|
||
|
return pTimer->CurrentValue;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Get timer value
|
||
|
*/
|
||
|
static int get_timer()
|
||
|
{
|
||
|
#if CONFIG_SYS_SPARK
|
||
|
return 0;
|
||
|
#endif
|
||
|
CKPStruct_TIMER pTimer = (CKPStruct_TIMER)(SMART_TIMER_BASE);
|
||
|
return pTimer->CurrentValue;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Stop timer
|
||
|
*/
|
||
|
static int stop_timer()
|
||
|
{
|
||
|
#if CONFIG_SYS_SPARK
|
||
|
return 0;
|
||
|
#endif
|
||
|
int temp;
|
||
|
CKPStruct_TIMER pTimer = (CKPStruct_TIMER)(SMART_TIMER_BASE);
|
||
|
temp = pTimer->CurrentValue;
|
||
|
pTimer->Control = 0x00000002;
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
//Timer Interrupt Service
|
||
|
void CK_Timer_Interruptservice()
|
||
|
{
|
||
|
volatile int eoi;
|
||
|
CKPStruct_TIMER pTimer = (CKPStruct_TIMER)(SMART_TIMER_BASE);
|
||
|
eoi = pTimer->EOI;
|
||
|
Loop_Num++;
|
||
|
//return Loop_Num;
|
||
|
}
|
||
|
|
||
|
void Timer_Interrupt_Init()
|
||
|
{
|
||
|
// asm("lrw r1, INTER_BEGIN\n"
|
||
|
// ".ifdef ck610\n"
|
||
|
// "mfcr r2, cr1\n"
|
||
|
// ".else\n"
|
||
|
// "mfcr r2, cr<1, 0>\n"
|
||
|
// ".endif\n"
|
||
|
// "movi r3, 10\n"
|
||
|
// "lsli r3, r3, 2\n"
|
||
|
// "addu r2, r2, r3\n"
|
||
|
// "st.w r1, (r2,0)\n"
|
||
|
// "br INTER_END\n"
|
||
|
// "INTER_BEGIN:\n"
|
||
|
// "subi sp, 16\n"
|
||
|
// "st.w r0, (sp)\n"
|
||
|
// "st.w r13, (sp, 4)\n"
|
||
|
// "st.w r14, (sp, 8)\n"
|
||
|
// "st.w r15, (sp, 12)\n"
|
||
|
// "subi sp, 16\n"
|
||
|
//// "st.w r8, (sp)\n"
|
||
|
//// "st.w r9, (sp, 4)\n"
|
||
|
//// "st.w r10, (sp, 8)\n"
|
||
|
//// "st.w r11, (sp, 12)\n"
|
||
|
//// "subi sp, 16\n"
|
||
|
// "st.w r4, (sp)\n"
|
||
|
// "st.w r5, (sp, 4)\n"
|
||
|
// "st.w r6, (sp, 8)\n"
|
||
|
// "st.w r7, (sp, 12)\n"
|
||
|
// "subi sp, 16\n"
|
||
|
// "st.w r0, (sp)\n"
|
||
|
// "st.w r1, (sp, 4)\n"
|
||
|
// "st.w r2, (sp, 8)\n"
|
||
|
// "st.w r3, (sp, 12)\n"
|
||
|
// "bsr CK_Timer_Interruptservice\n"
|
||
|
// "ld.w r0, (sp)\n"
|
||
|
// "ld.w r1, (sp, 4)\n"
|
||
|
// "ld.w r2, (sp, 8)\n"
|
||
|
// "ld.w r3, (sp, 12)\n"
|
||
|
// "addi sp, 16\n"
|
||
|
// "ld.w r4, (sp)\n"
|
||
|
// "ld.w r5, (sp, 4)\n"
|
||
|
// "ld.w r6, (sp, 8)\n"
|
||
|
// "ld.w r7, (sp, 12)\n"
|
||
|
//// "addi sp, 16\n"
|
||
|
//// "ld.w r8, (sp)\n"
|
||
|
//// "ld.w r9, (sp, 4)\n"
|
||
|
//// "ld.w r10, (sp, 8)\n"
|
||
|
//// "ld.w r11, (sp, 12)\n"
|
||
|
// "addi sp, 16\n"
|
||
|
// "ld.w r0, (sp)\n"
|
||
|
// "ld.w r13, (sp, 4)\n"
|
||
|
// "ld.w r14, (sp, 8)\n"
|
||
|
// "ld.w r15, (sp, 12)\n"
|
||
|
// "addi sp, 16\n"
|
||
|
// "rte\n"
|
||
|
// "INTER_END:");
|
||
|
}
|
||
|
|