summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Kurbjun <kkurbjun@gmail.com>2008-11-12 03:57:32 +0000
committerKarl Kurbjun <kkurbjun@gmail.com>2008-11-12 03:57:32 +0000
commitd42041043b95617244ffdb9150c5e2f2720a8a83 (patch)
tree71acbd2f8d8d51423d29ddbb2349ed23f77c3151
parent68c686957b1b62671d727116e5c167cd8f080148 (diff)
downloadrockbox-d42041043b95617244ffdb9150c5e2f2720a8a83.zip
rockbox-d42041043b95617244ffdb9150c5e2f2720a8a83.tar.gz
rockbox-d42041043b95617244ffdb9150c5e2f2720a8a83.tar.bz2
rockbox-d42041043b95617244ffdb9150c5e2f2720a8a83.tar.xz
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
-rw-r--r--apps/plugins/SOURCES2
-rw-r--r--apps/plugins/rockboy/cpu.c3
-rw-r--r--apps/plugins/rockboy/lcd.c33
-rw-r--r--apps/plugins/rockboy/sound.c5
-rw-r--r--bootloader/gigabeat.c77
-rw-r--r--firmware/drivers/audio/wm8751.c2
-rw-r--r--firmware/export/config-gigabeat.h3
-rw-r--r--firmware/target/arm/s3c2440/crt0.S16
-rw-r--r--firmware/target/arm/s3c2440/debug-s3c2440.c39
-rw-r--r--firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c2
-rw-r--r--firmware/target/arm/s3c2440/gigabeat-fx/power-meg-fx.c121
-rw-r--r--firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c13
12 files changed, 284 insertions, 32 deletions
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index a4ddbac..edeaf21 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 1aca06f..f1926fe 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)) >> unit;
diff --git a/apps/plugins/rockboy/lcd.c b/apps/plugins/rockboy/lcd.c
index da3b138..f62e3a9 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 041b783..c1b06a1 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 6b3a68b..575e61c 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 <stdarg.h>
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 7145fe4..439d50a 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 0c54624..a75dbc8 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 ff5eafd..af0ef5b 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 97b7123..6cd6d64 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 ac8dc38..e09f628 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 544869a..d625c07 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 <ben@simtec.co.uk>
+ *
+ * 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 8065926..96afa9b 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;