diff options
author | Daniel Ankers <dan@weirdo.org.uk> | 2006-10-16 17:21:36 +0000 |
---|---|---|
committer | Daniel Ankers <dan@weirdo.org.uk> | 2006-10-16 17:21:36 +0000 |
commit | d8ef7c58d83591bb0660fc4965cf2319fb5a4718 (patch) | |
tree | a71d3d9909cec32d3a8d22b10017a1e8959cfc16 /bootloader/e200.c | |
parent | 55d1675ada5273a815966057b811605462e1f7bd (diff) |
Big Sansa update: Go back to using the common crt0-pp.S. Add LCD driver. Add ADC driver (may not be needed). Fix a bug in the button driver.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11237 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader/e200.c')
-rw-r--r-- | bootloader/e200.c | 131 |
1 files changed, 112 insertions, 19 deletions
diff --git a/bootloader/e200.c b/bootloader/e200.c index 91217f5c70..27b1118a1c 100644 --- a/bootloader/e200.c +++ b/bootloader/e200.c @@ -36,33 +36,61 @@ #include "power.h" #include "file.h" -void main(void) +static inline void blink(void) { volatile unsigned int* ptr; int i; + ptr = (volatile unsigned int*)0x70000020; - while(1) + *ptr &= ~(1 << 13); + for(i = 0; i < 0xfffff; i++) + { + } + *ptr |= (1 << 13); + for(i = 0; i < 0xfffff; i++) { - // blink wheel backlight - ptr = (volatile unsigned int*)0x70000020; - if((*ptr) & (1 << 13)) - { - *ptr = (*ptr) & ~(1 << 13); - - } - else - { - *ptr = (*ptr) | (1 << 13); - } - - // wait a while - 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 */ @@ -72,7 +100,62 @@ void reset_poweroff_timer(void) int dbg_ports(void) { - return 0; + 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) @@ -95,3 +178,13 @@ void system_reboot(void) { } + +void main(void) +{ + kernel_init(); + adc_init(); + lcd_init_device(); + + dbg_ports(); +} + |