summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/dbop-as3525.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/as3525/dbop-as3525.c')
-rw-r--r--firmware/target/arm/as3525/dbop-as3525.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/firmware/target/arm/as3525/dbop-as3525.c b/firmware/target/arm/as3525/dbop-as3525.c
index 1730290d46..5ca551ca70 100644
--- a/firmware/target/arm/as3525/dbop-as3525.c
+++ b/firmware/target/arm/as3525/dbop-as3525.c
@@ -30,6 +30,8 @@
30#define DBOP_PRECHARGE 0xF0FF 30#define DBOP_PRECHARGE 0xF0FF
31#endif 31#endif
32 32
33#if CONFIG_CPU == AS3525
34/* doesn't work with the new ams sansas so far and is not needed */
33static short int dbop_input_value = 0; 35static short int dbop_input_value = 0;
34 36
35/* read the DBOP data pins */ 37/* read the DBOP data pins */
@@ -77,13 +79,24 @@ unsigned short dbop_debug(void)
77 return dbop_input_value; 79 return dbop_input_value;
78} 80}
79 81
82#endif
83
80static inline void dbop_set_mode(int mode) 84static inline void dbop_set_mode(int mode)
81{ 85{
82 int delay = 10; 86 int delay = 10;
83 if (mode == 32 && (!(DBOP_CTRL & (1<<13|1<<14)))) 87 unsigned long ctrl = DBOP_CTRL;
84 DBOP_CTRL |= (1<<13|1<<14); 88 int curr_mode = (DBOP_CTRL >> 13) & 0x3; // bits 14:13
85 else if (mode == 16 && (DBOP_CTRL & (1<<13|1<<14))) 89#ifdef SANSA_FUZEV2
86 DBOP_CTRL &= ~(1<<14|1<<13); 90 if (mode == 32 && curr_mode != 1<<1)
91 DBOP_CTRL = (ctrl & ~(1<<13)) | (1<<14); // 2 serial half words
92 else if (mode == 16 && curr_mode != 1<<0)
93 DBOP_CTRL = (ctrl & ~(1<<14)) | (1<<13); // 2 serial bytes
94#else
95 if (mode == 32 && curr_mode == 0)
96 DBOP_CTRL = ctrl | (1<<13|1<<14); /* 2 serial half words */
97 else if (mode == 16 && curr_mode == (1<<1|1<<0))
98 DBOP_CTRL = ctrl & ~(1<<14|1<<13); /* 1 serial half word */
99#endif
87 else 100 else
88 return; 101 return;
89 while(delay--) asm volatile("nop"); 102 while(delay--) asm volatile("nop");