1 /**************************************************************************/
4 @author K. Townsend (microBuilder.eu)
8 Software License Agreement (BSD License)
10 Copyright (c) 2011, microBuilder SARL
13 Redistribution and use in source and binary forms, with or without
14 modification, are permitted provided that the following conditions are met:
15 1. Redistributions of source code must retain the above copyright
16 notice, this list of conditions and the following disclaimer.
17 2. Redistributions in binary form must reproduce the above copyright
18 notice, this list of conditions and the following disclaimer in the
19 documentation and/or other materials provided with the distribution.
20 3. Neither the name of the copyright holders nor the
21 names of its contributors may be used to endorse or promote products
22 derived from this software without specific prior written permission.
24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
25 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
28 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 /**************************************************************************/
40 #include "projectconfig.h"
43 #include "core/adc/adc.h"
44 #include "core/cpu/cpu.h"
45 #include "core/pmu/pmu.h"
46 #include "core/gpio/gpio.h"
47 #include "core/systick/systick.h"
48 #include "core/usbhid-rom/usbmsc.h"
51 #include "core/cmd/cmd.h"
54 #include "ui/display.h"
55 #include "ui/sprite.h"
57 #include "r0ketports.h"
58 #include "drivers/fatfs/ff.h"
70 uint8_t getInputRaw(void) {
71 uint8_t result
= BTN_NONE
;
73 if (gpioGetValue(RB_BTN3
)==0) {
74 result
|= BADGE_BTN_UP
;
77 if (gpioGetValue(RB_BTN2
)==0) {
78 result
|= BADGE_BTN_DOWN
;
81 if (gpioGetValue(RB_BTN4
)==0) {
82 result
|= BADGE_BTN_MID
;
85 if (gpioGetValue(RB_BTN0
)==0) {
86 result
|= BADGE_BTN_LEFT
;
89 if (gpioGetValue(RB_BTN1
)==0) {
90 result
|= BADGE_BTN_RIGHT
;
93 if(gpioGetValue(RB_HB3
) == 0) {
94 result
|= BADGE_BTN_A
;
97 if(gpioGetValue(RB_HB4
) == 0 || gpioGetValue(RB_HB5
) == 0) {
98 result
|= BADGE_BTN_B
;
104 void backlightInit(void) {
105 /* Enable the clock for CT16B1 */
106 SCB_SYSAHBCLKCTRL
|= (SCB_SYSAHBCLKCTRL_CT16B1
);
108 /* Configure PIO1.9 as Timer1_16 MAT0 Output */
109 IOCON_PIO1_9
&= ~IOCON_PIO1_9_FUNC_MASK
;
110 IOCON_PIO1_9
|= IOCON_PIO1_9_FUNC_CT16B1_MAT0
;
112 /* Set default duty cycle (MR1) */
113 TMR_TMR16B1MR0
= 0; //(0xFFFF * (100 - brightness)) / 100;
115 /* External Match Register Settings for PWM */
116 TMR_TMR16B1EMR
= TMR_TMR16B1EMR_EMC0_TOGGLE
| TMR_TMR16B1EMR_EM0
;
119 TMR_TMR16B1TCR
= TMR_TMR16B1TCR_COUNTERENABLE_ENABLED
;
122 TMR_TMR16B1PWMC
= TMR_TMR16B1PWMC_PWM0_ENABLED
;
125 gpioSetDir(RB_PWR_LCDBL
, gpioDirection_Output
);
126 gpioSetValue(RB_PWR_LCDBL
, 0);
132 // TODO FIXME special port disable ? LEDs BTNs ?
135 // TODO FIXME more power init needed ? chrg + volt input ?
136 // enable external vcc
137 gpioSetDir(RB_PWR_GOOD
, gpioDirection_Output
);
138 gpioSetValue (RB_PWR_GOOD
, 0);
140 // Disable USB Connect (we don't want USB by default)
141 gpioSetDir(USB_CONNECT
, gpioDirection_Output
);
142 gpioSetValue(USB_CONNECT
, 1);
144 static uint8_t ports
[] = { RB_BTN0
, RB_BTN1
, RB_BTN2
, RB_BTN3
, RB_BTN4
,
145 RB_LED0
, RB_LED1
, RB_LED2
,
146 RB_HB3
, RB_HB4
, RB_SPI_SS2
,
147 RB_SPI_SS3
, RB_SPI_SS4
, RB_SPI_SS5
,
148 RB_HB0
, RB_HB1
, RB_HB2
,
149 RB_HB3
, RB_HB4
, RB_HB5
};
151 volatile uint32_t * regs
[] = {&RB_BTN0_IO
, &RB_BTN1_IO
, &RB_BTN2_IO
,
152 &RB_BTN3_IO
, &RB_BTN4_IO
};
156 gpioSetDir(ports
[i
], ports
[i
+1], gpioDirection_Input
);
157 gpioSetPullup(regs
[i
/2], gpioPullupMode_PullUp
);
162 gpioSetDir(RB_PWR_CHRG
, gpioDirection_Input
);
163 gpioSetPullup (&RB_PWR_CHRG_IO
, gpioPullupMode_PullUp
);
165 gpioSetDir(RB_LED3
, gpioDirection_Input
);
166 IOCON_PIO1_11
= 0x41;
169 IOCON_JTAG_TDI_PIO0_11
&= ~IOCON_JTAG_TDI_PIO0_11_FUNC_MASK
;
170 IOCON_JTAG_TDI_PIO0_11
|= IOCON_JTAG_TDI_PIO0_11_FUNC_GPIO
;
173 gpioSetDir(ports
[i
],ports
[i
+1], gpioDirection_Output
);
174 gpioSetValue (ports
[i
], ports
[i
+1], 0);
179 IOCON_PIO1_11
= 0x41;
182 // TODO FIXME more init needed ?
183 gpioSetDir(RB_LCD_BL
, gpioDirection_Output
);
184 gpioSetValue (RB_LCD_BL
, 0);
187 RB_PWR_LCDBL_IO
&= ~RB_PWR_LCDBL_IO_FUNC_MASK
;
188 RB_PWR_LCDBL_IO
|= RB_PWR_LCDBL_IO_FUNC_GPIO
;
189 gpioSetDir(RB_PWR_LCDBL
, gpioDirection_Input
);
190 gpioSetPullup(&RB_PWR_LCDBL_IO
, gpioPullupMode_Inactive
);
193 // TODO FIXME init miso/mosi/sck somehow ?
195 while(i
<sizeof(ports
)){
196 gpioSetDir(ports
[i
],ports
[i
+1], gpioDirection_Output
);
197 gpioSetValue (ports
[i
], ports
[i
+1], 1);
206 /**************************************************************************/
208 Main program entry point. After reset, normal code execution will
211 /**************************************************************************/
214 // Configure cpu and mandatory peripherals
218 systickInit(CFG_SYSTICK_DELAY_IN_MS
);
224 badge_display_init();
226 gpioSetDir(0, 11, gpioDirection_Output
);
230 RB_HB3_IO
&= ~IOCON_PIO0_2_FUNC_MASK
;
231 RB_HB3_IO
|= IOCON_PIO0_2_FUNC_GPIO
;
232 gpioSetDir(RB_HB3
, gpioDirection_Input
);
233 gpioSetPullup(&RB_HB3_IO
, gpioPullupMode_PullUp
);
235 RB_HB4_IO
&= ~IOCON_PIO1_4_FUNC_MASK
;
236 RB_HB4_IO
|= IOCON_PIO1_4_FUNC_GPIO
;
237 gpioSetDir(RB_HB4
, gpioDirection_Input
);
238 gpioSetPullup(&RB_HB4_IO
, gpioPullupMode_PullUp
);
241 badge_framebuffer fb
= {
244 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
245 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
246 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
247 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
248 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
250 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
251 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
252 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
253 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
254 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
256 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
257 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
258 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
259 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
260 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
262 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
263 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
264 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
265 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
266 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
268 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
269 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
270 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
271 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
272 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
274 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
275 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
276 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
277 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
278 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
280 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
281 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
282 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
283 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
284 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
286 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
287 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
288 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
289 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
290 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
292 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
293 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
294 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
295 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
296 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
301 // badge_framebuffer_flush(&fb);
306 if(FR_OK
== f_mount(0, &fatvol
)) {
308 if(FR_OK
== (res
= f_open(&fil
, "sshot.dat", FA_OPEN_EXISTING
| FA_READ
))) {
311 if(FR_OK
!= f_read(&fil
, &fb
, sizeof(fb
), &readbytes
)) {
312 gpioSetDir(RB_LED3
, gpioDirection_Output
);
313 gpioSetValue(RB_LED3
, 1);
319 gpioSetDir(RB_LED1
, gpioDirection_Output
);
320 gpioSetValue(RB_LED1
, 1);
323 gpioSetDir(RB_LED2
, gpioDirection_Output
);
324 gpioSetValue(RB_LED2
, 1);
327 badge_framebuffer_flush(&fb
);
329 for(uint8_t i
= 0; ; ++i
) {
330 gpioSetValue(0, 11, i
& 1);
332 uint8_t buttons
= getInputRaw();
333 memset(&fb
, 0, sizeof(fb
));
335 badge_sprite
const sp
= { 4, 4, (uint8_t const *) "\xff\xff" };
337 if(buttons
& BADGE_BTN_UP
) { badge_framebuffer_blt(&fb
, 30, 10, &sp
, 0); }
338 if(buttons
& BADGE_BTN_DOWN
) { badge_framebuffer_blt(&fb
, 30, 50, &sp
, 0); }
339 if(buttons
& BADGE_BTN_LEFT
) { badge_framebuffer_blt(&fb
, 10, 30, &sp
, 0); }
340 if(buttons
& BADGE_BTN_RIGHT
) { badge_framebuffer_blt(&fb
, 50, 30, &sp
, 0); }
341 if(buttons
& BADGE_BTN_MID
) { badge_framebuffer_blt(&fb
, 30, 30, &sp
, 0); }
342 if(buttons
& BADGE_BTN_A
) { badge_framebuffer_blt(&fb
, 70, 10, &sp
, 0); }
343 if(buttons
& BADGE_BTN_B
) { badge_framebuffer_blt(&fb
, 70, 50, &sp
, 0); }
345 badge_framebuffer_flush(&fb
);