summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bootloader/gigabeat-s.c50
-rw-r--r--firmware/app.lds2
-rw-r--r--firmware/common/disk.c7
-rw-r--r--firmware/export/config-gigabeat-s.h2
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/system-target.h2
5 files changed, 51 insertions, 12 deletions
diff --git a/bootloader/gigabeat-s.c b/bootloader/gigabeat-s.c
index 25b9ab5f35..d692dcba09 100644
--- a/bootloader/gigabeat-s.c
+++ b/bootloader/gigabeat-s.c
@@ -28,6 +28,7 @@
28#include "kernel.h" 28#include "kernel.h"
29#include "thread.h" 29#include "thread.h"
30#include "ata.h" 30#include "ata.h"
31#include "dir.h"
31#include "fat.h" 32#include "fat.h"
32#include "disk.h" 33#include "disk.h"
33#include "font.h" 34#include "font.h"
@@ -47,13 +48,18 @@
47#include <stdarg.h> 48#include <stdarg.h>
48 49
49char version[] = APPSVERSION; 50char version[] = APPSVERSION;
51char buf[MAX_PATH];
52char basedir[] = "/Content/0b00/00/"; /* Where files sent via MTP are stored */
53char model[5];
54int (*kernel_entry)(void);
50 55
51void main(void) 56void main(void)
52{ 57{
53 lcd_clear_display(); 58 lcd_clear_display();
54 printf("Hello world!"); 59 printf("Hello world!");
55 printf("Gigabeat S Rockbox Bootloader v.00000001"); 60 printf("Gigabeat S Rockbox Bootloader v.00000001");
56 kernel_init(); 61 kernel_init();
62 printf("kernel init done");
57 int rc; 63 int rc;
58 64
59 rc = ata_init(); 65 rc = ata_init();
@@ -62,8 +68,10 @@ void main(void)
62 reset_screen(); 68 reset_screen();
63 error(EATA, rc); 69 error(EATA, rc);
64 } 70 }
71 printf("ata init done");
65 72
66 disk_init(); 73 disk_init();
74 printf("disk init done");
67 75
68 rc = disk_mount_all(); 76 rc = disk_mount_all();
69 if (rc<=0) 77 if (rc<=0)
@@ -71,24 +79,48 @@ void main(void)
71 error(EDISK,rc); 79 error(EDISK,rc);
72 } 80 }
73 81
74 printf("Congratulations!"); 82 /* Look for the first valid firmware file */
75 while(1); 83 struct dirent_uncached* entry;
84 DIR_UNCACHED* dir;
85 int fd;
86 dir = opendir_uncached(basedir);
87 while ((entry = readdir_uncached(dir)))
88 {
89 if (*entry->d_name != '.')
90 {
91 snprintf(buf, sizeof(buf), "%s%s", basedir, entry->d_name);
92 fd = open(buf, O_RDONLY);
93 if (fd >= 0)
94 {
95 lseek(fd, 4, SEEK_SET);
96 rc = read(fd, model, 4);
97 close(fd);
98 if (rc == 4)
99 {
100 model[4] = 0;
101 if (strcmp(model, "gigs") == 0)
102 break;
103 }
104 }
105 }
106 }
76 107
77#if 0 108 printf("Firmware file: %s", buf);
78 printf("Loading firmware"); 109 printf("Loading firmware");
79 110
80 loadbuffer = (unsigned char*) 0x100; 111 unsigned char *loadbuffer = (unsigned char *)0x88000000;
81 buffer_size = (unsigned char*)0x400000 - loadbuffer; 112 int buffer_size = 1024*1024;
82 113
83 rc = load_firmware(loadbuffer, BOOTFILE, buffer_size); 114 rc = load_firmware(loadbuffer, buf, buffer_size);
84 if(rc < 0) 115 if(rc < 0)
85 error(EBOOTFILE, rc); 116 error(buf, rc);
86 117
87 if (rc == EOK) 118 if (rc == EOK)
88 { 119 {
89 kernel_entry = (void*) loadbuffer; 120 kernel_entry = (void*) loadbuffer;
90 rc = kernel_entry(); 121 rc = kernel_entry();
91 } 122 }
92#endif 123
124 while (1);
93} 125}
94 126
diff --git a/firmware/app.lds b/firmware/app.lds
index d88ce9fd60..87f3d2ae23 100644
--- a/firmware/app.lds
+++ b/firmware/app.lds
@@ -70,7 +70,7 @@ INPUT(target/sh/crt0.o)
70#define IRAMORIG 0x00000000 70#define IRAMORIG 0x00000000
71#define IRAMSIZE 0x4000 71#define IRAMSIZE 0x4000
72#elif CONFIG_CPU==IMX31L 72#elif CONFIG_CPU==IMX31L
73#define DRAMORIG (0x80000000 + STUBOFFSET) 73#define DRAMORIG (0x88000000 + STUBOFFSET)
74#define IRAMORIG 0x1FFFC000 74#define IRAMORIG 0x1FFFC000
75#define IRAMSIZE 0x4000 75#define IRAMSIZE 0x4000
76#else 76#else
diff --git a/firmware/common/disk.c b/firmware/common/disk.c
index 563bb05ec1..e3cf8391ed 100644
--- a/firmware/common/disk.c
+++ b/firmware/common/disk.c
@@ -150,7 +150,12 @@ int disk_mount(int drive)
150 /* The Elio's hard drive has no partition table and probing for partitions causes 150 /* The Elio's hard drive has no partition table and probing for partitions causes
151 Rockbox to crash - so we temporarily disable the probing until we fix the 151 Rockbox to crash - so we temporarily disable the probing until we fix the
152 real problem. */ 152 real problem. */
153 for (i=0; volume != -1 && i<4; i++) 153#ifdef TOSHIBA_GIGABEAT_S
154 i = 1; /* For the Gigabeat S, we mount the second partition */
155#else
156 i = 0;
157#endif
158 for (i; volume != -1 && i<4; i++)
154 { 159 {
155#ifdef MAX_LOG_SECTOR_SIZE 160#ifdef MAX_LOG_SECTOR_SIZE
156 int j; 161 int j;
diff --git a/firmware/export/config-gigabeat-s.h b/firmware/export/config-gigabeat-s.h
index 285b381480..c6de206d8c 100644
--- a/firmware/export/config-gigabeat-s.h
+++ b/firmware/export/config-gigabeat-s.h
@@ -6,7 +6,7 @@
6#define TOSHIBA_GIGABEAT_S 1 6#define TOSHIBA_GIGABEAT_S 1
7 7
8/* For Rolo and boot loader */ 8/* For Rolo and boot loader */
9#define MODEL_NUMBER 19 9#define MODEL_NUMBER 21
10 10
11/* define this if you have a bitmap LCD display */ 11/* define this if you have a bitmap LCD display */
12#define HAVE_LCD_BITMAP 12#define HAVE_LCD_BITMAP
diff --git a/firmware/target/arm/imx31/gigabeat-s/system-target.h b/firmware/target/arm/imx31/gigabeat-s/system-target.h
index b1803d01cb..e87b93b13a 100644
--- a/firmware/target/arm/imx31/gigabeat-s/system-target.h
+++ b/firmware/target/arm/imx31/gigabeat-s/system-target.h
@@ -30,6 +30,8 @@ static inline void udelay(unsigned int usecs)
30 while (EPITCNT1 > stop); 30 while (EPITCNT1 > stop);
31} 31}
32 32
33#define __dbg_hw_info(...) 0
34#define __dbg_ports(...) 0
33 35
34#define HAVE_INVALIDATE_ICACHE 36#define HAVE_INVALIDATE_ICACHE
35static inline void invalidate_icache(void) 37static inline void invalidate_icache(void)