From d42041043b95617244ffdb9150c5e2f2720a8a83 Mon Sep 17 00:00:00 2001 From: Karl Kurbjun Date: Wed, 12 Nov 2008 03:57:32 +0000 Subject: Add in the needed crt0.S code for the wakeup alarm also git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19094 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/SOURCES | 2 + apps/plugins/rockboy/cpu.c | 3 +- apps/plugins/rockboy/lcd.c | 33 +++--- apps/plugins/rockboy/sound.c | 5 +- bootloader/gigabeat.c | 77 ++++++++++++- firmware/drivers/audio/wm8751.c | 2 + firmware/export/config-gigabeat.h | 3 + firmware/target/arm/s3c2440/crt0.S | 16 ++- firmware/target/arm/s3c2440/debug-s3c2440.c | 39 ++++++- .../target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c | 2 +- .../target/arm/s3c2440/gigabeat-fx/power-meg-fx.c | 121 +++++++++++++++++++++ .../target/arm/s3c2440/gigabeat-fx/system-meg-fx.c | 13 ++- 12 files changed, 284 insertions(+), 32 deletions(-) diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index a4ddbacfd0..edeaf216a8 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -143,6 +143,8 @@ iriverify.c iriver_flash.c #endif +gigabeat_flash.c + #endif /* iFP7xx */ #if (LCD_WIDTH > 138) && (LCD_DEPTH > 1) /* Built for bitmap targets except H10 5/6gb, Archoses, iPod mini, mrobe100 and ifp*/ diff --git a/apps/plugins/rockboy/cpu.c b/apps/plugins/rockboy/cpu.c index 1aca06f337..f1926fe421 100644 --- a/apps/plugins/rockboy/cpu.c +++ b/apps/plugins/rockboy/cpu.c @@ -333,8 +333,6 @@ void cpu_timers(int cnt) static int cpu_idle(int max) { - int cnt, unit; - if (!(cpu.halt && IME)) return 0; if (R_IF & R_IE) { @@ -353,6 +351,7 @@ static int cpu_idle(int max) return max; } + int cnt, unit; /* Figure out when the next timer interrupt will happen */ unit = ((-R_TAC) & 3) << 1; cnt = (511 - cpu.tim + (1<> unit; diff --git a/apps/plugins/rockboy/lcd.c b/apps/plugins/rockboy/lcd.c index da3b138e51..f62e3a9ce3 100644 --- a/apps/plugins/rockboy/lcd.c +++ b/apps/plugins/rockboy/lcd.c @@ -64,7 +64,7 @@ fb_data *vdest; static void updatepatpix(void) ICODE_ATTR; static void updatepatpix(void) { - int i, j; + int i; #if ((CONFIG_CPU != SH7034) && !defined(CPU_COLDFIRE)) int k, a, c; #endif @@ -73,10 +73,12 @@ static void updatepatpix(void) if (!anydirty) return; for (i = 0; i < 1024; i++) { + int j; if (i == 384) i = 512; if (i == 896) break; if (!patdirty[i]) continue; patdirty[i] = 0; + for (j = 0; j < 8; j++) { #if CONFIG_CPU == SH7034 @@ -376,8 +378,8 @@ static void tilebuf(void) int base; byte *tilemap, *attrmap; int *tilebuf; - int *wrap; - static int wraptable[64] = + const int *wrap; + static const int wraptable[64] ICONST_ATTR = { 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,-32 @@ -778,11 +780,11 @@ static void spr_enum(void) static void spr_scan(void) ICODE_ATTR; static void spr_scan(void) { - int i, x; - byte pal, b, ns = NS; - byte *src, *dest, *bg, *pri; + int i; + byte ns = NS; + byte *src, *dest; struct vissprite *vs; - static byte bgdup[256]; + static byte bgdup[256] IBSS_ATTR; if (!ns) return; @@ -791,7 +793,8 @@ static void spr_scan(void) for (; ns; ns--, vs--) { - x = vs->x; + int x = vs->x; + if (x > 159) continue; if (x < -7) continue; if (x < 0) @@ -807,23 +810,25 @@ static void spr_scan(void) if (x > 152) i = 160 - x; else i = 8; } - pal = vs->pal; + + byte pal = vs->pal; + if (vs->pri) { - bg = bgdup + (dest - BUF); + byte *bg = bgdup + (dest - BUF); while (i--) { - b = src[i]; + byte b = src[i]; if (b && !(bg[i]&3)) dest[i] = pal|b; } } else if (hw.cgb) { - bg = bgdup + (dest - BUF); - pri = PRI + (dest - BUF); + byte *bg = bgdup + (dest - BUF); + byte *pri = PRI + (dest - BUF); while (i--) { - b = src[i]; + byte b = src[i]; if (b && (!pri[i] || !(bg[i]&3))) dest[i] = pal|b; } diff --git a/apps/plugins/rockboy/sound.c b/apps/plugins/rockboy/sound.c index 041b7831d3..c1b06a1bd7 100644 --- a/apps/plugins/rockboy/sound.c +++ b/apps/plugins/rockboy/sound.c @@ -116,9 +116,6 @@ struct snd snd IBSS_ATTR; static void gbSoundChannel1(int *r, int *l) { int vol = S1.envol; - - int freq = 0; - int value = 0; if(S1.on && (S1.len || !S1.cont)) @@ -172,7 +169,7 @@ static void gbSoundChannel1(int *r, int *l) if(S1.swlen<=0) { - freq = (((int)(R_NR14&7) << 8) | R_NR13); + int freq = (((int)(R_NR14&7) << 8) | R_NR13); int updown = 1; diff --git a/bootloader/gigabeat.c b/bootloader/gigabeat.c index 6b3a68be6e..575e61c2fa 100644 --- a/bootloader/gigabeat.c +++ b/bootloader/gigabeat.c @@ -44,11 +44,29 @@ #include "rbunicode.h" #include "usb.h" #include "mmu-arm.h" +#include "rtc.h" #include char version[] = APPSVERSION; +void shutdown(void) +{ + /* We need to gracefully spin down the disk to prevent clicks. */ + if (ide_powered()) + { + /* Make sure ATA has been initialized. */ + ata_init(); + + /* And put the disk into sleep immediately. */ + ata_sleepnow(); + } + + _backlight_off(); + + power_off(); +} + void main(void) { unsigned char* loadbuffer; @@ -56,14 +74,67 @@ void main(void) int rc; int(*kernel_entry)(void); - power_init(); system_init(); lcd_init(); backlight_init(); + button_init(); font_init(); + kernel_init(); /* Need the kernel to sleep */ + adc_init(); lcd_setfont(FONT_SYSFIXED); + + if(!(GPGDAT&BUTTON_POWER) && charger_inserted()) + { + while(!(GPGDAT&BUTTON_POWER) && charger_inserted()) + { + char msg[20]; + if(charging_state()) + { + snprintf(msg,sizeof(msg),"Charging"); + } + else + { + snprintf(msg,sizeof(msg),"Charge Complete"); + } + reset_screen(); + lcd_putsxy( (LCD_WIDTH - (SYSFONT_WIDTH * strlen(msg))) / 2, + (LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg); + lcd_update(); + +#if defined(HAVE_RTC_ALARM) + /* Check if the alarm went off while charging */ + if(rtc_check_alarm_flag()) + { + GSTATUS4=1; /* Normally this is set in crt0.s */ + break; + } +#endif + } + if(!(GPGDAT&BUTTON_POWER) +#if defined(HAVE_RTC_ALARM) + && !GSTATUS4 +#endif + ) + { + shutdown(); + } + } + + if(button_hold()) + { + const char msg[] = "HOLD is enabled"; + reset_screen(); + lcd_putsxy( (LCD_WIDTH - (SYSFONT_WIDTH * strlen(msg))) / 2, + (LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg); + lcd_update(); + + sleep(2*HZ); + + shutdown(); + } + power_init(); usb_init(); /* Enter USB mode without USB thread */ @@ -88,9 +159,7 @@ void main(void) lcd_update(); } - kernel_init(); - adc_init(); - button_init(); + reset_screen(); /* Show debug messages if button is pressed */ if(button_read_device()) diff --git a/firmware/drivers/audio/wm8751.c b/firmware/drivers/audio/wm8751.c index 7145fe4ea4..439d50a5d0 100644 --- a/firmware/drivers/audio/wm8751.c +++ b/firmware/drivers/audio/wm8751.c @@ -219,6 +219,8 @@ void audiohw_close(void) /* 2. Disable all output buffers. */ wmcodec_write(PWRMGMT2, 0x0); + sleep(HZ); + /* 3. Switch off the power supplies. */ wmcodec_write(PWRMGMT1, 0x0); } diff --git a/firmware/export/config-gigabeat.h b/firmware/export/config-gigabeat.h index 0c5462400b..a75dbc8a55 100644 --- a/firmware/export/config-gigabeat.h +++ b/firmware/export/config-gigabeat.h @@ -10,6 +10,9 @@ /* For Rolo and boot loader */ #define MODEL_NUMBER 18 +/* Define RTC alarm */ +#define HAVE_RTC_ALARM + /* define this if you use an ATA controller */ #define CONFIG_STORAGE STORAGE_ATA diff --git a/firmware/target/arm/s3c2440/crt0.S b/firmware/target/arm/s3c2440/crt0.S index ff5eafd042..af0ef5bba8 100644 --- a/firmware/target/arm/s3c2440/crt0.S +++ b/firmware/target/arm/s3c2440/crt0.S @@ -49,8 +49,8 @@ vectors: /* Add some strings to detect the bootloader in flash and give it a version * number. (0x040A0028, 0x040A002C) */ -.string "ROCKBOX" -.word 0x0001 +.string "ROCKBOX\0" +.string "R 03.00\0" /* * Function: word_copy @@ -99,6 +99,18 @@ start: cmp r0, #0xA0000 bne poweron + /* Did an RTC event wake the player up? */ + + mov r2, #0x4A000000 + ldr r1, [r2] + ands r1, r1, #0x40000000 + + /* Woke up with the alarm - store a flag in GSTATUS3 */ + ldrne r2, =0x560000b8 + movne r1, #0x01 + strne r1, [r2] + bne poweron + /* Set GPG up to read power and menu status */ ldr r2, =0x56000050 ldr r1, [r2, #0x18] diff --git a/firmware/target/arm/s3c2440/debug-s3c2440.c b/firmware/target/arm/s3c2440/debug-s3c2440.c index 97b7123a43..6cd6d649cf 100644 --- a/firmware/target/arm/s3c2440/debug-s3c2440.c +++ b/firmware/target/arm/s3c2440/debug-s3c2440.c @@ -32,7 +32,44 @@ bool __dbg_hw_info(void) { - return false; + char buf[50]; + int line, button; + + char reg=0, value=0; + + lcd_clear_display(); + lcd_setfont(FONT_SYSFIXED); + + while(1) + { + line=0; + snprintf(buf, sizeof(buf), "reg: %08x value: %08x", reg, value); + lcd_puts(0, line++, buf); + + button = button_get_w_tmo(HZ/10); + + if (button == BUTTON_UP) + reg++; + if (button == BUTTON_DOWN) + reg--; + + if (button == BUTTON_VOL_UP) + value++; + if (button == BUTTON_VOL_DOWN) + value--; + + if (button == BUTTON_A) + { +// LCD_SPI_start(); +// LCD_SPI_setreg(reg, value); +// LCD_SPI_stop(); + } + + lcd_update(); + + if (button == (DEBUG_CANCEL|BUTTON_REL)) + return false; + } } bool __dbg_ports(void) diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c index ac8dc380e2..e09f628809 100644 --- a/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c +++ b/firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c @@ -244,7 +244,7 @@ static void LCD_SPI_init(void) /* LCD init */ void lcd_init_device(void) { -#ifdef BOOTLOADER +#if 0//def BOOTLOADER int i; /* When the Rockbox bootloader starts, we are changing framebuffer address, but we don't want what's shown on the LCD to change until we do an diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/power-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/power-meg-fx.c index 544869ab6c..d625c07cc8 100644 --- a/firmware/target/arm/s3c2440/gigabeat-fx/power-meg-fx.c +++ b/firmware/target/arm/s3c2440/gigabeat-fx/power-meg-fx.c @@ -70,6 +70,11 @@ void power_off(void) _backlight_off(); _buttonlight_off(); sleep(HZ); + + /* Do this to allow the drive to properly reset when player restarts + * immediately without running OF shutdown. + */ + GPGCON&=~0x00300000; /* Rockbox never properly shutdown the player. When the sleep bit is set * the player actually wakes up in some type of "zombie" state @@ -81,6 +86,122 @@ void power_off(void) CLKCON |=(1<<3); reboot_point(); + +#if 0 + + GPBCON=0x00015450; + GPBDAT=0x403; + GPBUP=0x3FD; + + GPCCON =0xAAA054A8; + GPCDAT =0x0000038C; + GPCUP =0xFFFF; + + + GPDCON =0xAAA0AAA5; + GPDDAT =0x00000300; + GPDUP =0xFCFF; + + + GPECON =0xAA8002AA; + GPEDAT =0x0000FFED; + GPEUP =0x3817; + + GPFCON =0x00000a00; + GPFDAT =0x000000F1; + GPFUP =0x000000FF; + + GPGCON =0x01401002; + GPGDAT =0x00000180; + GPGUP =0x0000FF7F; + + GPHCON =0x001540A5; + GPHDAT =0x000006FD; + GPHUP =0x00000187; + +// mine + INTMSK =0xFFFFFFFF; + EINTMASK=0x0FFFFEF0; + EXTINT0 =0xFFFFFECF; + EXTINT1 =0x07; +// + +// INTMSK=0xFFFFFFFF; +// EINTMASK=0x00200000; + +// GPHDAT=0x00000004; + +// EXTINT0=~0x00000130; +// INTMSK=(~0x00000130)+0x00000100; +// GPGUP=0xFFFFFFFF; + +//mine + INTMSK =0xFFFFFFDE; +// + + SRCPND=0xFFFFFFFF; + INTPND=0xFFFFFFFF; + GSTATUS1=0x00000600; + + ADCCON=0x00000004; + +// MISCCR=MISCCR&(~0x703000)|0x603000; + LCDCON1=0x00000000; + LOCKTIME=0xFFFFFFFF; +// REFRESH=REFRESH|0x00400000; + +// MISCCR=MISCCR|0x000E0000; + +// CLKCON=CLKCON|0x00004018; + + /* + * This next piece of code was taken from the linux 2.6.17 sources: + * linux/arch/arm/mach-s3c2410/sleep.S + * + * Copyright (c) 2004 Simtec Electronics + * Ben Dooks + * + * Based on PXA/SA1100 sleep code by: + * Nicolas Pitre, (c) 2002 Monta Vista Software Inc + * Cliff Brake, (c) 2001 + */ + + asm volatile + ( + /* get REFRESH, MISCCR, and CLKCON (and ensure in TLB) */ + "ldr r4, =0x48000024 \n" + "ldr r5, =0x56000080 \n" + "ldr r6, =0x4C00000C \n" + "ldr r7, [ r4 ] \n" + "ldr r8, [ r5 ] \n" + "ldr r9, [ r6 ] \n" + + /* Setup register writes */ + "ldr r2, =0x006E3000 \n" + "ldr r3, =0x00004018 \n" + "orr r7, r7, #0x00400000 \n" /* SDRAM sleep command */ + "orr r8, r8, r2 \n" /* SDRAM power-down signals */ + "orr r9, r9, r3 \n" /* power down command */ + + /* first as a trial-run to load cache */ + "teq pc, #0 \n" + "bl s3c2410_do_sleep \n" + + /* now do it for real */ + "teq r0, r0 \n" + "b s3c2410_do_sleep \n" + + /* align next bit of code to cache line */ + ".align 8 \n" + "s3c2410_do_sleep: \n" + "streq r7, [ r4 ] \n" /* SDRAM sleep command */ + "streq r8, [ r5 ] \n" /* SDRAM power-down config */ + "streq r3, [ r6 ] \n" /* CPU sleep */ + "1: \n" + "beq 1b \n" + "bx lr \n" + ); +#endif } #else /* SIMULATOR */ diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c index 8065926e28..96afa9b238 100644 --- a/firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c +++ b/firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c @@ -113,9 +113,14 @@ void system_reboot(void) static void set_page_tables(void) { - map_section(0, 0, 0x1000, CACHE_NONE); /* map every memory region to itself */ - map_section(0x30000000, 0, 32, CACHE_ALL); /* map RAM to 0 and enable caching for it */ - map_section((int)FRAME, (int)FRAME, 1, BUFFERED); /* enable buffered writing for the framebuffer */ + /* map every memory region to itself */ + map_section(0, 0, 0x1000, CACHE_NONE); + + /* map RAM to 0 and enable caching for it */ + map_section(0x30000000, 0, 32, CACHE_ALL); + + /* enable buffered writing for the framebuffer */ + map_section((int)FRAME, (int)FRAME, 1, BUFFERED); } void memory_init(void) { @@ -145,7 +150,7 @@ void s3c_regclr(volatile int *reg, unsigned int mask) void system_init(void) { INTMSK = 0xFFFFFFFF; - INTMOD = 0; + INTMOD = 0; SRCPND = 0xFFFFFFFF; INTPND = 0xFFFFFFFF; INTSUBMSK = 0xFFFFFFFF; -- cgit v1.2.3