From 6c55d0d11c287642d2551ed766657271e6bb3914 Mon Sep 17 00:00:00 2001 From: amiconn Date: Fri, 4 Apr 2008 19:38:46 +0000 Subject: [PATCH] Allow to select the core for running the user timer on portalplayer targets. * Incompatible plugin API change -> sorted API. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16965 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugin.c | 4 ++-- apps/plugin.h | 8 ++++---- apps/plugins/alpine_cdc.c | 4 ++-- apps/plugins/doom/i_system.c | 2 +- apps/plugins/lib/grey_core.c | 2 +- apps/plugins/metronome.c | 2 +- apps/plugins/test_scanrate.c | 3 ++- apps/plugins/video.c | 6 ++++-- firmware/backlight.c | 5 +++-- firmware/export/timer.h | 3 ++- firmware/timer.c | 19 ++++++++++++++----- 11 files changed, 36 insertions(+), 22 deletions(-) diff --git a/apps/plugin.c b/apps/plugin.c index 7c3fab107..66e3d634d 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -144,6 +144,7 @@ static const struct plugin_api rockbox_api = { #if CONFIG_CHARGING backlight_set_timeout_plugged, #endif + is_backlight_on, gui_syncsplash, #ifdef HAVE_REMOTE_LCD @@ -477,7 +478,7 @@ static const struct plugin_api rockbox_api = { # endif #endif #ifdef HAVE_USB_POWER - usb_powered, + usb_powered, #endif /* misc */ @@ -576,7 +577,6 @@ static const struct plugin_api rockbox_api = { /* new stuff at the end, sort into place next time the API gets incompatible */ - is_backlight_on, }; int plugin_load(const char* plugin, void* parameter) diff --git a/apps/plugin.h b/apps/plugin.h index cfbd3e72a..c63868875 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -120,12 +120,12 @@ #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 106 +#define PLUGIN_API_VERSION 107 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any new function which are "waiting" at the end of the function table) */ -#define PLUGIN_MIN_API_VERSION 105 +#define PLUGIN_MIN_API_VERSION 107 /* plugin return codes */ enum plugin_status { @@ -235,6 +235,7 @@ struct plugin_api { #if CONFIG_CHARGING void (*backlight_set_timeout_plugged)(int index); #endif + bool (*is_backlight_on)(bool ignore_always_off); void (*splash)(int ticks, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3); #ifdef HAVE_REMOTE_LCD @@ -394,7 +395,7 @@ struct plugin_api { #endif bool (*timer_register)(int reg_prio, void (*unregister_callback)(void), long cycles, int int_prio, - void (*timer_callback)(void)); + void (*timer_callback)(void) IF_COP(, int core)); void (*timer_unregister)(void); bool (*timer_set_period)(long count); @@ -722,7 +723,6 @@ struct plugin_api { /* new stuff at the end, sort into place next time the API gets incompatible */ - bool (*is_backlight_on)(bool ignore_always_off); }; /* plugin header */ diff --git a/apps/plugins/alpine_cdc.c b/apps/plugins/alpine_cdc.c index 919ce181f..f781509e8 100644 --- a/apps/plugins/alpine_cdc.c +++ b/apps/plugins/alpine_cdc.c @@ -231,11 +231,11 @@ void timer_set_mode(int mode) if (mode == TM_RX_TIMEOUT) { - rb->timer_register(1, NULL, gTimer.timeout, 11, timer4_isr); + rb->timer_register(1, NULL, gTimer.timeout, 11, timer4_isr IF_COP(, CPU)); } else if (mode == TM_TRANSMIT) { - rb->timer_register(1, NULL, gTimer.transmit, 14, timer4_isr); + rb->timer_register(1, NULL, gTimer.transmit, 14, timer4_isr IF_COP(, CPU)); } else { diff --git a/apps/plugins/doom/i_system.c b/apps/plugins/doom/i_system.c index 4a2274340..09a61808f 100644 --- a/apps/plugins/doom/i_system.c +++ b/apps/plugins/doom/i_system.c @@ -109,7 +109,7 @@ int I_GetTime (void) void I_Init (void) { #if defined(HAVE_LCD_COLOR) && !defined(SIMULATOR) && !defined(RB_PROFILE) - rb->timer_register(1, NULL, TIMER_FREQ/TICRATE, 1, doomtime); + rb->timer_register(1, NULL, TIMER_FREQ/TICRATE, 1, doomtime IF_COP(, CPU)); #endif I_InitSound(); } diff --git a/apps/plugins/lib/grey_core.c b/apps/plugins/lib/grey_core.c index 5125d7743..20c33a60f 100644 --- a/apps/plugins/lib/grey_core.c +++ b/apps/plugins/lib/grey_core.c @@ -603,7 +603,7 @@ void grey_show(bool enable) _grey_info.rb->cpu_boost(true); #endif _grey_info.rb->timer_register(1, NULL, TIMER_FREQ / LCD_SCANRATE, 1, - _timer_isr); + _timer_isr IF_COP(, CPU)); #endif /* !SIMULATOR */ _grey_info.rb->screen_dump_set_hook(grey_screendump_hook); } diff --git a/apps/plugins/metronome.c b/apps/plugins/metronome.c index 571e085b5..d05e881f4 100644 --- a/apps/plugins/metronome.c +++ b/apps/plugins/metronome.c @@ -322,7 +322,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){ #endif /* CONFIG_CODEC != SWCODEC */ calc_period(); - rb->timer_register(1, NULL, TIMER_FREQ/1024, 1, timer_callback); + rb->timer_register(1, NULL, TIMER_FREQ/1024, 1, timer_callback IF_COP(, CPU)); draw_display(); diff --git a/apps/plugins/test_scanrate.c b/apps/plugins/test_scanrate.c index aabc623d9..e88ac99a0 100644 --- a/apps/plugins/test_scanrate.c +++ b/apps/plugins/test_scanrate.c @@ -150,7 +150,8 @@ int plugin_main(void) rb->cpu_boost(true); #endif /* The actual frequency is twice the displayed value */ - rb->timer_register(1, NULL, TIMER_FREQ * 5 / scan_rate, 1, timer_isr); + rb->timer_register(1, NULL, TIMER_FREQ * 5 / scan_rate, 1, + timer_isr IF_COP(, CPU)); while (!done) { diff --git a/apps/plugins/video.c b/apps/plugins/video.c index fa1646d11..3e7e53aec 100644 --- a/apps/plugins/video.c +++ b/apps/plugins/video.c @@ -540,9 +540,11 @@ int SeekTo(int fd, int nPos) gPlay.bVideoUnderrun = false; /* start display interrupt */ #if FREQ == 12000000 /* Ondio speed kludge */ - rb->timer_register(1, NULL, gPlay.nFrameTimeAdjusted, 1, timer4_isr); + rb->timer_register(1, NULL, gPlay.nFrameTimeAdjusted, 1, + timer4_isr IF_COP(, CPU)); #else - rb->timer_register(1, NULL, gFileHdr.video_frametime, 1, timer4_isr); + rb->timer_register(1, NULL, gFileHdr.video_frametime, 1, + timer4_isr IF_COP(, CPU)); #endif } diff --git a/firmware/backlight.c b/firmware/backlight.c index 4126b82a2..a09521de9 100644 --- a/firmware/backlight.c +++ b/firmware/backlight.c @@ -289,7 +289,8 @@ static void backlight_dim(int value) if (bl_timer_active) return ; - if (timer_register(0, backlight_release_timer, 2, 0, backlight_isr)) + if (timer_register(0, backlight_release_timer, 2, 0, backlight_isr + IF_COP(, CPU))) { #ifdef _BACKLIGHT_FADE_BOOST /* Prevent cpu frequency changes while dimming. */ @@ -813,7 +814,7 @@ void remote_backlight_on(void) {} void remote_backlight_off(void) {} void remote_backlight_set_timeout(int value) {(void)value;} -bool is_remote_backlight_on(bool ignore_always_off) +bool is_remote_backlight_on(bool ignore_always_off) { (void)ignore_always_off; return true; diff --git a/firmware/export/timer.h b/firmware/export/timer.h index 21995ef45..08bf7b13e 100644 --- a/firmware/export/timer.h +++ b/firmware/export/timer.h @@ -39,7 +39,8 @@ #define TIMER_FREQ CPU_FREQ #endif bool timer_register(int reg_prio, void (*unregister_callback)(void), - long cycles, int int_prio, void (*timer_callback)(void)); + long cycles, int int_prio, void (*timer_callback)(void) + IF_COP(,int core)); bool timer_set_period(long cycles); #ifdef CPU_COLDFIRE void timers_adjust_prescale(int multiplier, bool enable_irq); diff --git a/firmware/timer.c b/firmware/timer.c index d15ba6444..23df27122 100644 --- a/firmware/timer.c +++ b/firmware/timer.c @@ -25,12 +25,12 @@ #include "logf.h" static int timer_prio = -1; -void (*pfn_timer)(void) = NULL; /* timer callback */ -void (*pfn_unregister)(void) = NULL; /* unregister callback */ +void NOCACHEBSS_ATTR (*pfn_timer)(void) = NULL; /* timer callback */ +void NOCACHEBSS_ATTR (*pfn_unregister)(void) = NULL; /* unregister callback */ #ifdef CPU_COLDFIRE static int base_prescale; #elif defined CPU_PP || CONFIG_CPU == PNX0101 -static long cycles_new = 0; +static long NOCACHEBSS_ATTR cycles_new = 0; #endif /* interrupt handler */ @@ -201,6 +201,8 @@ static bool timer_set(long cycles, bool start) pfn_unregister(); pfn_unregister = NULL; } + CPU_INT_CLR = TIMER2_MASK; + COP_INT_CLR = TIMER2_MASK; } if (start || (cycles_new == -1)) /* within isr, cycles_new is "locked" */ TIMER2_CFG = 0xc0000000 | (cycles - 1); /* enable timer */ @@ -236,7 +238,8 @@ void timers_adjust_prescale(int multiplier, bool enable_irq) /* Register a user timer, called every TIMER_FREQ cycles */ bool timer_register(int reg_prio, void (*unregister_callback)(void), - long cycles, int int_prio, void (*timer_callback)(void)) + long cycles, int int_prio, void (*timer_callback)(void) + IF_COP(, int core)) { if (reg_prio <= timer_prio || cycles == 0) return false; @@ -264,7 +267,12 @@ bool timer_register(int reg_prio, void (*unregister_callback)(void), return true; #elif defined(CPU_PP) /* unmask interrupt source */ - CPU_INT_EN = TIMER2_MASK; +#if NUM_CORES > 1 + if (core == COP) + COP_INT_EN = TIMER2_MASK; + else +#endif + CPU_INT_EN = TIMER2_MASK; return true; #elif CONFIG_CPU == PNX0101 irq_set_int_handler(IRQ_TIMER1, TIMER1_ISR); @@ -301,6 +309,7 @@ void timer_unregister(void) #elif defined(CPU_PP) TIMER2_CFG = 0; /* stop timer 2 */ CPU_INT_CLR = TIMER2_MASK; + COP_INT_CLR = TIMER2_MASK; #elif CONFIG_CPU == PNX0101 TIMER1.ctrl &= ~0x80; /* disable timer 1 */ irq_disable_int(IRQ_TIMER1); -- 2.11.4.GIT