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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
diff --git a/firmware/target/arm/as3525/button-e200v2-fuze.c b/firmware/target/arm/as3525/button-e200v2-fuze.c
index 6a9f029..9554c61 100644
--- a/firmware/target/arm/as3525/button-e200v2-fuze.c
+++ b/firmware/target/arm/as3525/button-e200v2-fuze.c
@@ -246,6 +246,8 @@ static int button_gpio(void)
     int btn = BUTTON_NONE;
     if(hold_button)
         return btn;
+    DBOP_CTRL &= ~(1<<16);               /* disable output (1:write enabled) */
+    button_delay();
     /* set afsel, so that we can read our buttons */
     GPIOC_AFSEL &= ~(1<<2|1<<3|1<<4|1<<5|1<<6);
     /* set dir so we can read our buttons (but reset the C pins first) */
@@ -277,6 +279,7 @@ static int button_gpio(void)
     GPIOC_DIR |= (1<<2|1<<3|1<<4|1<<5|1<<6);
     GPIOC_AFSEL |= (1<<2|1<<3|1<<4|1<<5|1<<6);

+    DBOP_CTRL |= (1<<16);               /* disable output (1:write enabled) */
     return btn;
 }

diff --git a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
index 7f02a8b..f712fb6 100644
--- a/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
+++ b/firmware/target/arm/as3525/sansa-e200v2/lcd-e200v2.c
@@ -155,10 +155,11 @@ void lcd_write_data(const fb_data* p_bytes, int count)
     while (count--)
     {
         DBOP_DOUT = *p_bytes++;
-
-        /* Wait for fifo to empty */
-        while ((DBOP_STAT & (1<<10)) == 0);
+        /* Wait if push fifo is full */
+        while ((DBOP_STAT & (1<<6)) != 0);
     }
+    /* While push fifo is not empty */
+    while ((DBOP_STAT & (1<<10)) == 0);
 }

 static void lcd_write_reg(int reg, int value)
diff --git a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
index fc0fdaa..833cdf8 100644
--- a/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
+++ b/firmware/target/arm/as3525/sansa-fuze/lcd-fuze.c
@@ -120,8 +120,11 @@ void lcd_write_data(const fb_data* p_bytes, int count)
         /* TODO: We should normally fill the fifo until it's full
          * instead of waiting after each word,
          * but that causes blue lines on the display */
-        while ((DBOP_STAT & (1<<10)) == 0);
-    }
+        /* Wait if push fifo is full */
+            while ((DBOP_STAT & (1<<6)) != 0);
+        }
+        /* While push fifo is not empty */
+    while ((DBOP_STAT & (1<<10)) == 0);
     /* due to the 32bit alignment requirement, we possibly need to do a
      * 16bit transfer at the end also */
     if (count > 0)