| Index: umsboot/target/ipodnano4g/lcd.c |
| — | — | @@ -86,6 +86,8 @@ |
| 87 | 87 | unsigned int starty, unsigned int endy, void* data, int color)
|
| 88 | 88 | {
|
| 89 | 89 | displaylcd_sync();
|
| | 90 | + while (!(LCDSTATUS & 0x2));
|
| | 91 | + LCDCON = 0x41100db8;
|
| 90 | 92 | lcd_send_cmd(0x2a);
|
| 91 | 93 | lcd_send_data(startx);
|
| 92 | 94 | lcd_send_data(endx);
|
| Index: umsboot/target/ipodnano4g/s5l8720.h |
| — | — | @@ -528,6 +528,7 @@ |
| 529 | 529 |
|
| 530 | 530 |
|
| 531 | 531 | /////LCD/////
|
| | 532 | +#define LCDCON (*((uint32_t volatile*)(0x38300000)))
|
| 532 | 533 | #define LCDWCMD (*((uint32_t volatile*)(0x38300004)))
|
| 533 | 534 | #define LCDSTATUS (*((uint32_t volatile*)(0x3830001c)))
|
| 534 | 535 | #define LCDWDATA (*((uint32_t volatile*)(0x38300040)))
|
| Index: emcore/trunk/target/ipodnano2g/lcd.c |
| — | — | @@ -219,6 +219,7 @@ |
| 220 | 220 | __asm__ volatile(" str r12, [sp] \n"); |
| 221 | 221 | __asm__ volatile(" mov r12, r2 \n"); |
| 222 | 222 | __asm__ volatile(" add r8, r2, r2,lsl#1 \n"); |
| | 223 | + __asm__ volatile(" add r8, r8, #3 \n"); |
| 223 | 224 | __asm__ volatile(" add r3, r1, r3 \n"); |
| 224 | 225 | __asm__ volatile(" sub r3, r3, #1 \n"); |
| 225 | 226 | __asm__ volatile(" mov r2, r1 \n"); |
| — | — | @@ -258,7 +259,7 @@ |
| 259 | 260 | __asm__ volatile(" mov r7, r8 \n"); |
| 260 | 261 | __asm__ volatile("displaylcd_dither_x: \n"); |
| 261 | 262 | __asm__ volatile(" ldrb r1, [r3], #1 \n"); |
| 262 | | - __asm__ volatile(" ldrsb r0, [r7] \n"); |
| | 263 | + __asm__ volatile(" ldrsb r0, [r7,#3] \n"); |
| 263 | 264 | __asm__ volatile(" add r1, r1, r4 \n"); |
| 264 | 265 | __asm__ volatile(" add r1, r1, r0 \n"); |
| 265 | 266 | __asm__ volatile(" cmp r1, #0xff \n"); |
| — | — | @@ -273,7 +274,7 @@ |
| 274 | 275 | __asm__ volatile(" strb r4, [r7], #1 \n"); |
| 275 | 276 | __asm__ volatile(" mov r4, r1,asr#1 \n"); |
| 276 | 277 | __asm__ volatile(" ldrb r1, [r3], #1 \n"); |
| 277 | | - __asm__ volatile(" ldrsb r0, [r7] \n"); |
| | 278 | + __asm__ volatile(" ldrsb r0, [r7,#3] \n"); |
| 278 | 279 | __asm__ volatile(" add r1, r1, r5 \n"); |
| 279 | 280 | __asm__ volatile(" add r1, r1, r0 \n"); |
| 280 | 281 | __asm__ volatile(" cmp r1, #0xff \n"); |
| — | — | @@ -280,7 +281,7 @@ |
| 281 | 282 | __asm__ volatile(" mvnhi r1, r1,asr#31 \n"); |
| 282 | 283 | __asm__ volatile(" andhi r1, r1, #0xff \n"); |
| 283 | 284 | __asm__ volatile(" mov r0, r1,lsr#2 \n"); |
| 284 | | - __asm__ volatile(" orr r2, r2, r0,lsl#5 \n"); |
| | 285 | + __asm__ volatile(" orr r2, r2, r0,lsl#5 \n"); |
| 285 | 286 | __asm__ volatile(" sub r1, r1, r0,lsl#2 \n"); |
| 286 | 287 | __asm__ volatile(" sub r1, r1, r0,lsr#4 \n"); |
| 287 | 288 | __asm__ volatile(" mov r5, r5,lsr#1 \n"); |
| — | — | @@ -288,7 +289,7 @@ |
| 289 | 290 | __asm__ volatile(" strb r5, [r7], #1 \n"); |
| 290 | 291 | __asm__ volatile(" mov r5, r1,asr#1 \n"); |
| 291 | 292 | __asm__ volatile(" ldrb r1, [r3], #1 \n"); |
| 292 | | - __asm__ volatile(" ldrsb r0, [r7] \n"); |
| | 293 | + __asm__ volatile(" ldrsb r0, [r7,#3] \n"); |
| 293 | 294 | __asm__ volatile(" add r1, r1, r6 \n"); |
| 294 | 295 | __asm__ volatile(" add r1, r1, r0 \n"); |
| 295 | 296 | __asm__ volatile(" cmp r1, #0xff \n"); |
| Index: emcore/trunk/target/ipodnano3g/lcd.c |
| — | — | @@ -236,6 +236,7 @@ |
| 237 | 237 | __asm__ volatile(" str r12, [sp] \n"); |
| 238 | 238 | __asm__ volatile(" mov r12, r2 \n"); |
| 239 | 239 | __asm__ volatile(" add r8, r2, r2,lsl#1 \n"); |
| | 240 | + __asm__ volatile(" add r8, r8, #3 \n"); |
| 240 | 241 | __asm__ volatile(" add r3, r1, r3 \n"); |
| 241 | 242 | __asm__ volatile(" sub r3, r3, #1 \n"); |
| 242 | 243 | __asm__ volatile(" mov r2, r1 \n"); |
| — | — | @@ -281,7 +282,7 @@ |
| 282 | 283 | __asm__ volatile(" mov r7, r8 \n"); |
| 283 | 284 | __asm__ volatile("displaylcd_dither_x: \n"); |
| 284 | 285 | __asm__ volatile(" ldrb r1, [r3], #1 \n"); |
| 285 | | - __asm__ volatile(" ldrsb r0, [r7] \n"); |
| | 286 | + __asm__ volatile(" ldrsb r0, [r7,#3] \n"); |
| 286 | 287 | __asm__ volatile(" add r1, r1, r4 \n"); |
| 287 | 288 | __asm__ volatile(" add r1, r1, r0 \n"); |
| 288 | 289 | __asm__ volatile(" cmp r1, #0xff \n"); |
| — | — | @@ -296,7 +297,7 @@ |
| 297 | 298 | __asm__ volatile(" strb r4, [r7], #1 \n"); |
| 298 | 299 | __asm__ volatile(" mov r4, r1,asr#1 \n"); |
| 299 | 300 | __asm__ volatile(" ldrb r1, [r3], #1 \n"); |
| 300 | | - __asm__ volatile(" ldrsb r0, [r7] \n"); |
| | 301 | + __asm__ volatile(" ldrsb r0, [r7,#3] \n"); |
| 301 | 302 | __asm__ volatile(" add r1, r1, r5 \n"); |
| 302 | 303 | __asm__ volatile(" add r1, r1, r0 \n"); |
| 303 | 304 | __asm__ volatile(" cmp r1, #0xff \n"); |
| — | — | @@ -311,7 +312,7 @@ |
| 312 | 313 | __asm__ volatile(" strb r5, [r7], #1 \n"); |
| 313 | 314 | __asm__ volatile(" mov r5, r1,asr#1 \n"); |
| 314 | 315 | __asm__ volatile(" ldrb r1, [r3], #1 \n"); |
| 315 | | - __asm__ volatile(" ldrsb r0, [r7] \n"); |
| | 316 | + __asm__ volatile(" ldrsb r0, [r7,#3] \n"); |
| 316 | 317 | __asm__ volatile(" add r1, r1, r6 \n"); |
| 317 | 318 | __asm__ volatile(" add r1, r1, r0 \n"); |
| 318 | 319 | __asm__ volatile(" cmp r1, #0xff \n"); |
| Index: emcore/trunk/target/ipodnano4g/lcd.c |
| — | — | @@ -92,7 +92,7 @@ |
| 93 | 93 | mutex_lock(&lcd_mutex, TIMEOUT_BLOCK); |
| 94 | 94 | displaylcd_sync(); |
| 95 | 95 | while (!(LCDSTATUS & 0x2)); |
| 96 | | - LCDCON = 0x41100db8; |
| | 96 | + LCDCON = 0x81100db8; |
| 97 | 97 | } |
| 98 | 98 | |
| 99 | 99 | bool displaylcd_busy() ICODE_ATTR; |
| — | — | @@ -121,7 +121,7 @@ |
| 122 | 122 | } |
| 123 | 123 | else while (DMAC0C4CONFIG & 1); |
| 124 | 124 | while (!(LCDSTATUS & 0x2)); |
| 125 | | - LCDCON = 0x41100db8; |
| | 125 | + LCDCON = 0x81100db8; |
| 126 | 126 | lcd_send_cmd(0x2a); |
| 127 | 127 | lcd_send_data(startx); |
| 128 | 128 | lcd_send_data(endx); |
| — | — | @@ -190,7 +190,6 @@ |
| 191 | 191 | unsigned int height, void* data, unsigned int datax, |
| 192 | 192 | unsigned int datay, unsigned int stride, bool solid) |
| 193 | 193 | { |
| 194 | | -//TODO: This is ARMv5E optimized assembly, should be converted to ARMv6 |
| 195 | 194 | __asm__ volatile(" muls r12, r2, r3 \n"); |
| 196 | 195 | __asm__ volatile(" bxeq lr \n"); |
| 197 | 196 | __asm__ volatile(" stmfd sp!, {r1-r11,lr} \n"); |
| — | — | @@ -197,8 +196,9 @@ |
| 198 | 197 | __asm__ volatile(" mov r12, #0 \n"); |
| 199 | 198 | __asm__ volatile(" str r12, [sp] \n"); |
| 200 | 199 | __asm__ volatile(" mov r12, r2 \n"); |
| 201 | | - __asm__ volatile(" add r8, r2, r2,lsl#1 \n"); |
| | 200 | + __asm__ volatile(" mov r8, r2,lsl#2 \n"); |
| 202 | 201 | __asm__ volatile(" add r3, r1, r3 \n"); |
| | 202 | + __asm__ volatile(" add r8, r8, #4 \n"); |
| 203 | 203 | __asm__ volatile(" sub r3, r3, #1 \n"); |
| 204 | 204 | __asm__ volatile(" mov r2, r1 \n"); |
| 205 | 205 | __asm__ volatile(" add r1, r0, r12 \n"); |
| — | — | @@ -226,74 +226,43 @@ |
| 227 | 227 | __asm__ volatile(" add r3, r3, r0 \n"); |
| 228 | 228 | __asm__ volatile(" subeq r11, r11, r1 \n"); |
| 229 | 229 | __asm__ volatile(" add r11, r11, r11,lsl#1 \n"); |
| 230 | | - __asm__ volatile(" movne r10, #3 \n"); |
| 231 | | - __asm__ volatile(" moveq r10, #0 \n"); |
| | 230 | + __asm__ volatile(" movne r10, #0 \n"); |
| | 231 | + __asm__ volatile(" moveq r10, #3 \n"); |
| 232 | 232 | __asm__ volatile(" ldr r9, =0x38300040 \n"); |
| 233 | 233 | __asm__ volatile("displaylcd_dither_wait : \n"); |
| 234 | 234 | __asm__ volatile(" ldr r4, [r9,#-0x24] \n"); |
| 235 | 235 | __asm__ volatile(" tst r4, #2 \n"); |
| 236 | 236 | __asm__ volatile(" beq displaylcd_dither_wait \n"); |
| 237 | | - __asm__ volatile(" ldr r4, =0x41104eb8 \n"); |
| | 237 | + __asm__ volatile(" ldr r4, =0x81104eb8 \n"); |
| 238 | 238 | __asm__ volatile(" str r4, [r9,#-0x40] \n"); |
| | 239 | + __asm__ volatile(" ldr r6, =0x30303 \n"); |
| | 240 | + __asm__ volatile(" ldr r4, =0x808080 \n"); |
| 239 | 241 | __asm__ volatile("displaylcd_dither_y: \n"); |
| 240 | 242 | __asm__ volatile(" ldr lr, [sp] \n"); |
| 241 | | - __asm__ volatile(" mov r4, #0 \n"); |
| 242 | 243 | __asm__ volatile(" mov r5, #0 \n"); |
| 243 | | - __asm__ volatile(" mov r6, #0 \n"); |
| 244 | 244 | __asm__ volatile(" mov r7, r8 \n"); |
| 245 | | - __asm__ volatile("displaylcd_dither_x: \n"); |
| 246 | | - __asm__ volatile(" ldrb r1, [r3], #1 \n"); |
| 247 | | - __asm__ volatile(" ldrsb r0, [r7] \n"); |
| 248 | | - __asm__ volatile(" add r1, r1, r4 \n"); |
| 249 | | - __asm__ volatile(" add r1, r1, r0 \n"); |
| 250 | | - __asm__ volatile(" cmp r1, #0xff \n"); |
| 251 | | - __asm__ volatile(" mvnhi r1, r1,asr#31 \n"); |
| 252 | | - __asm__ volatile(" andhi r1, r1, #0xff \n"); |
| 253 | | - __asm__ volatile(" mov r0, r1,lsr#2 \n"); |
| 254 | | - __asm__ volatile(" mov r2, r0,lsl#18 \n"); |
| 255 | | - __asm__ volatile(" sub r1, r1, r0,lsl#2 \n"); |
| 256 | | - __asm__ volatile(" sub r1, r1, r0,lsr#4 \n"); |
| 257 | | - __asm__ volatile(" mov r4, r4,lsr#1 \n"); |
| 258 | | - __asm__ volatile(" add r4, r4, r1,lsr#2 \n"); |
| 259 | | - __asm__ volatile(" strb r4, [r7], #1 \n"); |
| 260 | | - __asm__ volatile(" mov r4, r1,asr#1 \n"); |
| 261 | | - __asm__ volatile(" ldrb r1, [r3], #1 \n"); |
| 262 | | - __asm__ volatile(" ldrsb r0, [r7] \n"); |
| 263 | | - __asm__ volatile(" add r1, r1, r5 \n"); |
| 264 | | - __asm__ volatile(" add r1, r1, r0 \n"); |
| 265 | | - __asm__ volatile(" cmp r1, #0xff \n"); |
| 266 | | - __asm__ volatile(" mvnhi r1, r1,asr#31 \n"); |
| 267 | | - __asm__ volatile(" andhi r1, r1, #0xff \n"); |
| 268 | | - __asm__ volatile(" mov r0, r1,lsr#2 \n"); |
| 269 | | - __asm__ volatile(" orr r2, r2, r0,lsl#10 \n"); |
| 270 | | - __asm__ volatile(" sub r1, r1, r0,lsl#2 \n"); |
| 271 | | - __asm__ volatile(" sub r1, r1, r0,lsr#4 \n"); |
| 272 | | - __asm__ volatile(" mov r5, r5,lsr#1 \n"); |
| 273 | | - __asm__ volatile(" add r5, r5, r1,lsr#2 \n"); |
| 274 | | - __asm__ volatile(" strb r5, [r7], #1 \n"); |
| 275 | | - __asm__ volatile(" mov r5, r1,asr#1 \n"); |
| 276 | | - __asm__ volatile(" ldrb r1, [r3], #1 \n"); |
| 277 | | - __asm__ volatile(" ldrsb r0, [r7] \n"); |
| 278 | | - __asm__ volatile(" add r1, r1, r6 \n"); |
| 279 | | - __asm__ volatile(" add r1, r1, r0 \n"); |
| 280 | | - __asm__ volatile(" cmp r1, #0xff \n"); |
| 281 | | - __asm__ volatile(" mvnhi r1, r1,asr#31 \n"); |
| 282 | | - __asm__ volatile(" andhi r1, r1, #0xff \n"); |
| 283 | | - __asm__ volatile(" mov r0, r1,lsr#2 \n"); |
| 284 | | - __asm__ volatile(" orr r2, r2, r0,lsl#2 \n"); |
| 285 | | - __asm__ volatile(" sub r1, r1, r0,lsl#2 \n"); |
| 286 | | - __asm__ volatile(" sub r1, r1, r0,lsr#4 \n"); |
| 287 | | - __asm__ volatile(" mov r6, r6,lsr#1 \n"); |
| 288 | | - __asm__ volatile(" add r6, r6, r1,lsr#2 \n"); |
| 289 | | - __asm__ volatile(" strb r6, [r7], #1 \n"); |
| 290 | | - __asm__ volatile("displaylcd_dither_wait2: \n"); |
| 291 | | - __asm__ volatile(" ldr r0, [r9,#-0x24] \n"); |
| 292 | | - __asm__ volatile(" mov r6, r1,asr#1 \n"); |
| 293 | | - __asm__ volatile(" tst r0, #0x10 \n"); |
| 294 | | - __asm__ volatile(" bne displaylcd_dither_wait2 \n"); |
| 295 | | - __asm__ volatile(" str r2, [r9] \n"); |
| 296 | | - __asm__ volatile(" sub r3, r3, r10 \n"); |
| 297 | | - __asm__ volatile(" subs lr, lr, #1 \n"); |
| | 245 | + __asm__ volatile("displaylcd_dither_x: \n"); // the lcd can accept one pixel every 25 clocks |
| | 246 | + __asm__ volatile(" ldr r0, [r3] \n"); // 1 cycle, 2 mem, r0 latency 4, r3 early
|
| | 247 | + __asm__ volatile(" add r3, r3, r10 \n"); // 1 cycle |
| | 248 | + __asm__ volatile(" ldr r1, [r7,#4] \n"); // 1 cycle, 1 mem, r1 latency 3, r7 early
|
| | 249 | + __asm__ volatile(" subs lr, lr, #1 \n"); // 1 cycle |
| | 250 | + __asm__ volatile(" ssub8 r0, r0, r4 \n"); // 1 cycle
|
| | 251 | + __asm__ volatile(" sadd8 r1, r1, r5 \n"); // 1 cycle
|
| | 252 | + __asm__ volatile(" qadd8 r0, r0, r1 \n"); // 1 cycle, r0 latency 2
|
| | 253 | + // bubble (due to r0 latency)
|
| | 254 | + __asm__ volatile(" sadd8 r0, r0, r4 \n"); // 1 cycle
|
| | 255 | + __asm__ volatile(" str r0, [r9] \n"); // 1 cycle, 1 mem, r9 early
|
| | 256 | + __asm__ volatile(" bic r2, r0, r6 \n"); // 1 cycle
|
| | 257 | + __asm__ volatile(" and r1, r6, r0,lsr#6 \n"); // 1 cycle, r0 early
|
| | 258 | + __asm__ volatile(" orr r2, r2, r1 \n"); // 1 cycle
|
| | 259 | + __asm__ volatile(" mov r1, r5 \n"); // 1 cycle
|
| | 260 | + __asm__ volatile(" shsub8 r5, r0, r2 \n"); // 1 cycle
|
| | 261 | + __asm__ volatile(" shadd8 r1, r1, r5 \n"); // 1 cycle
|
| | 262 | + __asm__ volatile(" str r1, [r7], #4 \n"); // 1 cycle, 1 mem, r7 early |
| | 263 | + __asm__ volatile(" nop \n"); // 2 cycles
|
| | 264 | + __asm__ volatile(" nop \n"); // 2 cycles
|
| | 265 | + __asm__ volatile(" nop \n"); // 2 cycles
|
| | 266 | + __asm__ volatile(" nop \n"); // 2 cycles
|
| 298 | 267 | __asm__ volatile(" bne displaylcd_dither_x \n"); |
| 299 | 268 | __asm__ volatile(" add r3, r3, r11 \n"); |
| 300 | 269 | __asm__ volatile(" subs r12, r12, #1 \n"); |
| Index: emcore/trunk/target/ipodnano4g/crt0.S |
| — | — | @@ -85,6 +85,7 @@ |
| 86 | 86 | bne .mmuloop5
|
| 87 | 87 | mrc p15, 0, r0,c1,c0
|
| 88 | 88 | orr r0, r0, #5
|
| | 89 | + orr r0, r0, #0x400000
|
| 89 | 90 | mcr p15, 0, r0,c1,c0
|
| 90 | 91 | ldr r0, =_sramsource
|
| 91 | 92 | ldr r1, =_sramstart
|
| Index: emcore/trunk/target/ipodnano4g/s5l8720.h |
| — | — | @@ -530,6 +530,7 @@ |
| 531 | 531 | /////LCD/////
|
| 532 | 532 | #define LCDCON (*((uint32_t volatile*)(0x38300000)))
|
| 533 | 533 | #define LCDWCMD (*((uint32_t volatile*)(0x38300004)))
|
| | 534 | +#define LCDPHTIME (*((uint32_t volatile*)(0x38300010)))
|
| 534 | 535 | #define LCDSTATUS (*((uint32_t volatile*)(0x3830001c)))
|
| 535 | 536 | #define LCDWDATA (*((uint32_t volatile*)(0x38300040)))
|
| 536 | 537 |
|