diff options
Diffstat (limited to 'rbutil/mkamsboot/dualboot/dualboot.S')
-rw-r--r-- | rbutil/mkamsboot/dualboot/dualboot.S | 77 |
1 files changed, 73 insertions, 4 deletions
diff --git a/rbutil/mkamsboot/dualboot/dualboot.S b/rbutil/mkamsboot/dualboot/dualboot.S index d1a9721f9f..8bb2059d78 100644 --- a/rbutil/mkamsboot/dualboot/dualboot.S +++ b/rbutil/mkamsboot/dualboot/dualboot.S | |||
@@ -27,7 +27,26 @@ | |||
27 | .set GPIOC, 0xC80D0000 | 27 | .set GPIOC, 0xC80D0000 |
28 | .set GPIOD, 0xC80E0000 | 28 | .set GPIOD, 0xC80E0000 |
29 | .set CGU_PERI, 0xC80F0014 | 29 | .set CGU_PERI, 0xC80F0014 |
30 | 30 | .set I2C_BASE, 0xC8070000 | |
31 | .set I2C_DATA, 0x00 | ||
32 | .set I2C_SLAD0, 0x04 | ||
33 | .set I2C_CNTRL, 0x0c | ||
34 | .set I2C_DACNT, 0x10 | ||
35 | .set I2C_CPSR0, 0x1c | ||
36 | .set I2C_CPSR1, 0x20 | ||
37 | .set I2C_IMR, 0x24 | ||
38 | .set I2C_SR, 0x30 | ||
39 | .set I2C_SADDR, 0x44 | ||
40 | .set AS3514_I2C_ADDR, 0x46 | ||
41 | .set AS3514_IRQ_ENRD0, 0x25 | ||
42 | .set PCLK, 24000000 | ||
43 | .set I2C_CLK, 400000 | ||
44 | .set I2C_PRESCALER, ((PCLK + I2C_CLK -1) / I2C_CLK) | ||
45 | .set I2C_PRESCALER_LOW, (I2C_PRESCALER & 0xff) | ||
46 | .set I2C_PRESCALER_HIGH, (I2C_PRESCALER >> 8) | ||
47 | #if I2C_PRESCALER_HIGH > 3 | ||
48 | #error i2c prescaler too big! | ||
49 | #endif | ||
31 | 50 | ||
32 | /* Vectors */ | 51 | /* Vectors */ |
33 | 52 | ||
@@ -80,9 +99,7 @@ uclcopy: | |||
80 | 99 | ||
81 | 100 | ||
82 | /* TODO : M200V4 ? */ | 101 | /* TODO : M200V4 ? */ |
83 | #if defined(SANSA_C200V2) | 102 | #if defined(SANSA_CLIP) || defined(SANSA_CLIPV2) |
84 | #define USB_PIN 1 /* FIXME: not correct on some c200v2s */ | ||
85 | #elif defined(SANSA_CLIP) || defined(SANSA_CLIPV2) | ||
86 | #define USB_PIN 6 | 103 | #define USB_PIN 6 |
87 | #elif defined(SANSA_FUZE) || defined(SANSA_E200V2) || defined(SANSA_FUZEV2) | 104 | #elif defined(SANSA_FUZE) || defined(SANSA_E200V2) || defined(SANSA_FUZEV2) |
88 | #define USB_PIN 3 | 105 | #define USB_PIN 3 |
@@ -96,6 +113,58 @@ uclcopy: | |||
96 | cmp r1, #0 | 113 | cmp r1, #0 |
97 | bne boot_of | 114 | bne boot_of |
98 | #endif | 115 | #endif |
116 | #if defined(SANSA_C200V2) | ||
117 | /* Instead of checking the GPIO, check the audio master IRQ_ENRD0 | ||
118 | * USB_STATUS bit on C200V2 */ | ||
119 | |||
120 | ldr r0, =CGU_PERI | ||
121 | ldr r1, [r0] | ||
122 | /* enable i2c audio master clock */ | ||
123 | orr r1, r1, #(1<<17) | ||
124 | /* make sure 24MHz clk_main is selected */ | ||
125 | bic r1, r1, #0x7f | ||
126 | str r1, [r0] | ||
127 | |||
128 | ldr r0, =I2C_BASE | ||
129 | /* disable i2c interrupts */ | ||
130 | mov r1, #0 | ||
131 | str r1, [r0, #I2C_IMR] | ||
132 | /* setup prescaler */ | ||
133 | mov r1, #I2C_PRESCALER_LOW | ||
134 | str r1, [r0, #I2C_CPSR0] | ||
135 | mov r1, #I2C_PRESCALER_HIGH | ||
136 | str r1, [r0, #I2C_CPSR1] | ||
137 | /* setup i2c slave address */ | ||
138 | mov r1, #(AS3514_I2C_ADDR << 1) | ||
139 | str r1, [r0, #I2C_SLAD0] | ||
140 | mov r2, #0x51 | ||
141 | str r2, [r0, #I2C_CNTRL] | ||
142 | |||
143 | /* wait for not busy */ | ||
144 | 1: | ||
145 | ldr r1, [r0, #I2C_SR] | ||
146 | tst r1, #1 | ||
147 | bne 1b | ||
148 | |||
149 | /* start read of irq_enrd0 */ | ||
150 | mov r1, #AS3514_IRQ_ENRD0 | ||
151 | str r1, [r0, #I2C_SADDR] | ||
152 | orr r2, r2, #(1 << 1) | ||
153 | str r2, [r0, #I2C_CNTRL] | ||
154 | mov r1, #1 | ||
155 | str r1, [r0, #I2C_DACNT] | ||
156 | |||
157 | /* wait for transfer to finish */ | ||
158 | 1: | ||
159 | ldr r1, [r0, #I2C_DACNT] | ||
160 | cmp r1, #0 | ||
161 | bne 1b | ||
162 | |||
163 | /* load result and test USB_STATUS bit */ | ||
164 | ldr r1, [r0, #I2C_DATA] | ||
165 | tst r1, #(1 << 3) | ||
166 | bne boot_of | ||
167 | #endif | ||
99 | 168 | ||
100 | /* Here are model specific tests, for dual boot without a computer */ | 169 | /* Here are model specific tests, for dual boot without a computer */ |
101 | /* All models use left button */ | 170 | /* All models use left button */ |