diff options
-rw-r--r-- | bootloader/ipod.c | 2 | ||||
-rw-r--r-- | bootloader/main-pp.c | 78 | ||||
-rw-r--r-- | firmware/Makefile | 3 | ||||
-rw-r--r-- | firmware/export/font.h | 1 | ||||
-rw-r--r-- | tools/convbdf.c | 70 |
5 files changed, 114 insertions, 40 deletions
diff --git a/bootloader/ipod.c b/bootloader/ipod.c index 5f7060a526..8b99fbd1ad 100644 --- a/bootloader/ipod.c +++ b/bootloader/ipod.c @@ -178,7 +178,7 @@ void printf(const char *format, ...) lcd_puts(0, line++, ptr); lcd_update(); - if(line >= 30) + if(line >= (LCD_HEIGHT/SYSFONT_HEIGHT)) line = 0; } diff --git a/bootloader/main-pp.c b/bootloader/main-pp.c index a533cc7044..ee2af38731 100644 --- a/bootloader/main-pp.c +++ b/bootloader/main-pp.c @@ -24,6 +24,7 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> +#include <stdarg.h> #include "cpu.h" #include "system.h" #include "lcd.h" @@ -51,6 +52,31 @@ char version[] = APPSVERSION; #define DRAM_START 0x10000000 int line=0; +char printfbuf[256]; + +void reset_screen(void) +{ + lcd_clear_display(); + line = 0; +} + +void printf(const char *format, ...) +{ + int len; + unsigned char *ptr; + va_list ap; + va_start(ap, format); + + + ptr = printfbuf; + len = vsnprintf(ptr, sizeof(printfbuf), format, ap); + va_end(ap); + + lcd_puts(0, line++, ptr); + lcd_update(); + if(line >= (LCD_HEIGHT/SYSFONT_HEIGHT)) + 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 @@ -100,9 +126,7 @@ int load_rockbox(unsigned char* buf) len = filesize(fd) - 8; - snprintf(str, sizeof(str), "Length: %x", len); - lcd_puts(0, line++ ,str); - lcd_update(); + printf("Length: %x", len); if (len > MAX_LOADSIZE) return -6; @@ -114,9 +138,7 @@ int load_rockbox(unsigned char* buf) if(rc < 4) return -2; - snprintf(str, sizeof(str), "Checksum: %x", chksum); - lcd_puts(0, line++ ,str); - lcd_update(); + printf("Checksum: %x", chksum); rc = read(fd, model, 4); if(rc < 4) @@ -124,9 +146,7 @@ int load_rockbox(unsigned char* buf) model[4] = 0; - snprintf(str, sizeof(str), "Model name: %s", model); - lcd_puts(0, line++ ,str); - lcd_update(); + printf("Model name: %s", model); lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET); @@ -142,10 +162,8 @@ int load_rockbox(unsigned char* buf) sum += buf[i]; } - snprintf(str, sizeof(str), "Sum: %x", sum); - lcd_puts(0, line++ ,str); - lcd_update(); - + printf("Sum: %x", sum); + if(sum != chksum) return -5; @@ -170,12 +188,9 @@ void* main(void) 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(); + printf("Rockbox boot loader"); + printf("Version: 20%s", version); + printf(MODEL_NAME); i=ata_init(); if (i==0) { @@ -188,44 +203,33 @@ void* main(void) for (i=39; i && buf[i]==' '; i--) { buf[i]=0; } - lcd_puts(0, line++, buf); - lcd_update(); + printf(buf); } else { - snprintf(buf, sizeof(buf), "ATA: %d", i); - lcd_puts(0, line++, buf); - lcd_update(); + printf("ATA: %d", i); } disk_init(); rc = disk_mount_all(); if (rc<=0) { - lcd_puts(0, line++, "No partition found"); - lcd_update(); + printf("No partition found"); } 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(); + printf("Partition 0: 0x%02x %ld MB", pinfo->type, pinfo->size / 2048); i=button_read_device(); if(i==BUTTON_LEFT) { - lcd_puts(0, line++, "Loading original firmware..."); - lcd_update(); + printf("Loading original firmware..."); rc=load_original_firmware(loadbuffer); } else { - lcd_puts(0, line++, "Loading Rockbox..."); - lcd_update(); + printf("Loading Rockbox..."); rc=load_rockbox(loadbuffer); } if (rc < 0) { - snprintf(buf, sizeof(buf), "Rockbox error: %d",rc); - lcd_puts(0, line++, buf); - lcd_update(); + printf("Rockbox error: %d",rc); while(1) {} } diff --git a/firmware/Makefile b/firmware/Makefile index dea4c81b33..55c8269b24 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -40,6 +40,9 @@ clean: $(OBJDIR)/thread.o: thread.c export/thread.h $(call PRINTS,CC thread.c)$(CC) -c -O -fomit-frame-pointer $(CFLAGS) $< -o $@ +sysfont.h: ../fonts/rockbox_default.bdf + $(call PRINTS,Create sysfont.h)$(TOOLSDIR)/convbdf -h -o $(BUILDDIR)/sysfont.h $< + $(OBJDIR)/sysfont.o: ../fonts/rockbox_default.bdf $(call PRINTS,CONVBDF)$(TOOLSDIR)/convbdf -c -o $(OBJDIR)/sysfont.c $< $(call PRINTS,CC sysfont.c)$(CC) $(CFLAGS) -c $(OBJDIR)/sysfont.c -o $@ diff --git a/firmware/export/font.h b/firmware/export/font.h index ccdb30ff00..3cf60aeac3 100644 --- a/firmware/export/font.h +++ b/firmware/export/font.h @@ -23,6 +23,7 @@ * Incore font and image definitions */ #include "config.h" +#include "sysfont.h" #if defined(HAVE_LCD_BITMAP) || defined(SIMULATOR) diff --git a/tools/convbdf.c b/tools/convbdf.c index 6dcd2d8394..c75b5fb444 100644 --- a/tools/convbdf.c +++ b/tools/convbdf.c @@ -64,6 +64,7 @@ struct font { #define EXTRA 300 /* # bytes extra allocation for buggy .bdf files*/ int gen_c = 0; +int gen_h = 0; int gen_fnt = 0; int gen_map = 1; int start_char = 0; @@ -83,6 +84,7 @@ char * bdf_getline(FILE *fp, char *buf, int len); bitmap_t bdf_hexval(unsigned char *buf, int ndx1, int ndx2); int gen_c_source(struct font* pf, char *path); +int gen_h_header(struct font* pf, char *path); int gen_fnt_file(struct font* pf, char *path); void @@ -93,6 +95,7 @@ usage(void) " convbdf [options] [-o output-file] [single-input-file]\n" "Options:\n" " -c Convert .bdf to .c source file\n" + " -h Convert .bdf to .h header file (to create sysfont.h)\n" " -f Convert .bdf to .fnt font file\n" " -s N Start output at character encodings >= N\n" " -l N Limit output to character encodings <= N\n" @@ -124,6 +127,9 @@ void getopts(int *pac, char ***pav) case 'c': /* generate .c output*/ gen_c = 1; break; + case 'h': /* generate .h output*/ + gen_h = 1; + break; case 'f': /* generate .fnt output*/ gen_fnt = 1; break; @@ -214,6 +220,14 @@ int convbdf(char *path) } ret |= gen_c_source(pf, outfile); } + + if (gen_h) { + if (!oflag) { + strcpy(outfile, basename(path)); + strcat(outfile, ".h"); + } + ret |= gen_h_header(pf, outfile); + } if (gen_fnt) { if (!oflag) { @@ -234,12 +248,12 @@ int main(int ac, char **av) ++av; --ac; /* skip av[0]*/ getopts(&ac, &av); /* read command line options*/ - if (ac < 1 || (!gen_c && !gen_fnt)) { + if (ac < 1 || (!gen_c && !gen_h && !gen_fnt)) { usage(); exit(1); } if (oflag) { - if (ac > 1 || (gen_c && gen_fnt)) { + if (ac > 1 || (gen_c && gen_fnt) || (gen_c && gen_h) || (gen_h && gen_fnt)) { usage(); exit(1); } @@ -965,6 +979,58 @@ int gen_c_source(struct font* pf, char *path) return 0; } +/* generate C header from in-core font*/ +int gen_h_header(struct font* pf, char *path) +{ + FILE *ofp; + time_t t = time(0); + char buf[256]; + char hdr1[] = { + "/* Generated by convbdf on %s. */\n" + "#ifdef HAVE_LCD_BITMAP\n" + "\n" + "/* Font information*/\n" + "#define SYSFONT_NAME %s\n" + "#define SYSFONT_FACENAME %s\n" + "#define SYSFONT_WIDTH %d\n" + "#define SYSFONT_HEIGHT %d\n" + "#define SYSFONT_SIZE %d\n" + "#define SYSFONT_ASCENT %d\n" + "#define SYSFONT_DESCENT %d\n" + "#define SYSFONT_FIRST_CHAR %d\n" + "#define SYSFONT_LAST_CHAR %d\n" + "#define SYSFONT_DEFAULT_CHAR %d\n" + "#define SYSFONT_PROPORTIONAL %s\n" + "#define SYSFONT_COPYRIGHT %s\n" + "#define SYSFONT_BITS_SIZE %d\n" + "\n" + "#endif\n" + }; + + ofp = fopen(path, "w"); + if (!ofp) { + fprintf(stderr, "Can't create %s\n", path); + return 1; + } + + strcpy(buf, ctime(&t)); + buf[strlen(buf)-1] = 0; + + fprintf(ofp, hdr1, buf, + pf->name, + pf->facename? pf->facename: "", + pf->maxwidth, pf->height, + pf->size, + pf->ascent, pf->descent, + pf->firstchar, + pf->firstchar+pf->size-1, + pf->defaultchar, + pf->width? 1: 0, + pf->copyright? pf->copyright: ""); + + return 0; +} + static int writebyte(FILE *fp, unsigned char c) { return putc(c, fp) != EOF; |