summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-06-16 18:03:10 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2013-06-16 18:21:49 +0200
commit852a82b90a5b718538642ebcffa25a168c98b329 (patch)
tree2c22fa31dd714526fe79ebbe7e5c8b5c129b2102
parent96b1d02b057164d4e521d7e9aa50ee5e1223008a (diff)
downloadrockbox-852a82b90a5b718538642ebcffa25a168c98b329.tar.gz
rockbox-852a82b90a5b718538642ebcffa25a168c98b329.zip
imx233: rewrite timrot using new register headers
Change-Id: Ia6dc7ac7e1fdf471a518111f5593bd96bc3acfac
-rw-r--r--firmware/target/arm/imx233/kernel-imx233.c2
-rw-r--r--firmware/target/arm/imx233/timer-imx233.c6
-rw-r--r--firmware/target/arm/imx233/timrot-imx233.c39
-rw-r--r--firmware/target/arm/imx233/timrot-imx233.h25
4 files changed, 18 insertions, 54 deletions
diff --git a/firmware/target/arm/imx233/kernel-imx233.c b/firmware/target/arm/imx233/kernel-imx233.c
index 752db68149..b3760a4782 100644
--- a/firmware/target/arm/imx233/kernel-imx233.c
+++ b/firmware/target/arm/imx233/kernel-imx233.c
@@ -33,7 +33,7 @@ void tick_start(unsigned int interval_in_ms)
33{ 33{
34 /* use the 1-kHz XTAL clock source */ 34 /* use the 1-kHz XTAL clock source */
35 imx233_setup_timer(TICK_TIMER_NR, true, interval_in_ms, 35 imx233_setup_timer(TICK_TIMER_NR, true, interval_in_ms,
36 HW_TIMROT_TIMCTRL__SELECT_1KHZ_XTAL, HW_TIMROT_TIMCTRL__PRESCALE_1, 36 BV_TIMROT_TIMCTRLn_SELECT__1KHZ_XTAL, BV_TIMROT_TIMCTRLn_PRESCALE__DIV_BY_1,
37 false, &tick_timer); 37 false, &tick_timer);
38} 38}
39 39
diff --git a/firmware/target/arm/imx233/timer-imx233.c b/firmware/target/arm/imx233/timer-imx233.c
index 4175dde95a..b3c3ad56e8 100644
--- a/firmware/target/arm/imx233/timer-imx233.c
+++ b/firmware/target/arm/imx233/timer-imx233.c
@@ -58,13 +58,13 @@ bool timer_set(long cycles, bool start)
58bool timer_start(IF_COP_VOID(int core)) 58bool timer_start(IF_COP_VOID(int core))
59{ 59{
60 imx233_setup_timer(USER_TIMER_NR, true, timer_cycles, 60 imx233_setup_timer(USER_TIMER_NR, true, timer_cycles,
61 HW_TIMROT_TIMCTRL__SELECT_32KHZ_XTAL, HW_TIMROT_TIMCTRL__PRESCALE_1, 61 BV_TIMROT_TIMCTRLn_SELECT__32KHZ_XTAL, BV_TIMROT_TIMCTRLn_PRESCALE__DIV_BY_1,
62 false, &timer_fn); 62 false, &timer_fn);
63 return true; 63 return true;
64} 64}
65 65
66void timer_stop(void) 66void timer_stop(void)
67{ 67{
68 imx233_setup_timer(USER_TIMER_NR, false, 0, HW_TIMROT_TIMCTRL__SELECT_NEVER_TICK, 68 imx233_setup_timer(USER_TIMER_NR, false, 0, BV_TIMROT_TIMCTRLn_SELECT__NEVER_TICK,
69 HW_TIMROT_TIMCTRL__PRESCALE_1, false, NULL); 69 BV_TIMROT_TIMCTRLn_PRESCALE__DIV_BY_1, false, NULL);
70} 70}
diff --git a/firmware/target/arm/imx233/timrot-imx233.c b/firmware/target/arm/imx233/timrot-imx233.c
index 327b1d16b1..723ecc31ab 100644
--- a/firmware/target/arm/imx233/timrot-imx233.c
+++ b/firmware/target/arm/imx233/timrot-imx233.c
@@ -28,7 +28,7 @@ void INT_TIMER##nr(void) \
28{ \ 28{ \
29 if(timer_fns[nr]) \ 29 if(timer_fns[nr]) \
30 timer_fns[nr](); \ 30 timer_fns[nr](); \
31 __REG_CLR(HW_TIMROT_TIMCTRL(nr)) = HW_TIMROT_TIMCTRL__IRQ; \ 31 BF_CLRn(TIMROT_TIMCTRLn, nr, IRQ); \
32} 32}
33 33
34define_timer_irq(0) 34define_timer_irq(0)
@@ -40,33 +40,20 @@ void imx233_setup_timer(unsigned timer_nr, bool reload, unsigned count,
40 unsigned src, unsigned prescale, bool polarity, imx233_timer_fn_t fn) 40 unsigned src, unsigned prescale, bool polarity, imx233_timer_fn_t fn)
41{ 41{
42 int oldstatus = disable_interrupt_save(IRQ_FIQ_STATUS); 42 int oldstatus = disable_interrupt_save(IRQ_FIQ_STATUS);
43
44 timer_fns[timer_nr] = fn;
45
46 HW_TIMROT_TIMCTRL(timer_nr) = src | prescale;
47 if(polarity)
48 __REG_SET(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__POLARITY;
49 if(reload)
50 {
51 __REG_SET(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__RELOAD;
52 /* manual says count - 1 for reload timers */
53 HW_TIMROT_TIMCOUNT(timer_nr) = count - 1;
54 }
55 else
56 HW_TIMROT_TIMCOUNT(timer_nr) = count;
57 /* only enable interrupt if function is set */ 43 /* only enable interrupt if function is set */
58 if(fn != NULL) 44 bool irq = fn != NULL;
59 { 45
60 /* enable interrupt */ 46 timer_fns[timer_nr] = fn;
61 imx233_icoll_enable_interrupt(INT_SRC_TIMER(timer_nr), true); 47
62 /* clear irq bit and enable */ 48 HW_TIMROT_TIMCTRLn(timer_nr) = BF_OR6(TIMROT_TIMCTRLn, SELECT(src),
63 __REG_CLR(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__IRQ; 49 PRESCALE(prescale), POLARITY(polarity), RELOAD(reload), IRQ(irq),
64 __REG_SET(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__IRQ_EN; 50 IRQ_EN(irq));
65 } 51
66 else 52 /* manual says count - 1 for reload timers */
67 imx233_icoll_enable_interrupt(INT_SRC_TIMER(timer_nr), false); 53 HW_TIMROT_TIMCOUNTn(timer_nr) = reload ? count - 1 : reload;
54 imx233_icoll_enable_interrupt(INT_SRC_TIMER(timer_nr), irq);
68 /* finally update */ 55 /* finally update */
69 __REG_SET(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__UPDATE; 56 BF_SETn(TIMROT_TIMCTRLn, timer_nr, UPDATE);
70 57
71 restore_interrupt(oldstatus); 58 restore_interrupt(oldstatus);
72} 59}
diff --git a/firmware/target/arm/imx233/timrot-imx233.h b/firmware/target/arm/imx233/timrot-imx233.h
index c79023da51..f7a7bc3f8d 100644
--- a/firmware/target/arm/imx233/timrot-imx233.h
+++ b/firmware/target/arm/imx233/timrot-imx233.h
@@ -24,30 +24,7 @@
24#include "system.h" 24#include "system.h"
25#include "cpu.h" 25#include "cpu.h"
26 26
27#define HW_TIMROT_BASE 0x80068000 27#include "regs/regs-timrot.h"
28
29#define HW_TIMROT_ROTCTRL (*(volatile uint32_t *)(HW_TIMROT_BASE + 0x0))
30
31#define HW_TIMROT_ROTCOUNT (*(volatile uint32_t *)(HW_TIMROT_BASE + 0x10))
32
33#define HW_TIMROT_TIMCTRL(i) (*(volatile uint32_t *)(HW_TIMROT_BASE + 0x20 + (i) * 0x20))
34#define HW_TIMROT_TIMCTRL__IRQ (1 << 15)
35#define HW_TIMROT_TIMCTRL__IRQ_EN (1 << 14)
36#define HW_TIMROT_TIMCTRL__POLARITY (1 << 8)
37#define HW_TIMROT_TIMCTRL__UPDATE (1 << 7)
38#define HW_TIMROT_TIMCTRL__RELOAD (1 << 6)
39#define HW_TIMROT_TIMCTRL__PRESCALE_1 (0 << 4)
40#define HW_TIMROT_TIMCTRL__PRESCALE_2 (1 << 4)
41#define HW_TIMROT_TIMCTRL__PRESCALE_4 (2 << 4)
42#define HW_TIMROT_TIMCTRL__PRESCALE_8 (3 << 4)
43#define HW_TIMROT_TIMCTRL__SELECT_NEVER_TICK 0
44#define HW_TIMROT_TIMCTRL__SELECT_32KHZ_XTAL 8
45#define HW_TIMROT_TIMCTRL__SELECT_8KHZ_XTAL 9
46#define HW_TIMROT_TIMCTRL__SELECT_4KHZ_XTAL 10
47#define HW_TIMROT_TIMCTRL__SELECT_1KHZ_XTAL 11
48#define HW_TIMROT_TIMCTRL__SELECT_TICK_ALWAYS 12
49
50#define HW_TIMROT_TIMCOUNT(i) (*(volatile uint32_t *)(HW_TIMROT_BASE + 0x30 + (i) * 0x20))
51 28
52typedef void (*imx233_timer_fn_t)(void); 29typedef void (*imx233_timer_fn_t)(void);
53 30