| Index: emcore/trunk/target/ipodnano4g/lcd.c | 
| — | — | @@ -89,6 +89,10 @@ | 
| 90 | 90 |  | 
| 91 | 91 | void lcd_shutdown() | 
| 92 | 92 | { | 
|  | 93 | +    mutex_lock(&lcd_mutex, TIMEOUT_BLOCK); | 
|  | 94 | +    displaylcd_sync(); | 
|  | 95 | +    while (!(LCDSTATUS & 0x2)); | 
|  | 96 | +    LCDCON = 0x41100db8; | 
| 93 | 97 | } | 
| 94 | 98 |  | 
| 95 | 99 | bool displaylcd_busy() ICODE_ATTR; | 
| — | — | @@ -116,6 +120,8 @@ | 
| 117 | 121 | displaylcd_sync(); | 
| 118 | 122 | } | 
| 119 | 123 | else while (DMAC0C4CONFIG & 1); | 
|  | 124 | +    while (!(LCDSTATUS & 0x2)); | 
|  | 125 | +    LCDCON = 0x41100db8; | 
| 120 | 126 | lcd_send_cmd(0x2a); | 
| 121 | 127 | lcd_send_data(startx); | 
| 122 | 128 | lcd_send_data(endx); | 
| — | — | @@ -140,7 +146,7 @@ | 
| 141 | 147 | lli->nextlli = last ? NULL : &lcd_lli[i + 1]; | 
| 142 | 148 | lli->control = 0x70240000 | (last ? pixels : 0xfff) | 
| 143 | 149 | | (last ? 0x80000000 : 0) | (solid ? 0 : 0x4000000); | 
| 144 |  | -        if (!solid) data = (void*)(((uint32_t)data) + 0x1ffe); | 
|  | 150 | +        if (!solid) data += 0x1ffe; | 
| 145 | 151 | } | 
| 146 | 152 | clean_dcache(); | 
| 147 | 153 | DMAC0C4CONFIG = 0x88c1; | 
| — | — | @@ -157,7 +163,7 @@ | 
| 158 | 164 | } | 
| 159 | 165 |  | 
| 160 | 166 | void displaylcd_safe_native(unsigned int startx, unsigned int endx, | 
| 161 |  | -                       unsigned int starty, unsigned int endy, void* data) | 
|  | 167 | +                            unsigned int starty, unsigned int endy, void* data) | 
| 162 | 168 | { | 
| 163 | 169 | int pixels = (endx - startx + 1) * (endy - starty + 1); | 
| 164 | 170 | if (pixels <= 0) return; | 
| — | — | @@ -223,6 +229,12 @@ | 
| 224 | 230 | __asm__ volatile("    movne r10, #3                \n"); | 
| 225 | 231 | __asm__ volatile("    moveq r10, #0                \n"); | 
| 226 | 232 | __asm__ volatile("    ldr r9, =0x38300040          \n"); | 
|  | 233 | +    __asm__ volatile("displaylcd_dither_wait :         \n"); | 
|  | 234 | +    __asm__ volatile("    ldr r4, [r9,#-0x24]          \n"); | 
|  | 235 | +    __asm__ volatile("    tst r4, #2                   \n"); | 
|  | 236 | +    __asm__ volatile("    beq displaylcd_dither_wait   \n"); | 
|  | 237 | +    __asm__ volatile("    ldr r4, =0x41104eb8          \n"); | 
|  | 238 | +    __asm__ volatile("    str r4, [r9,#-0x40]          \n"); | 
| 227 | 239 | __asm__ volatile("displaylcd_dither_y:             \n"); | 
| 228 | 240 | __asm__ volatile("    ldr lr, [sp]                 \n"); | 
| 229 | 241 | __asm__ volatile("    mov r4, #0                   \n"); | 
| — | — | @@ -230,7 +242,6 @@ | 
| 231 | 243 | __asm__ volatile("    mov r6, #0                   \n"); | 
| 232 | 244 | __asm__ volatile("    mov r7, r8                   \n"); | 
| 233 | 245 | __asm__ volatile("displaylcd_dither_x:             \n"); | 
| 234 |  | -    __asm__ volatile("    mov r2, #0                   \n"); | 
| 235 | 246 | __asm__ volatile("    ldrb r1, [r3], #1            \n"); | 
| 236 | 247 | __asm__ volatile("    ldrsb r0, [r7]               \n"); | 
| 237 | 248 | __asm__ volatile("    add r1, r1, r4               \n"); | 
| — | — | @@ -238,10 +249,10 @@ | 
| 239 | 250 | __asm__ volatile("    cmp r1, #0xff                \n"); | 
| 240 | 251 | __asm__ volatile("    mvnhi r1, r1,asr#31          \n"); | 
| 241 | 252 | __asm__ volatile("    andhi r1, r1, #0xff          \n"); | 
| 242 |  | -    __asm__ volatile("    mov r0, r1,lsr#3             \n"); | 
| 243 |  | -    __asm__ volatile("    orr r2, r0,lsl#11            \n"); | 
| 244 |  | -    __asm__ volatile("    sub r1, r1, r0,lsl#3         \n"); | 
| 245 |  | -    __asm__ volatile("    sub r1, r1, r0,lsr#2         \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"); | 
| 246 | 257 | __asm__ volatile("    mov r4, r4,lsr#1             \n"); | 
| 247 | 258 | __asm__ volatile("    add r4, r4, r1,lsr#2         \n"); | 
| 248 | 259 | __asm__ volatile("    strb r4, [r7], #1            \n"); | 
| — | — | @@ -254,7 +265,7 @@ | 
| 255 | 266 | __asm__ volatile("    mvnhi r1, r1,asr#31          \n"); | 
| 256 | 267 | __asm__ volatile("    andhi r1, r1, #0xff          \n"); | 
| 257 | 268 | __asm__ volatile("    mov r0, r1,lsr#2             \n"); | 
| 258 |  | -    __asm__ volatile("    orr r2, r0,lsl#5             \n"); | 
|  | 269 | +    __asm__ volatile("    orr r2, r2, r0,lsl#10        \n"); | 
| 259 | 270 | __asm__ volatile("    sub r1, r1, r0,lsl#2         \n"); | 
| 260 | 271 | __asm__ volatile("    sub r1, r1, r0,lsr#4         \n"); | 
| 261 | 272 | __asm__ volatile("    mov r5, r5,lsr#1             \n"); | 
| — | — | @@ -268,18 +279,18 @@ | 
| 269 | 280 | __asm__ volatile("    cmp r1, #0xff                \n"); | 
| 270 | 281 | __asm__ volatile("    mvnhi r1, r1,asr#31          \n"); | 
| 271 | 282 | __asm__ volatile("    andhi r1, r1, #0xff          \n"); | 
| 272 |  | -    __asm__ volatile("    mov r0, r1,lsr#3             \n"); | 
| 273 |  | -    __asm__ volatile("    orr r2, r0                   \n"); | 
| 274 |  | -    __asm__ volatile("    sub r1, r1, r0,lsl#3         \n"); | 
| 275 |  | -    __asm__ volatile("    sub r1, r1, r0,lsr#2         \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"); | 
| 276 | 287 | __asm__ volatile("    mov r6, r6,lsr#1             \n"); | 
| 277 | 288 | __asm__ volatile("    add r6, r6, r1,lsr#2         \n"); | 
| 278 | 289 | __asm__ volatile("    strb r6, [r7], #1            \n"); | 
| 279 |  | -    __asm__ volatile("displaylcd_dither_waitlcd:       \n"); | 
|  | 290 | +    __asm__ volatile("displaylcd_dither_wait2:         \n"); | 
| 280 | 291 | __asm__ volatile("    ldr r0, [r9,#-0x24]          \n"); | 
| 281 | 292 | __asm__ volatile("    mov r6, r1,asr#1             \n"); | 
| 282 | 293 | __asm__ volatile("    tst r0, #0x10                \n"); | 
| 283 |  | -    __asm__ volatile("    bne displaylcd_dither_waitlcd\n"); | 
|  | 294 | +    __asm__ volatile("    bne displaylcd_dither_wait2  \n"); | 
| 284 | 295 | __asm__ volatile("    str r2, [r9]                 \n"); | 
| 285 | 296 | __asm__ volatile("    sub r3, r3, r10              \n"); | 
| 286 | 297 | __asm__ volatile("    subs lr, lr, #1              \n"); |