summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2009-07-18 11:31:19 +0000
committerDave Chapman <dave@dchapman.com>2009-07-18 11:31:19 +0000
commit386503502b2794021f5de431a32bad41dfe5c2d9 (patch)
tree19e3b216233cfc7c529633458f2aa80a157e81a9
parentd58e3584772189715f54b4035cd13eac4270058e (diff)
downloadrockbox-386503502b2794021f5de431a32bad41dfe5c2d9.tar.gz
rockbox-386503502b2794021f5de431a32bad41dfe5c2d9.zip
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
-rw-r--r--bootloader/ipodnano2g.c45
-rw-r--r--firmware/SOURCES1
-rw-r--r--firmware/export/s5l8700.h2
-rw-r--r--firmware/target/arm/s5l8700/crt0.S6
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c9
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 @@
30#include "cpu.h" 30#include "cpu.h"
31#include "system.h" 31#include "system.h"
32#include "lcd.h" 32#include "lcd.h"
33#include "i2c-s5l8700.h"
33#include "kernel.h" 34#include "kernel.h"
34#include "thread.h" 35#include "thread.h"
35#include "storage.h" 36#include "storage.h"
@@ -49,13 +50,51 @@ char version[] = APPSVERSION;
49/* Show the Rockbox logo - in show_logo.c */ 50/* Show the Rockbox logo - in show_logo.c */
50extern int show_logo(void); 51extern int show_logo(void);
51 52
53extern int line;
54
52void main(void) 55void main(void)
53{ 56{
57 int i;
58
59 system_init();
60 i2c_init();
61 kernel_init();
62
63 enable_irq();
64
54 lcd_init(); 65 lcd_init();
55 66
56 show_logo(); 67 _backlight_init();
68
69 lcd_puts_scroll(0,0,"+++ this is a very very long line to test scrolling. ---");
70 verbose = 0;
71 i = 0;
72 while (!button_hold()) {
73 line = 1;
57 74
58 /* Do nothing... */ 75 printf("i=%d",i++);
76 printf("TBCNT: %08x",TBCNT);
77 printf("GPIO 0: %08x",PDAT0);
78 printf("GPIO 1: %08x",PDAT1);
79 printf("GPIO 2: %08x",PDAT2);
80 printf("GPIO 3: %08x",PDAT3);
81 printf("GPIO 4: %08x",PDAT4);
82 printf("GPIO 5: %08x",PDAT5);
83 printf("GPIO 6: %08x",PDAT6);
84 printf("GPIO 7: %08x",PDAT7);
85 printf("GPIO 10: %08x",PDAT10);
86 printf("GPIO 11: %08x",PDAT11);
87 printf("GPIO 13: %08x",PDAT13);
88 printf("GPIO 14: %08x",PDAT14);
89
90 lcd_update();
91 }
92
93 disable_irq();
94
95 /* Branch back to iBugger entry point */
96 asm volatile("ldr pc, =0x08640568");
97
98 /* We never reach here */
59 while(1); 99 while(1);
60} 100}
61
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
1303#ifdef IPOD_NANO2G 1303#ifdef IPOD_NANO2G
1304target/arm/s5l8700/kernel-s5l8700.c 1304target/arm/s5l8700/kernel-s5l8700.c
1305target/arm/s5l8700/ipodnano2g/backlight-nano2g.c 1305target/arm/s5l8700/ipodnano2g/backlight-nano2g.c
1306target/arm/s5l8700/ipodnano2g/button-nano2g.c
1306target/arm/s5l8700/ipodnano2g/lcd-nano2g.c 1307target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
1307#endif 1308#endif
1308 1309
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 @@
19 * 19 *
20 ****************************************************************************/ 20 ****************************************************************************/
21 21
22#include <inttypes.h>
23
22#define REG8_PTR_T volatile uint8_t * 24#define REG8_PTR_T volatile uint8_t *
23#define REG16_PTR_T volatile uint16_t * 25#define REG16_PTR_T volatile uint16_t *
24#define REG32_PTR_T volatile uint32_t * 26#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:
82// orr r0, r0, r2 82// orr r0, r0, r2
83// str r0, [r1] // switch backlight on 83// str r0, [r1] // switch backlight on
84 84
85#if CONFIG_CPU==S5L8700
86 ldr r1, =0x3c500000 // CLKCON 85 ldr r1, =0x3c500000 // CLKCON
87 ldr r0, =0x00800080 86 ldr r0, =0x00800080
88 str r0, [r1] 87 str r0, [r1]
@@ -90,7 +89,11 @@ newstart2:
90 mov r0, #0 89 mov r0, #0
91 str r0, [r1] 90 str r0, [r1]
92 ldr r1, =0x3c500004 // PLL0PMS 91 ldr r1, =0x3c500004 // PLL0PMS
92#ifdef IPOD_NANO2G
93 ldr r0, =0x21200
94#else
93 ldr r0, =0x1ad200 95 ldr r0, =0x1ad200
96#endif
94 str r0, [r1] 97 str r0, [r1]
95 ldr r1, =0x3c500014 // PLL0LCNT 98 ldr r1, =0x3c500014 // PLL0LCNT
96 ldr r0, =8100 99 ldr r0, =8100
@@ -226,6 +229,7 @@ newstart2:
226 mcr 15, 0, r0, c1, c0, 0 // enable protection unit 229 mcr 15, 0, r0, c1, c0, 0 // enable protection unit
227 230
228 231
232#if CONFIG_CPU==S5L8700
229 /* Copy interrupt vectors to iram */ 233 /* Copy interrupt vectors to iram */
230 ldr r2, =_intvectstart 234 ldr r2, =_intvectstart
231 ldr r3, =_intvectend 235 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 */
60 60
61static inline void s5l_lcd_write_cmd_data(int cmd, int data) 61static inline void s5l_lcd_write_cmd_data(int cmd, int data)
62{ 62{
63 while (LCD_STATUS & 0x10);
63 LCD_WCMD = cmd >> 8; 64 LCD_WCMD = cmd >> 8;
65 while (LCD_STATUS & 0x10);
64 LCD_WCMD = cmd & 0xff; 66 LCD_WCMD = cmd & 0xff;
65 67
68 while (LCD_STATUS & 0x10);
66 LCD_WDATA = data >> 8; 69 LCD_WDATA = data >> 8;
70 while (LCD_STATUS & 0x10);
67 LCD_WDATA = data & 0xff; 71 LCD_WDATA = data & 0xff;
68} 72}
69 73
70static inline void s5l_lcd_write_cmd(unsigned short cmd) 74static inline void s5l_lcd_write_cmd(unsigned short cmd)
71{ 75{
76 while (LCD_STATUS & 0x10);
72 LCD_WCMD = cmd; 77 LCD_WCMD = cmd;
73} 78}
74 79
75static inline void s5l_lcd_write_data(int data) 80static inline void s5l_lcd_write_data(int data)
76{ 81{
82 while (LCD_STATUS & 0x10);
77 LCD_WDATA = data >> 8; 83 LCD_WDATA = data >> 8;
84 while (LCD_STATUS & 0x10);
78 LCD_WDATA = data & 0xff; 85 LCD_WDATA = data & 0xff;
79} 86}
80 87
@@ -185,7 +192,9 @@ void lcd_update(void)
185 for (x = 0; x < LCD_WIDTH; x++) { 192 for (x = 0; x < LCD_WIDTH; x++) {
186 pixel = *(p++); 193 pixel = *(p++);
187 194
195 while (LCD_STATUS & 0x10);
188 LCD_WDATA = (pixel & 0xff00) >> 8; 196 LCD_WDATA = (pixel & 0xff00) >> 8;
197 while (LCD_STATUS & 0x10);
189 LCD_WDATA = pixel & 0xff; 198 LCD_WDATA = pixel & 0xff;
190 } 199 }
191 } 200 }