summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/as3525/sansa-fuzev2/lcd-fuzev2.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/firmware/target/arm/as3525/sansa-fuzev2/lcd-fuzev2.c b/firmware/target/arm/as3525/sansa-fuzev2/lcd-fuzev2.c
index 53d8f73904..06a1b7f4dd 100644
--- a/firmware/target/arm/as3525/sansa-fuzev2/lcd-fuzev2.c
+++ b/firmware/target/arm/as3525/sansa-fuzev2/lcd-fuzev2.c
@@ -143,10 +143,23 @@ static void dbop_write_data(const int16_t* p_bytes, int count)
* switch to 32bit output if needed */
dbop_set_mode(32);
data = (int32_t*)p_bytes;
+
+ const unsigned int mask = 0xff00ff;
while (count > 1)
{
- int pixels = *data++;
- pixels = (swap16(pixels >> 16) << 16) | (swap16(pixels & 0xffff));
+ register unsigned int pixels = *data++;
+ register unsigned int tmp;
+
+ /* pixels == ABCD */
+ asm(
+ "and %[tmp], %[pixels], %[mask] \n" /* tmp = 0B0D */
+ "and %[pixels], %[pixels], %[mask], lsl #8\n" /* %[pixels] = A0C0 */
+ "mov %[pixels], %[pixels], lsr #8 \n" /* %[pixels] = 0A0C */
+ "orr %[pixels], %[pixels], %[tmp], lsl #8 \n" /* %[pixels] = BADC */
+ : [pixels]"+r"(pixels), [tmp]"=r"(tmp) /* output */
+ : [mask]"r"(mask) /* input */
+ );
+
DBOP_DOUT32 = pixels;
count -= 2;