From 3b46671a40f4338b7ace8cdb64cf716f73626f31 Mon Sep 17 00:00:00 2001 From: Rob Purchase Date: Sat, 29 Mar 2008 17:26:16 +0000 Subject: [PATCH] Make the Telechips bootloader slightly less messy, kill some warnings and allow entry to the bootloader debug screen via the D2's hold switch. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16879 a1c6a512-1295-4272-9138-f99709370657 --- bootloader/telechips.c | 165 ++++++++++++++++++++++------------------- 1 file changed, 88 insertions(+), 77 deletions(-) diff --git a/bootloader/telechips.c b/bootloader/telechips.c index 305bdf3081..4c8b6ef5fd 100644 --- a/bootloader/telechips.c +++ b/bootloader/telechips.c @@ -35,6 +35,7 @@ #include "button.h" #include "adc.h" #include "adc-target.h" +#include "backlight.h" #include "backlight-target.h" #include "panic.h" #include "power.h" @@ -52,13 +53,92 @@ extern int line; #define MAX_LOAD_SIZE (8*1024*1024) /* Arbitrary, but plenty. */ -void* main(void) +void show_debug_screen(void) { int button; int power_count = 0; int count = 0; bool do_power_off = false; - + + while(!do_power_off) { + line = 0; + printf("Hello World!"); + + button = button_read_device(); + + /* Power-off if POWER button has been held for a long time + This loop is currently running at about 100 iterations/second + */ + if (button & POWEROFF_BUTTON) { + power_count++; + if (power_count > 200) + do_power_off = true; + } else { + power_count = 0; + } + + printf("Btn: 0x%08x",button); + +#if defined(COWON_D2) + int i; + + printf("GPIOA: 0x%08x",GPIOA); + printf("GPIOB: 0x%08x",GPIOB); + printf("GPIOC: 0x%08x",GPIOC); + printf("GPIOD: 0x%08x",GPIOD); + printf("GPIOE: 0x%08x",GPIOE); + + for (i = 0; i<4; i++) + { + printf("ADC%d: 0x%04x",i,adc_read(i)); + } + + /* TODO: Move this stuff out to a touchscreen driver and establish + how such a beast is going to work. Since it needs I2C read/write, + it can't easily go on an interrupt-based tick task. */ + { + unsigned char buf[] = { 0x2f, (0xE<<1) | 1, /* ADC start for X+Y */ + 0, 0, 0 }; + int x,y; + i2c_write(0x10, buf, 2); + i2c_readmem(0x10, 0x2e, buf, 5); + x = (buf[2] << 2) | (buf[3] & 3); + y = (buf[4] << 2) | ((buf[3] & 0xC) >> 2); + printf("X: 0x%03x Y: 0x%03x",x,y); + + x = (x*LCD_WIDTH) / 1024; + y = (y*LCD_HEIGHT) / 1024; + lcd_hline(x-5, x+5, y); + lcd_vline(x, y-5, y+5); + + buf[0] = 0x2f; + buf[1] = (0xF<<1) | 1; /* ADC start for P1+P2 */ + i2c_write(0x10, buf, 2); + i2c_readmem(0x10, 0x2e, buf, 5); + x = (buf[2] << 2) | (buf[3] & 3); + y = (buf[4] << 2) | ((buf[3] & 0xC) >> 2); + printf("P1: 0x%03x P2: 0x%03x",x,y); + } +#endif + + count++; + printf("Count: %d",count); + } + + lcd_clear_display(); + line = 0; + printf("POWER-OFF"); + + /* Power-off */ + power_off(); + + printf("(NOT) POWERED OFF"); + while (true); +} + + +void* main(void) +{ #if defined(COWON_D2) && defined(TCCBOOT) int rc; unsigned char* loadbuffer = (unsigned char*)LOAD_ADDRESS; @@ -108,85 +188,16 @@ void* main(void) { int(*kernel_entry)(void); + /* wait for button release to allow debug statememts to be read */ + while (button_read_device()) {}; + kernel_entry = (void*) loadbuffer; - rc = kernel_entry(); - } -#else - - while(!do_power_off) { - line = 0; - printf("Hello World!"); - - button = button_read_device(); - - /* Power-off if POWER button has been held for a long time - This loop is currently running at about 100 iterations/second - */ - if (button & POWEROFF_BUTTON) { - power_count++; - if (power_count > 200) - do_power_off = true; - } else { - power_count = 0; - } - - printf("Btn: 0x%08x",button); - -#if defined(COWON_D2) - int i; - - printf("GPIOA: 0x%08x",GPIOA); - printf("GPIOB: 0x%08x",GPIOB); - printf("GPIOC: 0x%08x",GPIOC); - printf("GPIOD: 0x%08x",GPIOD); - printf("GPIOE: 0x%08x",GPIOE); - for (i = 0; i<4; i++) - { - printf("ADC%d: 0x%04x",i,adc_read(i)); - } - - /* TODO: Move this stuff out to a touchscreen driver and establish - how such a beast is going to work. Since it needs I2C read/write, - it can't easily go on an interrupt-based tick task. */ - { - unsigned char buf[] = { 0x2f, (0xE<<1) | 1, /* ADC start for X+Y */ - 0, 0, 0 }; - int x,y; - i2c_write(0x10, buf, 2); - i2c_readmem(0x10, 0x2e, buf, 5); - x = (buf[2] << 2) | (buf[3] & 3); - y = (buf[4] << 2) | ((buf[3] & 0xC) >> 2); - printf("X: 0x%03x Y: 0x%03x",x,y); - - x = (x*LCD_WIDTH) / 1024; - y = (y*LCD_HEIGHT) / 1024; - lcd_hline(x-5, x+5, y); - lcd_vline(x, y-5, y+5); - - buf[0] = 0x2f; - buf[1] = (0xF<<1) | 1; /* ADC start for P1+P2 */ - i2c_write(0x10, buf, 2); - i2c_readmem(0x10, 0x2e, buf, 5); - x = (buf[2] << 2) | (buf[3] & 3); - y = (buf[4] << 2) | ((buf[3] & 0xC) >> 2); - printf("P1: 0x%03x P2: 0x%03x",x,y); - } -#endif - - count++; - printf("Count: %d",count); + /* allow entry to the debug screen if hold is on */ + if (!button_hold()) rc = kernel_entry(); } - - lcd_clear_display(); - line = 0; - printf("POWER-OFF"); - - /* Power-off */ - power_off(); - - printf("(NOT) POWERED OFF"); #endif + show_debug_screen(); return 0; }