diff --git a/bootloader/SOURCES b/bootloader/SOURCES index 0c9aa8ba2f..8c3a9b8ee4 100644 --- a/bootloader/SOURCES +++ b/bootloader/SOURCES @@ -1,5 +1,9 @@ #if (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020) ipod.c +#elif defined(SANSA_E200) +e200.c +#elif defined(IRIVER_H10) +h10.c #else main.c #endif diff --git a/bootloader/e200.c b/bootloader/e200.c new file mode 100644 index 0000000000..2cf78942a2 --- /dev/null +++ b/bootloader/e200.c @@ -0,0 +1,353 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2005 by Dave Chapman + * + * Based on ipod.c by Dave Chapman + * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing + * and the ipodlinux bootloader by Daniel Palffy and Bernard Leach + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "config.h" + +#include +#include +#include +#include "cpu.h" +#include "system.h" +#include "lcd.h" +#include "kernel.h" +#include "thread.h" +#include "ata.h" +#include "fat.h" +#include "disk.h" +#include "font.h" +#include "adc.h" +#include "backlight.h" +#include "panic.h" +#include "power.h" +#include "file.h" + +#define XSC(X) #X +#define SC(X) XSC(X) + +#define DRAM_START 0x10000000 + +#define BUTTON_LEFT 1 +#define BUTTON_MENU 2 +#define BUTTON_RIGHT 3 +#define BUTTON_PLAY 4 +#define BUTTON_HOLD 5 + +/* Size of the buffer to store the loaded Rockbox/Linux image */ +#define MAX_LOADSIZE (4*1024*1024) + +char version[] = APPSVERSION; + +typedef struct _image { + unsigned type; /* '' */ + unsigned id; /* */ + unsigned pad1; /* 0000 0000 */ + unsigned devOffset; /* byte offset of start of image code */ + unsigned len; /* length in bytes of image */ + void *addr; /* load address */ + unsigned entryOffset; /* execution start within image */ + unsigned chksum; /* checksum for image */ + unsigned vers; /* image version */ + unsigned loadAddr; /* load address for image */ +} image_t; + +extern image_t boot_table[]; + +int line=0; + +static void memmove16(void *dest, const void *src, unsigned count) +{ + struct bufstr { + unsigned _buf[4]; + } *d, *s; + + if (src >= dest) { + count = (count + 15) >> 4; + d = (struct bufstr *) dest; + s = (struct bufstr *) src; + while (count--) + *d++ = *s++; + } else { + count = (count + 15) >> 4; + d = (struct bufstr *)(dest + (count <<4)); + s = (struct bufstr *)(src + (count <<4)); + while (count--) + *--d = *--s; + } +} + +#if CONFIG_KEYPAD == IPOD_4G_PAD && !defined(IPOD_MINI) +/* check if number of seconds has past */ +int timer_check(int clock_start, unsigned int usecs) +{ + if ((USEC_TIMER - clock_start) >= usecs) { + return 1; + } else { + return 0; + } +} + +static void ser_opto_keypad_cfg(int val) +{ + int start_time; + + outl(inl(0x6000d004) & ~0x80, 0x6000d004); + + outl(inl(0x7000c104) | 0xc000000, 0x7000c104); + outl(val, 0x7000c120); + outl(inl(0x7000c100) | 0x80000000, 0x7000c100); + + outl(inl(0x6000d024) & ~0x10, 0x6000d024); + outl(inl(0x6000d014) | 0x10, 0x6000d014); + + start_time = USEC_TIMER; + do { + if ((inl(0x7000c104) & 0x80000000) == 0) { + break; + } + } while (timer_check(start_time, 1500) != 0); + + outl(inl(0x7000c100) & ~0x80000000, 0x7000c100); + + outl(inl(0x6000d004) | 0x80, 0x6000d004); + outl(inl(0x6000d024) | 0x10, 0x6000d024); + outl(inl(0x6000d014) & ~0x10, 0x6000d014); + + outl(inl(0x7000c104) | 0xc000000, 0x7000c104); + outl(inl(0x7000c100) | 0x60000000, 0x7000c100); +} + +int opto_keypad_read(void) +{ + int loop_cnt, had_io = 0; + + for (loop_cnt = 5; loop_cnt != 0;) + { + int key_pressed = 0; + int start_time; + unsigned int key_pad_val; + + ser_opto_keypad_cfg(0x8000023a); + + start_time = USEC_TIMER; + do { + if (inl(0x7000c104) & 0x4000000) { + had_io = 1; + break; + } + + if (had_io != 0) { + break; + } + } while (timer_check(start_time, 1500) != 0); + + key_pad_val = inl(0x7000c140); + if ((key_pad_val & ~0x7fff0000) != 0x8000023a) { + loop_cnt--; + } else { + key_pad_val = (key_pad_val << 11) >> 27; + key_pressed = 1; + } + + outl(inl(0x7000c100) | 0x60000000, 0x7000c100); + outl(inl(0x7000c104) | 0xc000000, 0x7000c104); + + if (key_pressed != 0) { + return key_pad_val ^ 0x1f; + } + } + + return 0; +} +#endif + +static int key_pressed(void) +{ + unsigned char state; + +#if CONFIG_KEYPAD == IPOD_4G_PAD +#ifdef IPOD_MINI /* mini 1G only */ + state = GPIOA_INPUT_VAL & 0x3f; + if ((state & 0x10) == 0) return BUTTON_LEFT; + if ((state & 0x2) == 0) return BUTTON_MENU; + if ((state & 0x4) == 0) return BUTTON_PLAY; + if ((state & 0x8) == 0) return BUTTON_RIGHT; +#else + state = opto_keypad_read(); + if ((state & 0x4) == 0) return BUTTON_LEFT; + if ((state & 0x10) == 0) return BUTTON_MENU; + if ((state & 0x8) == 0) return BUTTON_PLAY; + if ((state & 0x2) == 0) return BUTTON_RIGHT; +#endif +#elif CONFIG_KEYPAD == IPOD_3G_PAD + state = inb(0xcf000030); + if (((state & 0x20) == 0)) return BUTTON_HOLD; /* hold on */ + if ((state & 0x08) == 0) return BUTTON_LEFT; + if ((state & 0x10) == 0) return BUTTON_MENU; + if ((state & 0x04) == 0) return BUTTON_PLAY; + if ((state & 0x01) == 0) return BUTTON_RIGHT; +#endif + return 0; +} + +int load_rockbox(unsigned char* buf) +{ + int fd; + int rc; + int len; + unsigned long chksum; + char model[5]; + unsigned long sum; + int i; + char str[80]; + + fd = open("/.rockbox/" BOOTFILE, O_RDONLY); + if(fd < 0) + { + fd = open("/" BOOTFILE, O_RDONLY); + if(fd < 0) + return -1; + } + + len = filesize(fd) - 8; + + if (len > MAX_LOADSIZE) + return -6; + + lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET); + + rc = read(fd, &chksum, 4); + chksum=betoh32(chksum); /* Rockbox checksums are big-endian */ + if(rc < 4) + return -2; + + rc = read(fd, model, 4); + if(rc < 4) + return -3; + + model[4] = 0; + + snprintf(str, 80, "Model: %s", model); + lcd_puts(0, line++, str); + snprintf(str, 80, "Checksum: %x", chksum); + lcd_puts(0, line++, str); + lcd_update(); + + lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET); + + rc = read(fd, buf, len); + if(rc < len) + return -4; + + close(fd); + + sum = MODEL_NUMBER; + + for(i = 0;i < len;i++) { + sum += buf[i]; + } + + snprintf(str, 80, "Sum: %x", sum); + lcd_puts(0, line++, str); + lcd_update(); + + if(sum != chksum) + return -5; + + return len; +} + + +/* A buffer to load the Linux kernel or Rockbox into */ +unsigned char loadbuffer[MAX_LOADSIZE]; + +void* main(void) +{ + char buf[256]; + int imageno=0; + int i; + int rc; + int padding = 0x4400; + image_t *tblp = boot_table; + void* entry; + struct partinfo* pinfo; + unsigned short* identify_info; + + /* Turn on the backlight */ + +#if CONFIG_BACKLIGHT==BL_IPOD4G + /* brightness full */ + outl(0x80000000 | (0xff << 16), 0x7000a010); + + /* set port B03 on */ + outl(((0x100 | 1) << 3), 0x6000d824); + +#elif CONFIG_BACKLIGHT==BL_IPODMINI + /* set port B03 on */ + outl(((0x100 | 1) << 3), 0x6000d824); + +#elif CONFIG_BACKLIGHT==BL_IPODNANO + + /* set port B03 on */ + outl(((0x100 | 1) << 3), 0x6000d824); + + /* set port L07 on */ + outl(((0x100 | 1) << 7), 0x6000d12c); +#elif CONFIG_BACKLIGHT==BL_IPOD3G + outl(inl(IPOD_LCD_BASE) | 0x2, IPOD_LCD_BASE); +#endif + + /* Return the start address in loaded image */ + return entry; +} + +/* These functions are present in the firmware library, but we reimplement + them here because the originals do a lot more than we want */ + +void reset_poweroff_timer(void) +{ +} + +int dbg_ports(void) +{ + return 0; +} + +void mpeg_stop(void) +{ +} + +void usb_acknowledge(void) +{ +} + +void usb_wait_for_disconnect(void) +{ +} + +void sys_poweroff(void) +{ +} + +void system_reboot(void) +{ + +} diff --git a/firmware/FILES b/firmware/FILES index d12ba2dace..a99deba0b4 100644 --- a/firmware/FILES +++ b/firmware/FILES @@ -16,3 +16,4 @@ target/arm/*.[chS] target/sh/*.[chS] target/coldfire/*.[chS] target/coldfire/iaudio/x5/*.[chS] +target/arm/sandisk/sansa-e200/*.[chS] diff --git a/firmware/SOURCES b/firmware/SOURCES index 601fcab3a2..a4f35a2d6f 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -96,12 +96,12 @@ drivers/lcd-ipodvideo.c #if CONFIG_LCD==LCD_H300 drivers/lcd-h300.c #endif -#ifndef IAUDIO_X5 +#ifndef TARGET_TREE drivers/power.c #endif drivers/led.c #ifndef SIMULATOR -#ifndef IAUDIO_X5 +#ifndef TARGET_TREE drivers/adc.c #endif #ifdef HAVE_MMC @@ -110,9 +110,11 @@ drivers/ata_mmc.c #ifdef HAVE_FLASH_DISK drivers/ata_flash.c #else +#ifndef SANSA_E200 drivers/ata.c #endif #endif +#endif drivers/button.c drivers/dac.c drivers/fat.c @@ -217,6 +219,11 @@ drivers/isp1362.c drivers/m5636.c #endif +#ifdef SANSA_E200 +target/arm/sandisk/sansa-e200/ata.c +target/arm/sandisk/sansa-e200/lcd.c +#endif + #ifdef IAUDIO_X5 target/coldfire/iaudio/x5/power-x5.c #ifndef SIMULATOR diff --git a/firmware/drivers/serial.c b/firmware/drivers/serial.c index 8479da52f8..f1cee96d51 100644 --- a/firmware/drivers/serial.c +++ b/firmware/drivers/serial.c @@ -30,7 +30,8 @@ #if (CONFIG_CPU != MCF5249) && (CONFIG_CPU != TCC730) && \ (CONFIG_CPU != PP5020) && (CONFIG_CPU != PNX0101) && \ - (CONFIG_CPU != PP5002) && (CONFIG_CPU != MCF5250) + (CONFIG_CPU != PP5002) && (CONFIG_CPU != MCF5250) && \ + (CONFIG_CPU != PP5024) /* FIX: this doesn't work on iRiver or Gmini or iPod yet */ /* iFP7xx has no remote */ diff --git a/firmware/export/config-e200.h b/firmware/export/config-e200.h new file mode 100644 index 0000000000..3793a716ec --- /dev/null +++ b/firmware/export/config-e200.h @@ -0,0 +1,121 @@ +/* + * This config file is for the Sandisk Sansa e200 + */ +#define TARGET_TREE /* this target is using the target tree system */ + +/* For Rolo and boot loader */ +#define MODEL_NUMBER 12 + +/* define this if you have recording possibility */ +/*#define HAVE_RECORDING 1*/ /* TODO: add support for this */ + +/* define this if you have a bitmap LCD display */ +#define HAVE_LCD_BITMAP 1 + +/* define this if you have a colour LCD */ +#define HAVE_LCD_COLOR 1 + +/* define this if you have access to the quickscreen */ +#define HAVE_QUICKSCREEN + +/* LCD dimensions */ +#define LCD_WIDTH 176 +#define LCD_HEIGHT 220 +#define LCD_DEPTH 16 /* 65536 colours */ +#define LCD_PIXELFORMAT RGB565SWAPPED /* rgb565 byte-swapped */ + +/* #define IRAM_LCDFRAMEBUFFER IDATA_ATTR *//* put the lcd frame buffer in IRAM */ + +#define CONFIG_KEYPAD SANSA_E200_PAD + +/* Define this if you do software codec */ +#define CONFIG_CODEC SWCODEC + +/* define this if you have a real-time clock */ +#ifndef BOOTLOADER +#define CONFIG_RTC RTC_E8564 /* TODO: figure this out */ +#endif + +/* Define this if you have a software controlled poweroff */ +#define HAVE_SW_POWEROFF + +/* The number of bytes reserved for loadable codecs */ +#define CODEC_SIZE 0x80000 + +/* The number of bytes reserved for loadable plugins */ +#define PLUGIN_BUFFER_SIZE 0x80000 + +/* Define this if you have the WM8975 audio codec */ +#define HAVE_WM8731 + +#define AB_REPEAT_ENABLE 1 + +/* FM Tuner */ +/*#define CONFIG_TUNER TEA5767 +#define CONFIG_TUNER_XTAL 32768 *//* TODO: what is this? */ + +/* Define this for LCD backlight available */ +#define CONFIG_BACKLIGHT BL_H10 /* TODO: figure this out, probably not necessary + because of 'target' stuff */ + +#define BATTERY_CAPACITY_DEFAULT 700 /* default battery capacity + TODO: check this, probably different + for different models too */ + +#ifndef SIMULATOR + +/* Define this if you have a PortalPlayer PP5024 */ +#define CONFIG_CPU PP5024 + +/* Define this if you want to use the PP5020 i2c interface */ +#define CONFIG_I2C I2C_PP5020 + +/* Type of mobile power */ +#define CONFIG_BATTERY BATT_LPCS355385 +#define BATTERY_CAPACITY_MIN 1500 /* min. capacity selectable */ +#define BATTERY_CAPACITY_MAX 1600 /* max. capacity selectable */ +#define BATTERY_CAPACITY_INC 10 /* capacity increment */ +#define BATTERY_TYPES_COUNT 1 /* only one type */ +#define BATTERY_SCALE_FACTOR 5865 + +/* Hardware controlled charging? FIXME */ +//#define CONFIG_CHARGING CHARGING_SIMPLE + +/* define this if the hardware can be powered off while charging */ +/* TODO: should this be set for the H10? */ +//#define HAVE_POWEROFF_WHILE_CHARGING + +/* The start address index for ROM builds */ +#define ROM_START 0x00000000 + +/* Define this to the CPU frequency */ +/* TODO: this is probably wrong */ +#define CPU_FREQ 11289600 + +/* Type of LCD TODO: hopefully the same as the x5 but check this*/ +#define CONFIG_LCD LCD_X5 + +/* Offset ( in the firmware file's header ) to the file length */ +#define FIRMWARE_OFFSET_FILE_LENGTH 0 + +/* Offset ( in the firmware file's header ) to the file CRC */ +#define FIRMWARE_OFFSET_FILE_CRC 0 + +/* Offset ( in the firmware file's header ) to the real data */ +#define FIRMWARE_OFFSET_FILE_DATA 8 + +/* #define USB_IPODSTYLE */ + +/* define this if the unit can be powered or charged via USB */ +#define HAVE_USB_POWER + +/* Virtual LED (icon) */ +#define CONFIG_LED LED_VIRTUAL + +/* Define this if you have adjustable CPU frequency */ +/*#define HAVE_ADJUSTABLE_CPU_FREQ Let's say we don't for now*/ + +#define BOOTFILE_EXT "e200" +#define BOOTFILE "rockbox." BOOTFILE_EXT + +#endif diff --git a/firmware/export/config-h10.h b/firmware/export/config-h10.h new file mode 100644 index 0000000000..470ff6b4fa --- /dev/null +++ b/firmware/export/config-h10.h @@ -0,0 +1,120 @@ +/* + * This config file is for the iriver H10 + */ + +/* For Rolo and boot loader */ +#define MODEL_NUMBER 11 + +/* define this if you have recording possibility */ +/*#define HAVE_RECORDING 1*/ /* TODO: add support for this */ + +/* define this if you have a bitmap LCD display */ +#define HAVE_LCD_BITMAP 1 + +/* define this if you have a colour LCD */ +#define HAVE_LCD_COLOR 1 + +/* define this if you have access to the quickscreen */ +#define HAVE_QUICKSCREEN + +/* LCD dimensions */ +#define LCD_WIDTH 160 +#define LCD_HEIGHT 128 +#define LCD_DEPTH 16 /* 65536 colours */ +#define LCD_PIXELFORMAT RGB565SWAPPED /* rgb565 byte-swapped */ + +/* #define IRAM_LCDFRAMEBUFFER IDATA_ATTR *//* put the lcd frame buffer in IRAM */ + +#define CONFIG_KEYPAD IRIVER_H10_PAD + +/* Define this if you do software codec */ +#define CONFIG_CODEC SWCODEC + +/* define this if you have a real-time clock */ +#ifndef BOOTLOADER +#define CONFIG_RTC RTC_E8564 /* TODO: figure this out */ +#endif + +/* Define this if you have a software controlled poweroff */ +#define HAVE_SW_POWEROFF + +/* The number of bytes reserved for loadable codecs */ +#define CODEC_SIZE 0x80000 + +/* The number of bytes reserved for loadable plugins */ +#define PLUGIN_BUFFER_SIZE 0x80000 + +/* Define this if you have the WM8975 audio codec */ +#define HAVE_WM8731 + +#define AB_REPEAT_ENABLE 1 + +/* FM Tuner */ +/*#define CONFIG_TUNER TEA5767 +#define CONFIG_TUNER_XTAL 32768 *//* TODO: what is this? */ + +/* Define this for LCD backlight available */ +#define CONFIG_BACKLIGHT BL_H10 /* TODO: figure this out, probably not necessary + because of 'target' stuff */ + +#define BATTERY_CAPACITY_DEFAULT 700 /* default battery capacity + TODO: check this, probably different + for different models too */ + +#ifndef SIMULATOR + +/* Define this if you have a PortalPlayer PP5020 */ +#define CONFIG_CPU PP5020 + +/* Define this if you want to use the PP5020 i2c interface */ +#define CONFIG_I2C I2C_PP5020 + +/* Type of mobile power */ +#define CONFIG_BATTERY BATT_LPCS355385 +#define BATTERY_CAPACITY_MIN 1500 /* min. capacity selectable */ +#define BATTERY_CAPACITY_MAX 1600 /* max. capacity selectable */ +#define BATTERY_CAPACITY_INC 10 /* capacity increment */ +#define BATTERY_TYPES_COUNT 1 /* only one type */ +#define BATTERY_SCALE_FACTOR 5865 + +/* Hardware controlled charging? FIXME */ +//#define CONFIG_CHARGING CHARGING_SIMPLE + +/* define this if the hardware can be powered off while charging */ +/* TODO: should this be set for the H10? */ +//#define HAVE_POWEROFF_WHILE_CHARGING + +/* The start address index for ROM builds */ +#define ROM_START 0x00000000 + +/* Define this to the CPU frequency */ +/* TODO: this is probably wrong */ +#define CPU_FREQ 11289600 + +/* Type of LCD TODO: hopefully the same as the x5 but check this*/ +#define CONFIG_LCD LCD_X5 + +/* Offset ( in the firmware file's header ) to the file length */ +#define FIRMWARE_OFFSET_FILE_LENGTH 0 + +/* Offset ( in the firmware file's header ) to the file CRC */ +#define FIRMWARE_OFFSET_FILE_CRC 0 + +/* Offset ( in the firmware file's header ) to the real data */ +#define FIRMWARE_OFFSET_FILE_DATA 8 + +/* #define USB_IPODSTYLE */ + +/* define this if the unit can be powered or charged via USB */ +#define HAVE_USB_POWER + +/* Virtual LED (icon) */ +#define CONFIG_LED LED_VIRTUAL + +/* Define this if you have adjustable CPU frequency */ +#define HAVE_ADJUSTABLE_CPU_FREQ + +#define BOOTFILE_EXT "h10" +#define BOOTFILE "rockbox." BOOTFILE_EXT + +#endif diff --git a/firmware/export/config.h b/firmware/export/config.h index 684353e499..9b3945640e 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -56,6 +56,8 @@ #define IPOD_3G_PAD 8 #define IRIVER_IFP7XX_PAD 9 #define GIGABEAT_PAD 10 +#define IRIVER_H10_PAD 11 +#define SANSA_E200_PAD 12 /* CONFIG_REMOTE_KEYPAD */ #define H100_REMOTE 1 @@ -67,6 +69,7 @@ #define BATT_4AA_NIMH 1500 #define BATT_3AAA 1000 /* Ondio */ #define BATT_LIPOL1300 1300 /* the type used in iRiver h1x0 models */ +#define BATT_LPCS355385 1550 /* iriver h10 - SKC LPCS355385 */ /* CONFIG_CHARGING */ #define CHARGING_SIMPLE 1 /* Simple, hardware controlled charging */ @@ -182,6 +185,10 @@ #include "config-ipodmini.h" #elif defined(IPOD_MINI2G) #include "config-ipodmini2g.h" +#elif defined(IRIVER_H10) +#include "config-h10.h" +#elif defined(SANSA_E200) +#include "config-e200.h" #else /* no known platform */ #endif @@ -203,7 +210,7 @@ #endif /* define for all cpus from ARM family */ -#if (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020) || (CONFIG_CPU == PNX0101) || (CONFIG_CPU == S3C2440) +#if (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020) || (CONFIG_CPU == PNX0101) || (CONFIG_CPU == S3C2440) || (CONFIG_CPU == PP5024) #define CPU_ARM #endif diff --git a/firmware/export/cpu.h b/firmware/export/cpu.h index 4c33ac96f4..93b66aac52 100644 --- a/firmware/export/cpu.h +++ b/firmware/export/cpu.h @@ -36,6 +36,9 @@ #if CONFIG_CPU == PP5002 #include "pp5002.h" #endif +#if CONFIG_CPU == PP5024 +#include "pp5024.h" +#endif #if CONFIG_CPU == PNX0101 #include "pnx0101.h" #endif diff --git a/firmware/export/pp5024.h b/firmware/export/pp5024.h new file mode 100644 index 0000000000..3ed3d5dade --- /dev/null +++ b/firmware/export/pp5024.h @@ -0,0 +1,26 @@ +#ifndef __PP5024_H__ +#define __PP5024_H__ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 by Daniel Stenberg + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +/* We believe is this quite similar to the 5020 and for how we just use that + completely */ +#include "pp5020.h" + +#endif diff --git a/firmware/kernel.c b/firmware/kernel.c index c5edacabec..c931a1db72 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c @@ -344,7 +344,7 @@ void tick_start(unsigned int interval_in_ms) IMR0 |= (1<<2); } -#elif (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020) +#elif (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020) || (CONFIG_CPU==PP5024) #ifndef BOOTLOADER void TIMER1(void) diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index 67e8b933ef..f7a2de52c2 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c @@ -248,6 +248,8 @@ void pcm_init(void) #define FIFO_FREE_COUNT ((IISFIFO_CFG & 0x3f0000) >> 16) #elif CONFIG_CPU == PP5002 #define FIFO_FREE_COUNT ((IISFIFO_CFG & 0x7800000) >> 23) +#elif CONFIG_CPU == PP5024 +#define FIFO_FREE_COUNT 4 /* TODO: make this sensible */ #endif static int pcm_freq = 44100; /* 44.1 is default */ @@ -268,6 +270,7 @@ static void dma_start(const void *addr, size_t size) /* setup I2S interrupt for FIQ */ outl(inl(0x6000402c) | I2S_MASK, 0x6000402c); outl(I2S_MASK, 0x60004024); +#elif CONFIG_CPU == PP5024 #else /* setup I2S interrupt for FIQ */ outl(inl(0xcf00102c) | DMA_OUT_MASK, 0xcf00102c); diff --git a/firmware/target/arm/sandisk/sansa-e200/ata-target.h b/firmware/target/arm/sandisk/sansa-e200/ata-target.h new file mode 100644 index 0000000000..67a01ed518 --- /dev/null +++ b/firmware/target/arm/sandisk/sansa-e200/ata-target.h @@ -0,0 +1 @@ +/* nothing here yet */ diff --git a/firmware/target/arm/sandisk/sansa-e200/ata.c b/firmware/target/arm/sandisk/sansa-e200/ata.c new file mode 100644 index 0000000000..0c37753c53 --- /dev/null +++ b/firmware/target/arm/sandisk/sansa-e200/ata.c @@ -0,0 +1,198 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 Daniel Stenberg + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "ata.h" +#include +#include + +#define SECTOR_SIZE (512) + +static unsigned short identify_info[SECTOR_SIZE]; +int ata_spinup_time = 0; +long last_disk_activity = -1; + +void flash_select_chip(int no, int sel) +{ + +} + +unsigned char flash_read_data(void) +{ + +} + +void flash_write_data(unsigned char data) +{ + +} + +void flash_write_cmd(unsigned char cmd) +{ + +} + +void flash_write_addr(unsigned char addr) +{ + +} + +void flash_wait_ready(void) +{ + +} + +int flash_map_sector(int sector, int* chip, int* chip_sector) +{ + +} + +int flash_read_id(int no) +{ + +} + +int flash_read_sector(int sector, unsigned char* buf, + unsigned char* oob) +{ + +} + +int flash_read_sector_oob(int sector, unsigned char* oob) +{ + +} + +static int flash_get_n_segments(void) +{ + +} + +static int flash_get_n_phblocks(void) +{ + +} + +static int flash_get_n_sectors_in_block(void) +{ + +} + +static int flash_phblock_to_sector(int segment, int block) +{ + +} + +static int flash_is_bad_block(unsigned char* oob) +{ + +} + +int flash_disk_scan(void) +{ + +} + +int flash_disk_find_block(int block) +{ + +} + +int flash_disk_read_sectors(unsigned long start, + int count, + void* buf) +{ + +} + +int ata_read_sectors(IF_MV2(int drive,) + unsigned long start, + int incount, + void* inbuf) +{ + +} + +int ata_write_sectors(IF_MV2(int drive,) + unsigned long start, + int count, + const void* buf) +{ + (void)start; + (void)count; + (void)buf; + return -1; +} + +/* schedule a single sector write, executed with the the next spinup + (volume 0 only, used for config sector) */ +extern void ata_delayed_write(unsigned long sector, const void* buf) +{ + (void)sector; + (void)buf; +} + +/* write the delayed sector to volume 0 */ +extern void ata_flush(void) +{ + +} + +void ata_spindown(int seconds) +{ + (void)seconds; +} + +bool ata_disk_is_active(void) +{ + return 0; +} + +void ata_sleep(void) +{ +} + +void ata_spin(void) +{ +} + +/* Hardware reset protocol as specified in chapter 9.1, ATA spec draft v5 */ +int ata_hard_reset(void) +{ + return 0; +} + +int ata_soft_reset(void) +{ + return 0; +} + +void ata_enable(bool on) +{ + (void)on; +} + +unsigned short* ata_get_identify(void) +{ + +} + +int ata_init(void) +{ + return 0; +} diff --git a/firmware/target/arm/sandisk/sansa-e200/backlight-target.h b/firmware/target/arm/sandisk/sansa-e200/backlight-target.h new file mode 100644 index 0000000000..67a01ed518 --- /dev/null +++ b/firmware/target/arm/sandisk/sansa-e200/backlight-target.h @@ -0,0 +1 @@ +/* nothing here yet */ diff --git a/firmware/target/arm/sandisk/sansa-e200/button-target.h b/firmware/target/arm/sandisk/sansa-e200/button-target.h new file mode 100644 index 0000000000..e78f91a154 --- /dev/null +++ b/firmware/target/arm/sandisk/sansa-e200/button-target.h @@ -0,0 +1,7 @@ + +#define BUTTON_POWER 0x00000001 +#define BUTTON_LEFT 0x00000002 +#define BUTTON_RIGHT 0x00000004 + +#define POWEROFF_BUTTON BUTTON_POWER +#define POWEROFF_COUNT 40 diff --git a/firmware/target/arm/sandisk/sansa-e200/lcd.c b/firmware/target/arm/sandisk/sansa-e200/lcd.c new file mode 100644 index 0000000000..dedb196c70 --- /dev/null +++ b/firmware/target/arm/sandisk/sansa-e200/lcd.c @@ -0,0 +1,15 @@ + +void lcd_update(void) +{ + +} + +void lcd_update_rect(int x, int y, int width, int height) +{ + +} + +void lcd_init_device(void) +{ + +} diff --git a/firmware/target/arm/sandisk/sansa-e200/usb-target.h b/firmware/target/arm/sandisk/sansa-e200/usb-target.h new file mode 100644 index 0000000000..67a01ed518 --- /dev/null +++ b/firmware/target/arm/sandisk/sansa-e200/usb-target.h @@ -0,0 +1 @@ +/* nothing here yet */