Index: bootloader/SOURCES =================================================================== RCS file: /cvsroot/rockbox/bootloader/SOURCES,v retrieving revision 1.8 diff -u -r1.8 SOURCES --- bootloader/SOURCES 31 Aug 2006 19:19:35 -0000 1.8 +++ bootloader/SOURCES 13 Dec 2006 00:28:20 -0000 @@ -2,10 +2,8 @@ ipod.c #elif defined(GIGABEAT_F) gigabeat.c -#elif defined(SANSA_E200) -e200.c -#elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB) -h10.c +#elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB) || defined(SANSA_E200) +main-pp.c #elif defined(ELIO_TPJ1022) tpj1022.c #else Index: bootloader/e200.c =================================================================== RCS file: bootloader/e200.c diff -N bootloader/e200.c --- bootloader/e200.c 16 Oct 2006 17:21:30 -0000 1.5 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,190 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id: e200.c,v 1.5 2006-10-16 17:21:30 dan_a Exp $ - * - * 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 "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" - -static inline void blink(void) -{ - volatile unsigned int* ptr; - int i; - ptr = (volatile unsigned int*)0x70000020; - - *ptr &= ~(1 << 13); - for(i = 0; i < 0xfffff; i++) - { - } - *ptr |= (1 << 13); - for(i = 0; i < 0xfffff; i++) - { - } -} - -static inline void slow_blink(void) -{ - volatile unsigned int* ptr; - int i; - ptr = (volatile unsigned int*)0x70000020; - - *ptr &= ~(1 << 13); - for(i = 0; i < (0xfffff); i++) - { - } - for(i = 0; i < (0xfffff); i++) - { - } - for(i = 0; i < (0xfffff); i++) - { - } - - *ptr |= (1 << 13); - for(i = 0; i < (0xfffff); i++) - { - } - for(i = 0; i < (0xfffff); i++) - { - } - for(i = 0; i < (0xfffff); i++) - { - } -} - -static inline unsigned long get_pc(void) -{ - unsigned long pc; - asm volatile ( - "mov %0, pc\n" - : "=r"(pc) - ); - return pc; -} - -/* 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) -{ - unsigned int gpio_a, gpio_b, gpio_c, gpio_d; - unsigned int gpio_e, gpio_f, gpio_g, gpio_h; - unsigned int gpio_i, gpio_j, gpio_k, gpio_l; - - char buf[128]; - int line; - - lcd_setmargins(0, 0); - lcd_clear_display(); - lcd_setfont(FONT_SYSFIXED); - - while(1) - { - gpio_a = GPIOA_INPUT_VAL; - gpio_b = GPIOB_INPUT_VAL; - gpio_c = GPIOC_INPUT_VAL; - - gpio_g = GPIOG_INPUT_VAL; - gpio_h = GPIOH_INPUT_VAL; - gpio_i = GPIOI_INPUT_VAL; - - line = 0; - snprintf(buf, sizeof(buf), "GPIO_A: %02x GPIO_G: %02x", gpio_a, gpio_g); - lcd_puts(0, line++, buf); - snprintf(buf, sizeof(buf), "GPIO_B: %02x GPIO_H: %02x", gpio_b, gpio_h); - lcd_puts(0, line++, buf); - snprintf(buf, sizeof(buf), "GPIO_C: %02x GPIO_I: %02x", gpio_c, gpio_i); - lcd_puts(0, line++, buf); - line++; - - gpio_d = GPIOD_INPUT_VAL; - gpio_e = GPIOE_INPUT_VAL; - gpio_f = GPIOF_INPUT_VAL; - - gpio_j = GPIOJ_INPUT_VAL; - gpio_k = GPIOK_INPUT_VAL; - gpio_l = GPIOL_INPUT_VAL; - - snprintf(buf, sizeof(buf), "GPIO_D: %02x GPIO_J: %02x", gpio_d, gpio_j); - lcd_puts(0, line++, buf); - snprintf(buf, sizeof(buf), "GPIO_E: %02x GPIO_K: %02x", gpio_e, gpio_k); - lcd_puts(0, line++, buf); - snprintf(buf, sizeof(buf), "GPIO_F: %02x GPIO_L: %02x", gpio_f, gpio_l); - lcd_puts(0, line++, buf); - line++; - snprintf(buf, sizeof(buf), "ADC_1: %02x", adc_read(ADC_0)); - lcd_puts(0, line++, buf); - snprintf(buf, sizeof(buf), "ADC_2: %02x", adc_read(ADC_1)); - lcd_puts(0, line++, buf); - snprintf(buf, sizeof(buf), "ADC_3: %02x", adc_read(ADC_2)); - lcd_puts(0, line++, buf); - snprintf(buf, sizeof(buf), "ADC_4: %02x", adc_read(ADC_3)); - lcd_puts(0, line++, buf); - lcd_update(); - } - return 0; -} - -void mpeg_stop(void) -{ -} - -void usb_acknowledge(void) -{ -} - -void usb_wait_for_disconnect(void) -{ -} - -void sys_poweroff(void) -{ -} - -void system_reboot(void) -{ - -} - -void main(void) -{ - kernel_init(); - adc_init(); - lcd_init_device(); - - dbg_ports(); -} - Index: bootloader/h10.c =================================================================== RCS file: bootloader/h10.c diff -N bootloader/h10.c --- bootloader/h10.c 28 Aug 2006 08:11:32 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,261 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id: h10.c,v 1.4 2006-08-28 08:11:32 barrywardell Exp $ - * - * Copyright (C) 2006 by Barry Wardell - * - * 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 "button.h" -#include "panic.h" -#include "power.h" -#include "file.h" - -/* Size of the buffer to store the loaded Rockbox/iriver image */ -#define MAX_LOADSIZE (5*1024*1024) - -/* A buffer to load the iriver firmware or Rockbox into */ -unsigned char loadbuffer[MAX_LOADSIZE]; - -char version[] = APPSVERSION; - -#define DRAM_START 0x10000000 - -int line=0; - -/* Load original iriver firmware. This function expects a file called - "/System/Original.mi4" on the player. It should be decrypted - and have the header stripped using mi4code. It reads the file in to a memory - buffer called buf. The rest of the loading is done in main() and crt0.S -*/ -int load_iriver(unsigned char* buf) -{ - int fd; - int rc; - int len; - - fd = open("/System/Original.mi4", O_RDONLY); - - len = filesize(fd); - - if (len > MAX_LOADSIZE) - return -6; - - rc = read(fd, buf, len); - if(rc < len) - return -4; - - close(fd); - return len; -} - -/* Load Rockbox firmware (rockbox.h10) */ -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; - - snprintf(str, sizeof(str), "Length: %x", len); - lcd_puts(0, line++ ,str); - lcd_update(); - - 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; - - snprintf(str, sizeof(str), "Checksum: %x", chksum); - lcd_puts(0, line++ ,str); - lcd_update(); - - rc = read(fd, model, 4); - if(rc < 4) - return -3; - - model[4] = 0; - - snprintf(str, sizeof(str), "Model name: %s", model); - 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, sizeof(str), "Sum: %x", sum); - lcd_puts(0, line++ ,str); - lcd_update(); - - if(sum != chksum) - return -5; - - return len; -} - -void* main(void) -{ - char buf[256]; - int i; - int rc; - unsigned short* identify_info; - struct partinfo* pinfo; - - system_init(); - kernel_init(); - lcd_init(); - font_init(); - - line=0; - - lcd_setfont(FONT_SYSFIXED); - - lcd_puts(0, line++, "Rockbox boot loader"); - snprintf(buf, sizeof(buf), "Version: 20%s", version); - lcd_puts(0, line++, buf); - snprintf(buf, sizeof(buf), "iriver H10"); - lcd_puts(0, line++, buf); - lcd_update(); - - i=ata_init(); - if (i==0) { - identify_info=ata_get_identify(); - /* Show model */ - for (i=0; i < 20; i++) { - ((unsigned short*)buf)[i]=htobe16(identify_info[i+27]); - } - buf[40]=0; - for (i=39; i && buf[i]==' '; i--) { - buf[i]=0; - } - lcd_puts(0, line++, buf); - lcd_update(); - } else { - snprintf(buf, sizeof(buf), "ATA: %d", i); - lcd_puts(0, line++, buf); - lcd_update(); - } - - disk_init(); - rc = disk_mount_all(); - if (rc<=0) - { - lcd_puts(0, line++, "No partition found"); - lcd_update(); - } - - pinfo = disk_partinfo(0); - snprintf(buf, sizeof(buf), "Partition 0: 0x%02x %ld MB", - pinfo->type, pinfo->size / 2048); - lcd_puts(0, line++, buf); - lcd_update(); - - i=button_read_device(); - if(i==BUTTON_LEFT) - { - lcd_puts(0, line, "Loading iriver firmware..."); - lcd_update(); - rc=load_iriver(loadbuffer); - } else { - lcd_puts(0, line, "Loading Rockbox..."); - lcd_update(); - rc=load_rockbox(loadbuffer); - } - - if (rc < 0) { - snprintf(buf, sizeof(buf), "Rockbox error: %d",rc); - lcd_puts(0, line++, buf); - lcd_update(); - } - - memcpy((void*)DRAM_START,loadbuffer,rc); - - return (void*)DRAM_START; -} - -/* 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) -{ -} Index: bootloader/main-pp.c =================================================================== RCS file: bootloader/main-pp.c diff -N bootloader/main-pp.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ bootloader/main-pp.c 13 Dec 2006 00:28:20 -0000 @@ -0,0 +1,262 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: h10.c,v 1.4 2006-08-28 08:11:32 barrywardell Exp $ + * + * Copyright (C) 2006 by Barry Wardell + * + * 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 "button.h" +#include "panic.h" +#include "power.h" +#include "file.h" + +/* Size of the buffer to store the loaded firmware image */ +#define MAX_LOADSIZE (10*1024*1024) + +/* A buffer to load the iriver firmware or Rockbox into */ +unsigned char loadbuffer[MAX_LOADSIZE]; + +char version[] = APPSVERSION; + +#define DRAM_START 0x10000000 + +int line=0; + +/* Load original mi4 firmware. This function expects a file called + "/System/OF.bin" on the player. It should be a mi4 firmware decrypted + and header stripped using mi4code. It reads the file in to a memory + buffer called buf. The rest of the loading is done in main() and crt0.S +*/ +int load_original_firmware(unsigned char* buf) +{ + int fd; + int rc; + int len; + + fd = open("/System/OF.bin", O_RDONLY); + + len = filesize(fd); + + if (len > MAX_LOADSIZE) + return -6; + + rc = read(fd, buf, len); + if(rc < len) + return -4; + + close(fd); + return len; +} + +/* Load Rockbox firmware (rockbox.*) */ +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; + + snprintf(str, sizeof(str), "Length: %x", len); + lcd_puts(0, line++ ,str); + lcd_update(); + + 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; + + snprintf(str, sizeof(str), "Checksum: %x", chksum); + lcd_puts(0, line++ ,str); + lcd_update(); + + rc = read(fd, model, 4); + if(rc < 4) + return -3; + + model[4] = 0; + + snprintf(str, sizeof(str), "Model name: %s", model); + 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, sizeof(str), "Sum: %x", sum); + lcd_puts(0, line++ ,str); + lcd_update(); + + if(sum != chksum) + return -5; + + return len; +} + +void* main(void) +{ + char buf[256]; + int i; + int rc; + unsigned short* identify_info; + struct partinfo* pinfo; + + system_init(); + kernel_init(); + lcd_init(); + font_init(); + + line=0; + + lcd_setfont(FONT_SYSFIXED); + + lcd_puts(0, line++, "Rockbox boot loader"); + snprintf(buf, sizeof(buf), "Version: 20%s", version); + lcd_puts(0, line++, buf); + snprintf(buf, sizeof(buf), MODEL_NAME); + lcd_puts(0, line++, buf); + lcd_update(); + + i=ata_init(); + if (i==0) { + identify_info=ata_get_identify(); + /* Show model */ + for (i=0; i < 20; i++) { + ((unsigned short*)buf)[i]=htobe16(identify_info[i+27]); + } + buf[40]=0; + for (i=39; i && buf[i]==' '; i--) { + buf[i]=0; + } + lcd_puts(0, line++, buf); + lcd_update(); + } else { + snprintf(buf, sizeof(buf), "ATA: %d", i); + lcd_puts(0, line++, buf); + lcd_update(); + } + + disk_init(); + rc = disk_mount_all(); + if (rc<=0) + { + lcd_puts(0, line++, "No partition found"); + lcd_update(); + } + + pinfo = disk_partinfo(0); + snprintf(buf, sizeof(buf), "Partition 0: 0x%02x %ld MB", + pinfo->type, pinfo->size / 2048); + lcd_puts(0, line++, buf); + lcd_update(); + + i=button_read_device(); + if(i==BUTTON_LEFT) + { + lcd_puts(0, line++, "Loading original firmware..."); + lcd_update(); + rc=load_original_firmware(loadbuffer); + } else { + lcd_puts(0, line++, "Loading Rockbox..."); + lcd_update(); + rc=load_rockbox(loadbuffer); + } + + if (rc < 0) { + snprintf(buf, sizeof(buf), "Rockbox error: %d",rc); + lcd_puts(0, line++, buf); + lcd_update(); + while(1) {} + } + + memcpy((void*)DRAM_START,loadbuffer,rc); + + return (void*)DRAM_START; +} + +/* 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) +{ +} Index: firmware/SOURCES =================================================================== RCS file: /cvsroot/rockbox/firmware/SOURCES,v retrieving revision 1.146 diff -u -r1.146 SOURCES --- firmware/SOURCES 9 Dec 2006 19:18:16 -0000 1.146 +++ firmware/SOURCES 13 Dec 2006 00:28:21 -0000 @@ -262,7 +262,11 @@ /* no i2c driver yet */ #endif #if defined(CPU_PP) +#ifdef BOOTLOADER +target/arm/crt0-pp-bl.S +#else target/arm/crt0-pp.S +#endif #elif defined(CPU_ARM) target/arm/crt0.S #endif /* defined(CPU_*) */ Index: firmware/boot.lds =================================================================== RCS file: /cvsroot/rockbox/firmware/boot.lds,v retrieving revision 1.26 diff -u -r1.26 boot.lds --- firmware/boot.lds 10 Dec 2006 13:33:12 -0000 1.26 +++ firmware/boot.lds 13 Dec 2006 00:28:21 -0000 @@ -8,7 +8,7 @@ OUTPUT_FORMAT(elf32-littlearm) OUTPUT_ARCH(arm) #ifdef CPU_PP -INPUT(target/arm/crt0-pp.o) +INPUT(target/arm/crt0-pp-bl.o) #else INPUT(target/arm/crt0.o) #endif Index: firmware/rolo.c =================================================================== RCS file: /cvsroot/rockbox/firmware/rolo.c,v retrieving revision 1.35 diff -u -r1.35 rolo.c --- firmware/rolo.c 10 Dec 2006 15:53:26 -0000 1.35 +++ firmware/rolo.c 13 Dec 2006 00:28:22 -0000 @@ -31,9 +31,8 @@ #include "buffer.h" #if !defined(IRIVER_IFP7XX_SERIES) && \ - (CONFIG_CPU != PP5002) && !defined(IRIVER_H10) && \ - !defined(IRIVER_H10_5GB) && (CONFIG_CPU != S3C2440) -/* FIX: this doesn't work on iFP, 3rd Gen ipods, or H10 yet */ + (CONFIG_CPU != PP5002) && (CONFIG_CPU != S3C2440) +/* FIX: this doesn't work on iFP, 3rd Gen ipods */ #define IRQ0_EDGE_TRIGGER 0x80 Index: firmware/system.c =================================================================== RCS file: /cvsroot/rockbox/firmware/system.c,v retrieving revision 1.131 diff -u -r1.131 system.c --- firmware/system.c 5 Dec 2006 20:01:45 -0000 1.131 +++ firmware/system.c 13 Dec 2006 00:28:22 -0000 @@ -26,6 +26,7 @@ #include "timer.h" #include "inttypes.h" #include "string.h" +#include "logf.h" #ifndef SIMULATOR long cpu_frequency = CPU_FREQ; @@ -574,12 +575,18 @@ /* TODO: this should really be in the target tree, but moving it there caused crt0.S not to find it while linking */ /* TODO: Even if it isn't in the target tree, this should be the default case */ +extern void e200_button_int(void); + void irq(void) { if (CPU_INT_STAT & TIMER1_MASK) TIMER1(); else if (CPU_INT_STAT & TIMER2_MASK) TIMER2(); + else if (CPU_HI_INT_STAT & GPIO_MASK){ + e200_button_int(); + logf("button interrupt"); + } } #else extern void ipod_4g_button_int(void); Index: firmware/export/config-e200.h =================================================================== RCS file: /cvsroot/rockbox/firmware/export/config-e200.h,v retrieving revision 1.6 diff -u -r1.6 config-e200.h --- firmware/export/config-e200.h 10 Dec 2006 23:12:58 -0000 1.6 +++ firmware/export/config-e200.h 13 Dec 2006 00:28:22 -0000 @@ -5,6 +5,7 @@ /* For Rolo and boot loader */ #define MODEL_NUMBER 16 +#define MODEL_NAME "Sandisk Sansa e200" /* define this if you have recording possibility */ /*#define HAVE_RECORDING 1*/ /* TODO: add support for this */ Index: firmware/export/config-h10.h =================================================================== RCS file: /cvsroot/rockbox/firmware/export/config-h10.h,v retrieving revision 1.20 diff -u -r1.20 config-h10.h --- firmware/export/config-h10.h 9 Nov 2006 22:33:24 -0000 1.20 +++ firmware/export/config-h10.h 13 Dec 2006 00:28:23 -0000 @@ -6,6 +6,7 @@ /* For Rolo and boot loader */ #define MODEL_NUMBER 13 +#define MODEL_NAME "iriver H10 20GB" /* define this if you have recording possibility */ /*#define HAVE_RECORDING 1*/ /* TODO: add support for this */ Index: firmware/export/config-h10_5gb.h =================================================================== RCS file: /cvsroot/rockbox/firmware/export/config-h10_5gb.h,v retrieving revision 1.14 diff -u -r1.14 config-h10_5gb.h --- firmware/export/config-h10_5gb.h 9 Nov 2006 22:33:24 -0000 1.14 +++ firmware/export/config-h10_5gb.h 13 Dec 2006 00:28:23 -0000 @@ -6,6 +6,7 @@ /* For Rolo and boot loader */ #define MODEL_NUMBER 14 +#define MODEL_NAME "iriver H10 5/6GB" /* define this if you have recording possibility */ /*#define HAVE_RECORDING 1*/ /* TODO: add support for this */ Index: firmware/target/arm/crt0-pp-bl.S =================================================================== RCS file: firmware/target/arm/crt0-pp-bl.S diff -N firmware/target/arm/crt0-pp-bl.S --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ firmware/target/arm/crt0-pp-bl.S 13 Dec 2006 00:28:23 -0000 @@ -0,0 +1,179 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: crt0-pp.S,v 1.2 2006/11/22 00:49:16 dan_a Exp $ + * + * Copyright (C) 2002 by Linus Nielsen Feltzing + * + * 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 "cpu.h" + + .section .init.text,"ax",%progbits + + .global start +start: + +/* PortalPlayer bootloader and startup code based on startup.s from the iPodLinux + * loader + * + * Copyright (c) 2003, Daniel Palffy (dpalffy (at) rainstorm.org) + * Copyright (c) 2005, Bernard Leach + * + */ +#if CONFIG_CPU == PP5002 + .equ PROC_ID, 0xc4000000 + .equ COP_CTRL, 0xcf004058 + .equ COP_STATUS, 0xcf004050 + .equ IIS_CONFIG, 0xc0002500 + .equ SLEEP, 0xca + .equ WAKE, 0xce + .equ SLEEPING, 0x4000 +#else + .equ PROC_ID, 0x60000000 + .equ COP_CTRL, 0x60007004 + .equ COP_STATUS, 0x60007004 + .equ IIS_CONFIG, 0x70002800 + .equ SLEEP, 0x80000000 + .equ WAKE, 0x0 + .equ SLEEPING, 0x80000000 + .equ CACHE_CTRL, 0x6000c000 +#endif + + msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ */ + +/* 1 - Copy the bootloader to IRAM */ + /* get the high part of our execute address */ + ldr r7, =0xffffff00 + and r4, pc, r7 + + /* Copy bootloader to safe area - 0x40000000 (IRAM) */ + mov r5, #0x40000000 + ldr r6, = _dataend +1: + cmp r5, r6 + ldrcc r2, [r4], #4 + strcc r2, [r5], #4 + bcc 1b + +#ifndef IPOD_ARCH + /* For builds on targets with mi4 firmware, scramble writes data to + 0xe0-0xeb, so jump past that.*/ + b pad_skip + +.space 60*4 + +pad_skip: +#endif + + +/* 2 - Jump both CPU and COP there */ + ldr pc, =start_loc /* jump to the relocated start_loc: */ + +start_loc: + + /* Find out which processor we are */ + ldr r0, =PROC_ID + ldr r0, [r0] + and r0, r0, #0xff + cmp r0, #0x55 + beq cpu + + /* put us (co-processor) to sleep */ + ldr r4, =COP_CTRL + mov r3, #SLEEP + str r3, [r4] + ldr pc, =cop_wake_start + +cop_wake_start: +#if CONFIG_CPU != PP5002 + /* COP: Invalidate cache */ + ldr r0, =0xf000f044 + ldr r1, [r0] + orr r1, r1, #0x6 + str r1, [r0] + + ldr r0, =CACHE_CTRL +1: + ldr r1, [r0] + tst r1, #0x8000 + bne 1b +#endif + + ldr r0, =startup_loc + ldr pc, [r0] + +cpu: + /* Wait for COP to be sleeping */ + ldr r4, =COP_STATUS +1: + ldr r3, [r4] + ands r3, r3, #SLEEPING + beq 1b + + /* Initialise bss section to zero */ + ldr r2, =_edata + ldr r3, =_end + mov r4, #0 +1: + cmp r3, r2 + strhi r4, [r2], #4 + bhi 1b + + /* Set up some stack and munge it with 0xdeadbeef */ + ldr sp, =stackend + mov r3, sp + ldr r2, =stackbegin + ldr r4, =0xdeadbeef +1: + cmp r3, r2 + strhi r4, [r2], #4 + bhi 1b + + /* execute the loader - this will load an image to 0x10000000 */ + bl main + + ldr r1, =startup_loc + str r0, [r1] + +#if CONFIG_CPU != PP5002 + /* Flush cache */ + ldr r3, =0xf000f044 + ldr r4, [r3] + orr r4, r4, #0x2 + str r4, [r3] + + ldr r3, =CACHE_CTRL +1: + ldr r4, [r3] + tst r4, #0x8000 + bne 1b +#endif + + /* Wake up the coprocessor before executing the firmware */ + ldr r4, =COP_CTRL + mov r3, #WAKE + str r3, [r4] + + mov pc, r0 + +startup_loc: + .word 0x0 + +#ifdef IPOD_ARCH +.align 8 /* starts at 0x100 */ +.global boot_table +boot_table: + /* here comes the boot table, don't move its offset */ + .space 400 +#endif Index: firmware/target/arm/crt0-pp.S =================================================================== RCS file: /cvsroot/rockbox/firmware/target/arm/crt0-pp.S,v retrieving revision 1.2 diff -u -r1.2 crt0-pp.S --- firmware/target/arm/crt0-pp.S 22 Nov 2006 00:49:16 -0000 1.2 +++ firmware/target/arm/crt0-pp.S 13 Dec 2006 00:28:23 -0000 @@ -5,7 +5,7 @@ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ - * $Id: crt0-pp.S,v 1.2 2006-11-22 00:49:16 dan_a Exp $ + * $Id: crt0-pp.S,v 1.2 2006/11/22 00:49:16 dan_a Exp $ * * Copyright (C) 2002 by Linus Nielsen Feltzing * @@ -52,15 +52,9 @@ msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ */ -#ifndef BOOTLOADER b pad_skip -#if defined(SANSA_E200) -/* mi4tool writes junk between 0xe0 and 0xeb. Avoid this. */ -.space 60*4 /* (more than enough) space for exception vectors */ -#else -.space 50*4 -#endif +.space 50*4 /* (more than enough) space for exception vectors */ pad_skip: #ifdef SANSA_E200 @@ -108,11 +102,13 @@ /* After doing the remapping, send the COP to sleep. On wakeup it will go to cop_init */ + + /* Find out which processor we are */ ldr r0, =PROC_ID ldr r0, [r0] and r0, r0, #0xff cmp r0, #0x55 - beq 1f + beq cpu_init /* put us (co-processor) to sleep */ ldr r4, =COP_CTRL @@ -121,9 +117,15 @@ ldr pc, =cop_init -1: -#ifndef DEBUG +cpu_init: + /* Wait for COP to be sleeping */ + ldr r4, =COP_STATUS +1: + ldr r3, [r4] + ands r3, r3, #SLEEPING + beq 1b + /* Copy exception handler code to address 0 */ ldr r2, =_vectorsstart ldr r3, =_vectorsend @@ -133,15 +135,7 @@ ldrhi r5, [r4], #4 strhi r5, [r2], #4 bhi 1b -#else - ldr r1, =vectors - ldr r0, =irq_handler - str r0, [r1, #24] - ldr r0, =fiq_handler - str r0, [r1, #28] -#endif -#ifndef STUB /* Zero out IBSS */ ldr r2, =_iedata ldr r3, =_iend @@ -160,8 +154,6 @@ ldrhi r5, [r2], #4 strhi r5, [r3], #4 bhi 1b -#endif /* !STUB */ -#endif /* !BOOTLOADER */ /* Initialise bss section to zero */ ldr r2, =_edata @@ -181,90 +173,6 @@ cmp r3, r2 strhi r4, [r2], #4 bhi 1b - -#ifdef BOOTLOADER - /* TODO: the high part of the address is probably dependent on CONFIG_CPU. - Since we tend to use ifdefs for each chipset target - anyway, we might as well just hardcode it here. - */ - - /* get the high part of our execute address */ - ldr r0, =0xff000000 - and r8, pc, r0 @ r8 is used later - - /* Find out which processor we are */ - mov r0, #PROC_ID - ldr r0, [r0] - and r0, r0, #0xff - cmp r0, #0x55 - beq 1f - - /* put us (co-processor) to sleep */ - ldr r4, =COP_CTRL - mov r3, #SLEEP - str r3, [r4] - ldr pc, =cop_wake_start - -cop_wake_start: - /* jump the COP to startup */ - ldr r0, =startup_loc - ldr pc, [r0] - -1: - - /* get the high part of our execute address */ - ldr r2, =0xffffff00 - and r4, pc, r2 - - /* Copy bootloader to safe area - 0x40000000 */ - mov r5, #0x40000000 - ldr r6, = _dataend - sub r0, r6, r5 /* length of loader */ - add r0, r4, r0 /* r0 points to start of loader */ -1: - cmp r5, r6 - ldrcc r2, [r4], #4 - strcc r2, [r5], #4 - bcc 1b - - ldr pc, =start_loc /* jump to the relocated start_loc: */ - -start_loc: - - /* execute the loader - this will load an image to 0x10000000 */ - bl main - - /* Wake up the coprocessor before executing the firmware */ - - /* save the startup address for the COP */ - ldr r1, =startup_loc - str r0, [r1] - - /* make sure COP is sleeping */ - ldr r4, =COP_STATUS -1: - ldr r3, [r4] - ands r3, r3, #SLEEPING - beq 1b - - /* wake up COP */ - ldr r4, =COP_CTRL - mov r3, #WAKE - str r3, [r4] - - /* jump to start location */ - mov pc, r0 - -startup_loc: - .word 0x0 - -.align 8 /* starts at 0x100 */ -.global boot_table -boot_table: - /* here comes the boot table, don't move its offset */ - .space 400 - -#else /* BOOTLOADER */ /* Set up stack for IRQ mode */ msr cpsr_c, #0xd2 @@ -290,6 +198,21 @@ /* main() should never return */ cop_init: +#if CONFIG_CPU != PP5002 + /* COP: Invalidate cache */ + ldr r0, =0xf000f044 + ldr r1, [r0] + orr r1, r1, #0x6 + str r1, [r0] + + ldr r0, =0x6000c000 +1: + ldr r1, [r0] + tst r1, #0x8000 + bne 1b +#endif + + /* Setup stack for COP */ ldr sp, =cop_stackend mov r3, sp ldr r2, =cop_stackbegin @@ -300,6 +223,8 @@ bhi 2b ldr sp, =cop_stackend + + /* Run cop_main() in apps/main.c */ bl cop_main /* Exception handlers. Will be copied to address 0 after memory remapping */ @@ -385,5 +310,3 @@ /* 256 words of FIQ stack */ .space 256*4 fiq_stack: - -#endif /* BOOTLOADER */ Index: firmware/target/arm/sandisk/sansa-e200/button-e200.c =================================================================== RCS file: /cvsroot/rockbox/firmware/target/arm/sandisk/sansa-e200/button-e200.c,v retrieving revision 1.2 diff -u -r1.2 button-e200.c --- firmware/target/arm/sandisk/sansa-e200/button-e200.c 16 Oct 2006 00:18:49 -0000 1.2 +++ firmware/target/arm/sandisk/sansa-e200/button-e200.c 13 Dec 2006 00:28:24 -0000 @@ -28,16 +28,125 @@ #include "backlight.h" #include "system.h" +static unsigned int old_wheel_value = 0; +int int_btn = BUTTON_NONE; +static bool hold_button = false; -void button_init_device(void) +static int e200_button_read(void) { - /* Enable all buttons except the wheel */ - GPIOF_ENABLE |= 0xff; + unsigned char source, wheel_source, state, wheel_state; + int btn = BUTTON_NONE; + + /* get source(s) of interupt */ + source = GPIOA_INT_STAT & 0x3f; + wheel_source = GPIOB_INT_STAT & 0x30; + + if (source == 0 && wheel_source == 0) { + return BUTTON_NONE; /* not for us */ + } + + /* get current keypad & wheel status */ + state = GPIOF_INPUT_VAL & 0xff; + wheel_state = GPIOH_INPUT_VAL & 0xc0; + + /* toggle interrupt level */ + GPIOA_INT_LEV = ~state; + GPIOB_INT_LEV = ~wheel_state; + + /* device buttons */ + //if (!hold_button) + { + /* Read normal buttons */ + if ((state & 0x1) == 0) btn |= BUTTON_REC; + if ((state & 0x2) == 0) btn |= BUTTON_DOWN; + if ((state & 0x4) == 0) btn |= BUTTON_RIGHT; + if ((state & 0x8) == 0) btn |= BUTTON_LEFT; + if ((state & 0x10) == 0) btn |= BUTTON_SELECT; /* The centre button */ + if ((state & 0x20) == 0) btn |= BUTTON_UP; /* The "play" button */ + if ((state & 0x40) != 0) btn |= BUTTON_POWER; + + /* Read wheel + * Bits 6 and 7 of GPIOH change as follows: + * Clockwise rotation 01 -> 00 -> 10 -> 11 + * Counter-clockwise 11 -> 10 -> 00 -> 01 + * + * This is equivalent to wheel_value of: + * Clockwise rotation 0x40 -> 0x00 -> 0x80 -> 0xc0 + * Counter-clockwise 0xc0 -> 0x80 -> 0x00 -> 0x40 + */ + wheel_state = GPIOH_INPUT_VAL & 0xc0; + switch(wheel_state){ + case 0x00: + if(old_wheel_value==0x80) + btn |= BUTTON_SCROLL_UP; + else if (old_wheel_value==0x40) + btn |= BUTTON_SCROLL_DOWN; + break; + case 0x40: + if(old_wheel_value==0x00) + btn |= BUTTON_SCROLL_UP; + else if (old_wheel_value==0xc0) + btn |= BUTTON_SCROLL_DOWN; + break; + case 0x80: + if(old_wheel_value==0xc0) + btn |= BUTTON_SCROLL_UP; + else if (old_wheel_value==0x00) + btn |= BUTTON_SCROLL_DOWN; + break; + case 0xc0: + if(old_wheel_value==0x40) + btn |= BUTTON_SCROLL_UP; + else if (old_wheel_value==0x80) + btn |= BUTTON_SCROLL_DOWN; + break; + } + old_wheel_value = wheel_state; + } + + /* ack any active interrupts */ + if (source) + GPIOF_INT_CLR = source; + if (wheel_source) + GPIOH_INT_CLR = wheel_source; + + return btn; } -bool button_hold(void) +void e200_button_int(void) { - return (GPIOF_INPUT_VAL & 0x80)?true:false; + CPU_HI_INT_CLR = GPIO_MASK; + int_btn = e200_button_read(); + //CPU_INT_EN = 0x40000000; + CPU_HI_INT_EN = GPIO_MASK; +} + +void button_init_device(void) +{ + /* Enable all buttons except the wheel */ + GPIOF_ENABLE |= 0xff; + + /* Enable scroll wheel */ + GPIOH_ENABLE |= 0xc0; + + /* buttons - set interrupt levels */ + GPIOF_INT_LEV = ~(GPIOF_INPUT_VAL & 0xff); + GPIOF_INT_CLR = GPIOF_INT_STAT & 0xff; + + /* scroll wheel - set interrupt levels */ + GPIOH_INT_LEV = ~(GPIOH_INPUT_VAL & 0xc0); + GPIOH_INT_CLR = GPIOH_INT_STAT & 0xc0; + + /* enable interrupts */ + GPIOF_INT_EN = 0xff; + GPIOH_INT_EN = 0xc0; + + /* unmask interrupt */ + CPU_INT_EN = 0x40000000; + CPU_HI_INT_EN = GPIO_MASK; + + /* Read initial wheel value (bit 6-7 of GPIOH) */ + old_wheel_value = GPIOH_INPUT_VAL & 0xc0; } /* @@ -45,9 +154,6 @@ */ int button_read_device(void) { - int btn = BUTTON_NONE; - unsigned char state; - static bool hold_button = false; bool hold_button_old; /* Hold */ @@ -64,19 +170,11 @@ #endif #endif - /* device buttons */ - if (!hold_button) - { - /* Read normal buttons */ - state = GPIOF_INPUT_VAL & 0xff; - if ((state & 0x1) == 0) btn |= BUTTON_REC; - if ((state & 0x2) == 0) btn |= BUTTON_DOWN; - if ((state & 0x4) == 0) btn |= BUTTON_RIGHT; - if ((state & 0x8) == 0) btn |= BUTTON_LEFT; - if ((state & 0x10) == 0) btn |= BUTTON_SELECT; /* The centre button */ - if ((state & 0x20) == 0) btn |= BUTTON_UP; /* The "play" button */ - if ((state & 0x40) != 0) btn |= BUTTON_POWER; - } + /* The int_btn variable is set in the button interrupt handler */ + return int_btn; +} - return btn; +bool button_hold(void) +{ + return (GPIOF_INPUT_VAL & 0x80)?true:false; } Index: firmware/target/arm/sandisk/sansa-e200/button-target.h =================================================================== RCS file: /cvsroot/rockbox/firmware/target/arm/sandisk/sansa-e200/button-target.h,v retrieving revision 1.3 diff -u -r1.3 button-target.h --- firmware/target/arm/sandisk/sansa-e200/button-target.h 14 Oct 2006 12:16:29 -0000 1.3 +++ firmware/target/arm/sandisk/sansa-e200/button-target.h 13 Dec 2006 00:28:24 -0000 @@ -28,6 +28,7 @@ bool button_hold(void); void button_init_device(void); int button_read_device(void); +void e200_button_int(void); /* Sandisk Sansa E200 button codes */ Index: tools/configure =================================================================== RCS file: /cvsroot/rockbox/tools/configure,v retrieving revision 1.245 diff -u -r1.245 configure --- tools/configure 27 Nov 2006 02:15:39 -0000 1.245 +++ tools/configure 13 Dec 2006 00:28:28 -0000 @@ -1115,10 +1115,10 @@ target="-DSANSA_E200" memory=32 # supposedly arm7tdmicc - tool="$rootdir/tools/scramble -mi4v3" + tool="$rootdir/tools/scramble -add=e200" bmp2rb_mono="$rootdir/tools/bmp2rb -f 0" bmp2rb_native="$rootdir/tools/bmp2rb -f 4" - output="PP5022.mi4" + output="rockbox.e200" appextra="recorder:gui" archosrom="" flash="" Index: tools/scramble.c =================================================================== RCS file: /cvsroot/rockbox/tools/scramble.c,v retrieving revision 1.35 diff -u -r1.35 scramble.c --- tools/scramble.c 31 Aug 2006 19:19:35 -0000 1.35 +++ tools/scramble.c 13 Dec 2006 00:28:29 -0000 @@ -89,7 +89,7 @@ "\t-mi4v3 PortalPlayer .mi4 format (revision 010301)\n" "\t-add=X Rockbox generic \"add-up\" checksum format\n" "\t (X values: h100, h120, h140, h300, ipco, nano, ipvd\n" - "\t ip3g, ip4g, mini, x5, h10, h10_5gb)\n" + "\t ip3g, ip4g, mini, x5, h10, h10_5gb, tpj2, e200)\n" "\nNo option results in Archos standard player/recorder format.\n"); exit(1); @@ -207,6 +207,8 @@ modelnum = 14; else if(!strcmp(&argv[1][5], "tpj2")) modelnum = 15; + else if(!strcmp(&argv[1][5], "e200")) + modelnum = 16; else { fprintf(stderr, "unsupported model: %s\n", &argv[1][5]); return 2;