From 386503502b2794021f5de431a32bad41dfe5c2d9 Mon Sep 17 00:00:00 2001 From: Dave Chapman Date: Sat, 18 Jul 2009 11:31:19 +0000 Subject: Various Nano2g changes - enable the rest of crt0.S (including clock setup) and make the nano2g bootloader do something useful (displaying gpio ports). Also add checks for the fifo-full condition in the LCD driver - required after enabling all the crt0.S inits git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21948 a1c6a512-1295-4272-9138-f99709370657 --- bootloader/ipodnano2g.c | 45 ++++++++++++++++++++-- firmware/SOURCES | 1 + firmware/export/s5l8700.h | 2 + firmware/target/arm/s5l8700/crt0.S | 6 ++- .../target/arm/s5l8700/ipodnano2g/lcd-nano2g.c | 9 +++++ 5 files changed, 59 insertions(+), 4 deletions(-) diff --git a/bootloader/ipodnano2g.c b/bootloader/ipodnano2g.c index e8e8e2e1a4..f6bfe148ac 100644 --- a/bootloader/ipodnano2g.c +++ b/bootloader/ipodnano2g.c @@ -30,6 +30,7 @@ #include "cpu.h" #include "system.h" #include "lcd.h" +#include "i2c-s5l8700.h" #include "kernel.h" #include "thread.h" #include "storage.h" @@ -49,13 +50,51 @@ char version[] = APPSVERSION; /* Show the Rockbox logo - in show_logo.c */ extern int show_logo(void); +extern int line; + void main(void) { + int i; + + system_init(); + i2c_init(); + kernel_init(); + + enable_irq(); + lcd_init(); - show_logo(); + _backlight_init(); + + lcd_puts_scroll(0,0,"+++ this is a very very long line to test scrolling. ---"); + verbose = 0; + i = 0; + while (!button_hold()) { + line = 1; - /* Do nothing... */ + printf("i=%d",i++); + printf("TBCNT: %08x",TBCNT); + printf("GPIO 0: %08x",PDAT0); + printf("GPIO 1: %08x",PDAT1); + printf("GPIO 2: %08x",PDAT2); + printf("GPIO 3: %08x",PDAT3); + printf("GPIO 4: %08x",PDAT4); + printf("GPIO 5: %08x",PDAT5); + printf("GPIO 6: %08x",PDAT6); + printf("GPIO 7: %08x",PDAT7); + printf("GPIO 10: %08x",PDAT10); + printf("GPIO 11: %08x",PDAT11); + printf("GPIO 13: %08x",PDAT13); + printf("GPIO 14: %08x",PDAT14); + + lcd_update(); + } + + disable_irq(); + + /* Branch back to iBugger entry point */ + asm volatile("ldr pc, =0x08640568"); + + /* We never reach here */ while(1); } - diff --git a/firmware/SOURCES b/firmware/SOURCES index a3359cf8e7..51693b9b65 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -1303,6 +1303,7 @@ target/arm/s5l8700/udacodec-meizu.c #ifdef IPOD_NANO2G target/arm/s5l8700/kernel-s5l8700.c target/arm/s5l8700/ipodnano2g/backlight-nano2g.c +target/arm/s5l8700/ipodnano2g/button-nano2g.c target/arm/s5l8700/ipodnano2g/lcd-nano2g.c #endif diff --git a/firmware/export/s5l8700.h b/firmware/export/s5l8700.h index 353690398a..4360f14a2d 100644 --- a/firmware/export/s5l8700.h +++ b/firmware/export/s5l8700.h @@ -19,6 +19,8 @@ * ****************************************************************************/ +#include + #define REG8_PTR_T volatile uint8_t * #define REG16_PTR_T volatile uint16_t * #define REG32_PTR_T volatile uint32_t * diff --git a/firmware/target/arm/s5l8700/crt0.S b/firmware/target/arm/s5l8700/crt0.S index c79897606c..c6e201e73f 100644 --- a/firmware/target/arm/s5l8700/crt0.S +++ b/firmware/target/arm/s5l8700/crt0.S @@ -82,7 +82,6 @@ newstart2: // orr r0, r0, r2 // str r0, [r1] // switch backlight on -#if CONFIG_CPU==S5L8700 ldr r1, =0x3c500000 // CLKCON ldr r0, =0x00800080 str r0, [r1] @@ -90,7 +89,11 @@ newstart2: mov r0, #0 str r0, [r1] ldr r1, =0x3c500004 // PLL0PMS +#ifdef IPOD_NANO2G + ldr r0, =0x21200 +#else ldr r0, =0x1ad200 +#endif str r0, [r1] ldr r1, =0x3c500014 // PLL0LCNT ldr r0, =8100 @@ -226,6 +229,7 @@ newstart2: mcr 15, 0, r0, c1, c0, 0 // enable protection unit +#if CONFIG_CPU==S5L8700 /* Copy interrupt vectors to iram */ ldr r2, =_intvectstart ldr r3, =_intvectend diff --git a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c index 481e548440..3cbff75ffd 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c @@ -60,21 +60,28 @@ static int xoffset; /* needed for flip */ static inline void s5l_lcd_write_cmd_data(int cmd, int data) { + while (LCD_STATUS & 0x10); LCD_WCMD = cmd >> 8; + while (LCD_STATUS & 0x10); LCD_WCMD = cmd & 0xff; + while (LCD_STATUS & 0x10); LCD_WDATA = data >> 8; + while (LCD_STATUS & 0x10); LCD_WDATA = data & 0xff; } static inline void s5l_lcd_write_cmd(unsigned short cmd) { + while (LCD_STATUS & 0x10); LCD_WCMD = cmd; } static inline void s5l_lcd_write_data(int data) { + while (LCD_STATUS & 0x10); LCD_WDATA = data >> 8; + while (LCD_STATUS & 0x10); LCD_WDATA = data & 0xff; } @@ -185,7 +192,9 @@ void lcd_update(void) for (x = 0; x < LCD_WIDTH; x++) { pixel = *(p++); + while (LCD_STATUS & 0x10); LCD_WDATA = (pixel & 0xff00) >> 8; + while (LCD_STATUS & 0x10); LCD_WDATA = pixel & 0xff; } } -- cgit v1.2.3