diff options
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/imx233/kernel-imx233.c | 2 | ||||
-rw-r--r-- | firmware/target/arm/imx233/timer-imx233.c | 6 | ||||
-rw-r--r-- | firmware/target/arm/imx233/timrot-imx233.c | 39 | ||||
-rw-r--r-- | firmware/target/arm/imx233/timrot-imx233.h | 25 |
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) | |||
58 | bool timer_start(IF_COP_VOID(int core)) | 58 | bool 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 | ||
66 | void timer_stop(void) | 66 | void 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 | ||
34 | define_timer_irq(0) | 34 | define_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 | ||
52 | typedef void (*imx233_timer_fn_t)(void); | 29 | typedef void (*imx233_timer_fn_t)(void); |
53 | 30 | ||