Jiffy Timer Using GABE
Removed dependency on SOF interrupt for jiffy timer, and switched it to GABE timer 3, which is based on the SOF frequency.
This commit is contained in:
parent
6edf66120c
commit
3a9f847add
|
@ -195,31 +195,31 @@ void initialize() {
|
|||
ind_init();
|
||||
log(LOG_INFO, "Indicators initialized");
|
||||
|
||||
txt_init();
|
||||
if (res = txt_a2560k_b_install()) {
|
||||
log(LOG_ERROR, "Could not install A2560K Channel B driver");
|
||||
} else {
|
||||
log(LOG_ERROR, "A2560K Channel B driver installed");
|
||||
}
|
||||
txt_init_screen(TXT_SCREEN_A2560K_B);
|
||||
txt_set_border(TXT_SCREEN_A2560K_B, 0, 0);
|
||||
txt_set_region(TXT_SCREEN_A2560K_B, 0);
|
||||
txt_fill(TXT_SCREEN_A2560K_B, 'Y');
|
||||
|
||||
txt_set_xy(TXT_SCREEN_A2560K_B, 0, 0);
|
||||
for (int x = 0; x < 600; x++) {
|
||||
txt_print(TXT_SCREEN_A2560K_B, "Hello! ");
|
||||
}
|
||||
|
||||
t_rect region;
|
||||
region.origin.x = 5;
|
||||
region.origin.y = 10;
|
||||
region.size.width = 20;
|
||||
region.size.height = 10;
|
||||
txt_set_region(TXT_SCREEN_A2560K_B, ®ion);
|
||||
txt_set_color(TXT_SCREEN_A2560K_B, 0x07, 0x00);
|
||||
txt_set_xy(TXT_SCREEN_A2560K_B, 0, 0);
|
||||
txt_fill(TXT_SCREEN_A2560K_B, ' ');
|
||||
// txt_init();
|
||||
// if (res = txt_a2560k_b_install()) {
|
||||
// log(LOG_ERROR, "Could not install A2560K Channel B driver");
|
||||
// } else {
|
||||
// log(LOG_ERROR, "A2560K Channel B driver installed");
|
||||
// }
|
||||
// txt_init_screen(TXT_SCREEN_A2560K_B);
|
||||
// txt_set_border(TXT_SCREEN_A2560K_B, 0, 0);
|
||||
// txt_set_region(TXT_SCREEN_A2560K_B, 0);
|
||||
// txt_fill(TXT_SCREEN_A2560K_B, 'Y');
|
||||
//
|
||||
// txt_set_xy(TXT_SCREEN_A2560K_B, 0, 0);
|
||||
// for (int x = 0; x < 600; x++) {
|
||||
// txt_print(TXT_SCREEN_A2560K_B, "Hello! ");
|
||||
// }
|
||||
//
|
||||
// t_rect region;
|
||||
// region.origin.x = 5;
|
||||
// region.origin.y = 10;
|
||||
// region.size.width = 20;
|
||||
// region.size.height = 10;
|
||||
// txt_set_region(TXT_SCREEN_A2560K_B, ®ion);
|
||||
// txt_set_color(TXT_SCREEN_A2560K_B, 0x07, 0x00);
|
||||
// txt_set_xy(TXT_SCREEN_A2560K_B, 0, 0);
|
||||
// txt_fill(TXT_SCREEN_A2560K_B, ' ');
|
||||
|
||||
// for (int x = 0; x < 15; x++) {
|
||||
// char buffer[80];
|
||||
|
|
9322
src/foenixmcp.s68
9322
src/foenixmcp.s68
File diff suppressed because it is too large
Load diff
64
src/include/A2560K/timers_a2560k.h
Normal file
64
src/include/A2560K/timers_a2560k.h
Normal file
|
@ -0,0 +1,64 @@
|
|||
/**
|
||||
* @file timers_a2560k.h
|
||||
*
|
||||
* Define timer registers on the A2560K
|
||||
*/
|
||||
|
||||
#ifndef __A2560K_TIMERS_H
|
||||
#define __A2560K_TIMERS_H
|
||||
|
||||
/** Timer control register 0: timers 0, 1, and 2 */
|
||||
#define TIMER_TCR0 ((unsigned long *)0xFEC00200)
|
||||
#define TCR_ENABLE_0 0x00000001 /** Enable counter 0 */
|
||||
#define TCR_CLEAR_0 0x00000002 /** Master clear of counter 0 */
|
||||
#define TCR_LOAD_0 0x00000004 /** Master load of counter 0 */
|
||||
#define TCR_CNTUP_0 0x00000008 /** Counter 0 Count up if 1, count down if 0 */
|
||||
#define TCR_INE_0 0x00000080 /** Interrupt enable for counter 0 */
|
||||
|
||||
#define TCR_ENABLE_1 0x00000100 /** Enable counter 1 */
|
||||
#define TCR_CLEAR_1 0x00000200 /** Master clear of counter 1 */
|
||||
#define TCR_LOAD_1 0x00000400 /** Master load of counter 1 */
|
||||
#define TCR_CNTUP_1 0x00000800 /** Counter 1 Count up if 1, count down if 0 */
|
||||
#define TCR_INE_1 0x00008000 /** Interrupt enable for counter 1 */
|
||||
|
||||
#define TCR_ENABLE_2 0x00010000 /** Enable counter 2 */
|
||||
#define TCR_CLEAR_2 0x00020000 /** Master clear of counter 2 */
|
||||
#define TCR_LOAD_2 0x00040000 /** Master load of counter 2 */
|
||||
#define TCR_CNTUP_2 0x00080000 /** Counter 2 Count up if 1, count down if 0 */
|
||||
#define TCR_INE_2 0x00800000 /** Interrupt enable for counter 2 */
|
||||
|
||||
/** Timer control register 1: timers 3 and 4 */
|
||||
#define TIMER_TCR1 ((unsigned long *)0xFEC00204)
|
||||
#define TCR_ENABLE_3 0x00000001 /** Enable counter 3 */
|
||||
#define TCR_CLEAR_3 0x00000002 /** Master clear of counter 3 */
|
||||
#define TCR_LOAD_3 0x00000004 /** Master load of counter 3 */
|
||||
#define TCR_CNTUP_3 0x00000008 /** Counter 3 Count up if 1, count down if 0 */
|
||||
#define TCR_RECLR_3 0x00000010 /** Enable reclear of timer 3 */
|
||||
#define TCR_RELOAD_3 0x00000020 /** Enable reload of timer 3 */
|
||||
#define TCR_INE_3 0x00000080 /** Interrupt enable for counter 3 */
|
||||
|
||||
#define TCR_ENABLE_4 0x00000100 /** Enable counter 4 */
|
||||
#define TCR_CLEAR_4 0x00000200 /** Master clear of counter 4 */
|
||||
#define TCR_LOAD_4 0x00000400 /** Master load of counter 4 */
|
||||
#define TCR_CNTUP_4 0x00000800 /** Counter 4 Count up if 1, count down if 0 */
|
||||
#define TCR_RECLR_4 0x00001000 /** Enable reclear of timer 4 */
|
||||
#define TCR_RELOAD_4 0x00002000 /** Enable reload of timer 4 */
|
||||
#define TCR_INE_4 0x00008000 /** Interrupt enable for counter 4 */
|
||||
|
||||
#define TCR_STAT_EQ0 0x08000000 /** Read only: timer 0 is equal to its comparison value */
|
||||
#define TCR_STAT_EQ1 0x10000000 /** Read only: timer 1 is equal to its comparison value */
|
||||
#define TCR_STAT_EQ2 0x20000000 /** Read only: timer 2 is equal to its comparison value */
|
||||
#define TCR_STAT_EQ3 0x40000000 /** Read only: timer 3 is equal to its comparison value */
|
||||
|
||||
#define TIMER_VALUE_0 ((unsigned long *)0xFEC00208)
|
||||
#define TIMER_COMPARE_0 ((unsigned long *)0xFEC0020C)
|
||||
#define TIMER_VALUE_1 ((unsigned long *)0xFEC00210)
|
||||
#define TIMER_COMPARE_1 ((unsigned long *)0xFEC00214)
|
||||
#define TIMER_VALUE_2 ((unsigned long *)0xFEC00218)
|
||||
#define TIMER_COMPARE_2 ((unsigned long *)0xFEC0021C)
|
||||
#define TIMER_VALUE_3 ((unsigned long *)0xFEC00220)
|
||||
#define TIMER_COMPARE_3 ((unsigned long *)0xFEC00224)
|
||||
#define TIMER_VALUE_4 ((unsigned long *)0xFEC00228)
|
||||
#define TIMER_COMPARE_4 ((unsigned long *)0xFEC0022C)
|
||||
|
||||
#endif
|
54
src/include/A2560U/timers_a2560u.h
Normal file
54
src/include/A2560U/timers_a2560u.h
Normal file
|
@ -0,0 +1,54 @@
|
|||
/**
|
||||
* @file timers_a2560u.h
|
||||
*
|
||||
* Define timer registers on the A2560U and U+
|
||||
*/
|
||||
|
||||
#ifndef __A2560U_TIMERS_H
|
||||
#define __A2560U_TIMERS_H
|
||||
|
||||
/** Timer control register 0: timers 0, 1, and 2 */
|
||||
#define TIMER_TCR0 ((unsigned long *)0x00B00200)
|
||||
#define TCR_ENABLE_0 0x00000001 /** Enable counter 0 */
|
||||
#define TCR_CLEAR_0 0x00000002 /** Master clear of counter 0 */
|
||||
#define TCR_LOAD_0 0x00000004 /** Master load of counter 0 */
|
||||
#define TCR_CNTUP_0 0x00000008 /** Counter 0 Count up if 1, count down if 0 */
|
||||
#define TCR_INE_0 0x00000080 /** Interrupt enable for counter 0 */
|
||||
|
||||
#define TCR_ENABLE_1 0x00000100 /** Enable counter 1 */
|
||||
#define TCR_CLEAR_1 0x00000200 /** Master clear of counter 1 */
|
||||
#define TCR_LOAD_1 0x00000400 /** Master load of counter 1 */
|
||||
#define TCR_CNTUP_1 0x00000800 /** Counter 1 Count up if 1, count down if 0 */
|
||||
#define TCR_INE_1 0x00008000 /** Interrupt enable for counter 1 */
|
||||
|
||||
#define TCR_ENABLE_2 0x00010000 /** Enable counter 2 */
|
||||
#define TCR_CLEAR_2 0x00020000 /** Master clear of counter 2 */
|
||||
#define TCR_LOAD_2 0x00040000 /** Master load of counter 2 */
|
||||
#define TCR_CNTUP_2 0x00080000 /** Counter 2 Count up if 1, count down if 0 */
|
||||
#define TCR_INE_2 0x00800000 /** Interrupt enable for counter 2 */
|
||||
|
||||
/** Timer control register 1: timer 3 */
|
||||
#define TIMER_TCR1 ((unsigned long *)0x00B00204)
|
||||
#define TCR_ENABLE_3 0x00000001 /** Enable counter 3 */
|
||||
#define TCR_CLEAR_3 0x00000002 /** Master clear of counter 3 */
|
||||
#define TCR_LOAD_3 0x00000004 /** Master load of counter 3 */
|
||||
#define TCR_CNTUP_3 0x00000008 /** Counter 3 Count up if 1, count down if 0 */
|
||||
#define TCR_RECLR_3 0x00000010 /** Enable reclear of timer 3 */
|
||||
#define TCR_RELOAD_3 0x00000020 /** Enable reload of timer 3 */
|
||||
#define TCR_INE_3 0x00000080 /** Interrupt enable for counter 3 */
|
||||
|
||||
#define TCR_STAT_EQ0 0x08000000 /** Read only: timer 0 is equal to its comparison value */
|
||||
#define TCR_STAT_EQ1 0x10000000 /** Read only: timer 1 is equal to its comparison value */
|
||||
#define TCR_STAT_EQ2 0x20000000 /** Read only: timer 2 is equal to its comparison value */
|
||||
#define TCR_STAT_EQ3 0x40000000 /** Read only: timer 3 is equal to its comparison value */
|
||||
|
||||
#define TIMER_VALUE_0 ((unsigned long *)0x00B00208)
|
||||
#define TIMER_COMPARE_0 ((unsigned long *)0x00B0020C)
|
||||
#define TIMER_VALUE_1 ((unsigned long *)0x00B00210)
|
||||
#define TIMER_COMPARE_1 ((unsigned long *)0x00B00214)
|
||||
#define TIMER_VALUE_2 ((unsigned long *)0x00B00218)
|
||||
#define TIMER_COMPARE_2 ((unsigned long *)0x00B0021C)
|
||||
#define TIMER_VALUE_3 ((unsigned long *)0x00B00220)
|
||||
#define TIMER_COMPARE_3 ((unsigned long *)0x00B00224)
|
||||
|
||||
#endif
|
16
src/include/timers_reg.h
Normal file
16
src/include/timers_reg.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
/**
|
||||
* @file timers_reg.h
|
||||
*
|
||||
* Load register definitions for the various timers on the Foenix
|
||||
*/
|
||||
|
||||
#ifndef __TIMERS_REG_H
|
||||
#define __TIMERS_REG_H
|
||||
|
||||
#if MODEL == MODEL_FOENIX_A2560K
|
||||
#include "A2560K/timers_a2560k.h"
|
||||
#elif MODEL == MODEL_FOENIX_A2560U || MODEL == MODEL_FOENIX_A2560U_PLUS
|
||||
#include "A2560U/timers_a2560u.h"
|
||||
#endif
|
||||
|
||||
#endif
|
18349
src/mapfile
18349
src/mapfile
File diff suppressed because it is too large
Load diff
20
src/timers.c
20
src/timers.c
|
@ -1,6 +1,7 @@
|
|||
#include "interrupt.h"
|
||||
#include "timers.h"
|
||||
#include "gabe_reg.h"
|
||||
#include "timers_reg.h"
|
||||
|
||||
long jiffy_count;
|
||||
|
||||
|
@ -19,13 +20,26 @@ void sof_a_handler() {
|
|||
void timers_init() {
|
||||
jiffy_count = 0;
|
||||
|
||||
int_register(INT_SOF_A, sof_a_handler);
|
||||
int_enable(INT_SOF_A);
|
||||
// int_register(INT_SOF_A, sof_a_handler);
|
||||
// int_enable(INT_SOF_A);
|
||||
|
||||
*TIMER_TCR0 = 0; // Reset timers 0, 1, and 2
|
||||
*TIMER_TCR1 = 0; // Reset timers 3, and 4 (if 4 is available)
|
||||
|
||||
// Clear timer 3
|
||||
|
||||
*TIMER_VALUE_3 = 0;
|
||||
*TIMER_TCR1 = TCR_ENABLE_3 | TCR_CNTUP_3 | TCR_CLEAR_3;
|
||||
|
||||
// Set timer 3 to count up and auto clear
|
||||
|
||||
*TIMER_TCR1 = TCR_ENABLE_3 | TCR_CNTUP_3;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the number of jiffies (1/60 of a second) since last reset time
|
||||
*/
|
||||
long timers_jiffies() {
|
||||
return jiffy_count;
|
||||
// return jiffy_count;
|
||||
return *TIMER_VALUE_3;
|
||||
}
|
||||
|
|
|
@ -7,6 +7,6 @@
|
|||
|
||||
#define VER_MAJOR 0
|
||||
#define VER_MINOR 3
|
||||
#define VER_BUILD 5
|
||||
#define VER_BUILD 6
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue