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));
}