1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void lcd_send_data(const fb_data *data, int width)
{
asm volatile(
    "mov     r3, #0x70000000    @ LCD1_BASE         \n"
    "add     r2, r3, #0x3000    @ LCD1_CONTROL      \n"

 "1: ldr     r3, [r2]                               \n"
    "tst     r3, #0x8000        @ LCD1_BUSY_MASK    \n"
    "bne     1b                                     \n"

    "ldrh    r3, [%0]           @ load pixel        \n"

    "mov     r3, r3, lsr #8                         \n"
    "str     r3, [r2, #0x10]    @ LCD1_DATA         \n"

 "2: ldr     r3, [r2]                               \n"
    "tst     r3, #0x8000        @ LCD1_BUSY_MASK    \n"
    "bne     2b                                     \n"

    "ldrb    r3, [%0], #2       @ load pixel, inc   \n"
    "str     r3, [r2, #0x10]    @ LCD1_DATA         \n"
    "subs    %1, %1, #1                             \n"
    "bne     1b                                     \n"
    : : "r"(data), "r"(width));
}