diff options
author | Marcoen Hirschberg <marcoen@gmail.com> | 2006-08-12 08:27:48 +0000 |
---|---|---|
committer | Marcoen Hirschberg <marcoen@gmail.com> | 2006-08-12 08:27:48 +0000 |
commit | 0a0682474e6326f63994a6cd62f23efd9818a7ec (patch) | |
tree | 9ddd8fbfe72fa4ca001b21de93b951ab24dc951f /bootloader/gigabeat.c | |
parent | dd754886f5fd4004b521c954e263772d35fb6a46 (diff) |
initial gigabeat bootloader (only test code)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10536 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader/gigabeat.c')
-rw-r--r-- | bootloader/gigabeat.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/bootloader/gigabeat.c b/bootloader/gigabeat.c new file mode 100644 index 0000000000..dcd013e867 --- /dev/null +++ b/bootloader/gigabeat.c @@ -0,0 +1,115 @@ +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#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" + +char version[] = APPSVERSION; + +void go_usb_mode() { + /* Drop into USB mode. This does not check for disconnection. */ + + int i; + + GPBDAT &= 0x7EF; + GPBCON |= 1<<8; + + GPGDAT &= 0xE7FF; + GPGDAT |= 1<<11; + + for (i = 0; i < 10000000; i++) {continue;} + + GPBCON &= 0x2FFCFF; + GPBDAT |= 1<<5; + GPBDAT |= 1<<6; +} + +void * main(void) +{ + int line = 0, i; + char buf[256]; + struct partinfo* pinfo; + unsigned short* identify_info; + int testfile; + + lcd_init(); + 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), "Gigabeat version: 0x%08x", 1); + lcd_puts(0, line++, buf); +*/ + + lcd_puts(0, line++, "Hold MENU when booting for rescue mode."); + lcd_update(); + + /* hold MENU to enter rescue mode */ + if (GPGDAT & 2) { + lcd_puts(0, line++, "Entering rescue mode.."); + lcd_update(); + go_usb_mode(); + while(1); + } + + i = ata_init(); + i = disk_mount_all(); + + snprintf(buf, sizeof(buf), "disk_mount_all: %d", i); + lcd_puts(0, line++, buf); + + identify_info = ata_get_identify(); + + for (i=0; i < 20; i++) + ((unsigned short*)buf)[i]=htobe16(identify_info[i+27]); + + buf[40]=0; + + /* kill trailing space */ + for (i=39; i && buf[i]==' '; i--) + buf[i] = 0; + + lcd_puts(0, line++, "Model"); + lcd_puts(0, line++, buf); + + for (i=0; i < 4; i++) + ((unsigned short*)buf)[i]=htobe16(identify_info[i+23]); + + buf[8]=0; + + lcd_puts(0, line++, "Firmware"); + lcd_puts(0, line++, buf); + + pinfo = disk_partinfo(0); + snprintf(buf, sizeof(buf), "Partition 0: 0x%02x %ld MB", + pinfo->type, pinfo->size / 2048); + lcd_puts(0, line++, buf); + + testfile = open("/boottest.txt", O_WRONLY|O_CREAT|O_TRUNC); + write(testfile, "It works!", 9); + close(testfile); + + lcd_update(); + + /* now wait in USB mode so the bootloader can be updated */ + go_usb_mode(); + while(1); + + return((void *)0); +} + |