Treiber für at25df041a (rev. 0.0.0-erster-anlauf-voellig-ungetestet)
[hackover2013-badge-firmware.git] / badge / main.c
1 /**************************************************************************/
2 /*!
3 @file main.c
4 @author K. Townsend (microBuilder.eu)
5
6 @section LICENSE
7
8 Software License Agreement (BSD License)
9
10 Copyright (c) 2011, microBuilder SARL
11 All rights reserved.
12
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.
23
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.
34 */
35 /**************************************************************************/
36 #include <stdlib.h>
37 #include <stdio.h>
38 #include <string.h>
39
40 #include "projectconfig.h"
41 #include "sysinit.h"
42
43 #include "core/adc/adc.h"
44 #include "core/cpu/cpu.h"
45 #include "core/pmu/pmu.h"
46 #include "core/wdt/wdt.h"
47 #include "core/gpio/gpio.h"
48 #include "core/ssp/ssp.h"
49 #include "core/systick/systick.h"
50 #include "core/usbhid-rom/usbmsc.h"
51
52 #ifdef CFG_INTERFACE
53 #include "core/cmd/cmd.h"
54 #endif
55
56 #include "ui/display.h"
57 #include "ui/sprite.h"
58 #include "ui/event.h"
59 #include "jumpnrun/jumpnrun.h"
60
61 #include "r0ketports.h"
62 #include "drivers/fatfs/ff.h"
63
64 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof*(arr))
65
66 void backlightInit(void) {
67 #if HW_IS_PROTOTYPE
68
69
70 // prototype uses WDT CLKOUT to drive the LCD backlight
71 // init without a reset
72
73 IOCON_PIO0_1 &= ~(IOCON_PIO0_1_FUNC_MASK);
74 IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CLKOUT;
75
76 wdtInit(false);
77
78 // use the WDT clock as the default WDT frequency is best frequency
79 // XXX this register value is missing in lpc1343.h
80 #define SCB_CLKOUTCLKSEL_SOURCE_WDTCLOCK ((unsigned int) 0x00000002) // Use the WDT clock
81
82 SCB_CLKOUTCLKSEL = SCB_CLKOUTCLKSEL_SOURCE_WDTCLOCK;
83
84 // toggle from LOW to HIGH to update source
85 SCB_CLKOUTCLKUEN = SCB_CLKOUTCLKUEN_DISABLE;
86 SCB_CLKOUTCLKUEN = SCB_CLKOUTCLKUEN_UPDATE;
87
88 // divide by 30, to get almost 10 kHz
89 SCB_CLKOUTCLKDIV = 30;
90
91
92 #else
93
94
95 /* Enable the clock for CT16B1 */
96 SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT16B1);
97
98 /* Configure PIO1.9 as Timer1_16 MAT0 Output */
99 IOCON_PIO1_9 &= ~IOCON_PIO1_9_FUNC_MASK;
100 IOCON_PIO1_9 |= IOCON_PIO1_9_FUNC_CT16B1_MAT0;
101
102 /* Set default duty cycle (MR1) */
103 TMR_TMR16B1MR0 = 0; //(0xFFFF * (100 - brightness)) / 100;
104
105 /* External Match Register Settings for PWM */
106 TMR_TMR16B1EMR = TMR_TMR16B1EMR_EMC0_TOGGLE | TMR_TMR16B1EMR_EM0;
107
108 /* enable Timer1 */
109 TMR_TMR16B1TCR = TMR_TMR16B1TCR_COUNTERENABLE_ENABLED;
110
111 /* Enable PWM0 */
112 TMR_TMR16B1PWMC = TMR_TMR16B1PWMC_PWM0_ENABLED;
113
114 // Enable Step-UP
115 gpioSetDir(RB_PWR_LCDBL, gpioDirection_Output);
116 gpioSetValue(RB_PWR_LCDBL, 0);
117
118
119 #endif
120 }
121
122 void rbInit() {
123 #if !HW_IS_PROTOTYPE
124 RB_HB0_IO &= ~IOCON_SWDIO_PIO1_3_FUNC_MASK;
125 RB_HB0_IO |= IOCON_SWDIO_PIO1_3_FUNC_GPIO;
126 RB_HB1_IO &= ~IOCON_JTAG_TCK_PIO0_10_FUNC_MASK;
127 RB_HB1_IO |= IOCON_JTAG_TCK_PIO0_10_FUNC_GPIO;
128 #endif
129
130 struct {
131 int port;
132 int pin;
133 uint32_t volatile *reg;
134 gpioPullupMode_t mode;
135 } const input_pins[] = {
136 #if HW_IS_PROTOTYPE
137 { RB_BTN0 , &RB_BTN0_IO , gpioPullupMode_PullDown },
138 { RB_BTN1 , &RB_BTN1_IO , gpioPullupMode_PullDown },
139 { RB_BTN2 , &RB_BTN2_IO , gpioPullupMode_PullDown },
140 { RB_BTN3 , &RB_BTN3_IO , gpioPullupMode_PullDown },
141 { RB_BTN4 , &RB_BTN4_IO , gpioPullupMode_PullDown },
142 { RB_BTN_A , &RB_BTN_A_IO , gpioPullupMode_PullDown },
143 { RB_BTN_B , &RB_BTN_B_IO , gpioPullupMode_PullDown },
144 #else
145 { RB_BTN0 , &RB_BTN0_IO , gpioPullupMode_PullUp },
146 { RB_BTN1 , &RB_BTN1_IO , gpioPullupMode_PullUp },
147 { RB_BTN2 , &RB_BTN2_IO , gpioPullupMode_PullUp },
148 { RB_BTN3 , &RB_BTN3_IO , gpioPullupMode_PullUp },
149 { RB_BTN4 , &RB_BTN4_IO , gpioPullupMode_PullUp },
150 { RB_HB0 , &RB_HB0_IO , gpioPullupMode_PullUp },
151 { RB_HB1 , &RB_HB1_IO , gpioPullupMode_PullUp },
152 { RB_PWR_CHRG, &RB_PWR_CHRG_IO, gpioPullupMode_PullUp }
153 #endif
154 };
155
156 for(int i = 0; i < ARRAY_SIZE(input_pins); ++i) {
157 gpioSetDir(input_pins[i].port, input_pins[i].pin, gpioDirection_Input);
158 gpioSetPullup(input_pins[i].reg, input_pins[i].mode);
159 }
160
161 #if HW_IS_PROTOTYPE
162 IOCON_JTAG_TMS_PIO1_0 &= ~(IOCON_JTAG_TMS_PIO1_0_FUNC_MASK);
163 IOCON_JTAG_TMS_PIO1_0 |= IOCON_JTAG_TMS_PIO1_0_FUNC_GPIO;
164 #else
165 // LED3 zur Bestimmung der Umgebungshelligkeit.
166 gpioSetDir(RB_LED3, gpioDirection_Input);
167 RB_LED3_IO = (RB_LED3_IO & IOCON_PIO1_11_FUNC_MASK) | IOCON_PIO1_11_FUNC_AD7;
168
169 // prepare LEDs
170 IOCON_JTAG_TDI_PIO0_11 &= ~IOCON_JTAG_TDI_PIO0_11_FUNC_MASK;
171 IOCON_JTAG_TDI_PIO0_11 |= IOCON_JTAG_TDI_PIO0_11_FUNC_GPIO;
172 #endif
173
174 struct {
175 int port;
176 int pin;
177 int value;
178 } const output_pins[] = {
179 { RB_PWR_GOOD , 0 },
180 { USB_CONNECT , 1 },
181 { RB_LCD_CS , 1 },
182 { RB_SPI_CS_DF, 1 },
183 #if !HW_IS_PROTOTYPE
184 { RB_SPI_SS2 , 1 },
185 { RB_SPI_SS3 , 1 },
186 { RB_SPI_SS4 , 1 },
187 { RB_SPI_SS5 , 1 },
188 { RB_LED0 , 0 },
189 { RB_LED1 , 0 },
190 { RB_LED2 , 0 },
191 { RB_LCD_BL , 0 },
192 { RB_HB2 , 1 },
193 { RB_HB3 , 1 },
194 { RB_HB4 , 1 },
195 { RB_HB5 , 1 }
196 #endif
197 };
198
199 for(int i = 0; i < ARRAY_SIZE(output_pins); ++i) {
200 gpioSetDir (output_pins[i].port, output_pins[i].pin, gpioDirection_Output);
201 gpioSetValue(output_pins[i].port, output_pins[i].pin, output_pins[i].value);
202 }
203
204 #if !HW_IS_PROTOTYPE
205 // Set P0.0 to GPIO
206 RB_PWR_LCDBL_IO &= ~RB_PWR_LCDBL_IO_FUNC_MASK;
207 RB_PWR_LCDBL_IO |= RB_PWR_LCDBL_IO_FUNC_GPIO;
208
209 gpioSetDir ( RB_PWR_LCDBL , gpioDirection_Input);
210 gpioSetPullup(&RB_PWR_LCDBL_IO, gpioPullupMode_Inactive);
211 #endif
212
213 backlightInit();
214 }
215
216
217 /**************************************************************************/
218 /*!
219 Main program entry point. After reset, normal code execution will
220 begin here.
221 */
222 /**************************************************************************/
223 int main(void)
224 {
225 // Configure cpu and mandatory peripherals
226 //systemInit();
227
228 cpuInit();
229 systickInit(CFG_SYSTICK_DELAY_IN_MS);
230
231 // pmuInit();
232 // adcInit();
233 rbInit();
234
235 // usbMSCInit();
236
237 badge_display_init();
238
239 /*
240 gpioSetDir(0, 11, gpioDirection_Output);
241 gpioSetValue(0, 11, 0);
242
243
244 {
245 badge_framebuffer fb;
246 int res = 0;
247 FATFS fatvol;
248
249 if(FR_OK == f_mount(0, &fatvol)) {
250 FIL fil;
251 if(FR_OK == (res = f_open(&fil, "sshot.dat", FA_OPEN_EXISTING | FA_READ))) {
252 UINT readbytes;
253
254 if(FR_OK != f_read(&fil, &fb, sizeof(fb), &readbytes)) {
255 gpioSetDir(RB_LED3, gpioDirection_Output);
256 gpioSetValue(RB_LED3, 1);
257 }
258
259 f_close(&fil);
260 } else {
261 fb.data[0][0] = res;
262 gpioSetDir(RB_LED1, gpioDirection_Output);
263 gpioSetValue(RB_LED1, 1);
264 }
265 } else {
266 gpioSetDir(RB_LED2, gpioDirection_Output);
267 gpioSetValue(RB_LED2, 1);
268 }
269
270 badge_framebuffer_flush(&fb);
271 }
272 */
273
274 badge_event_start();
275 /*
276 for(;;) {
277 if(JUMPNRUN_ERROR == jumpnrun_play("smb.lvl")) {
278 break;
279 }
280 }
281 */
282
283 uint8_t buttons = 0;
284
285 for(uint8_t i = 0; ; ++i) {
286 badge_event_t event = badge_event_wait();
287
288 // SCB_CLKOUTCLKDIV = i;
289
290 switch(badge_event_type(event)) {
291 case BADGE_EVENT_USER_INPUT: {
292 buttons = badge_event_current_input_state();
293 break;
294 }
295 case BADGE_EVENT_GAME_TICK: {
296 badge_sprite const sp = { 4, 4, (uint8_t const *) "\xff\xff" };
297 badge_framebuffer fb = { { { 0x80 } } };
298
299 SSP_SSP0CR0 =
300 SSP_SSP0CR0_DSS_8BIT // Data size = 8-bit
301 | SSP_SSP0CR0_FRF_SPI // Frame format = SPI
302 | SSP_SSP0CR0_SCR_8;
303
304 gpioSetValue(RB_SPI_CS_DF, 0);
305
306 uint8_t st;
307 sspSend(0, "\x05", 1);
308 sspReceive(0, &st, 1);
309
310 gpioSetValue(RB_SPI_CS_DF, 1);
311
312 fb.data[0][1] = st;
313 /*
314 for(int i = 0; i < 9 * 96; ++i) {
315 fb.data[0][i] = 0xbb;
316 }
317 */
318
319 if(buttons & BADGE_EVENT_KEY_UP) { badge_framebuffer_blt(&fb, 30, 10, &sp, 0); }
320 if(buttons & BADGE_EVENT_KEY_DOWN) { badge_framebuffer_blt(&fb, 30, 50, &sp, 0); }
321 if(buttons & BADGE_EVENT_KEY_LEFT) { badge_framebuffer_blt(&fb, 10, 30, &sp, 0); }
322 if(buttons & BADGE_EVENT_KEY_RIGHT) { badge_framebuffer_blt(&fb, 50, 30, &sp, 0); }
323 if(buttons & BADGE_EVENT_KEY_CENTER){ badge_framebuffer_blt(&fb, 30, 30, &sp, 0); }
324 if(buttons & BADGE_EVENT_KEY_BTN_A) { badge_framebuffer_blt(&fb, 70, 10, &sp, 0); }
325 if(buttons & BADGE_EVENT_KEY_BTN_B) { badge_framebuffer_blt(&fb, 70, 50, &sp, 0); }
326
327 badge_framebuffer_flush(&fb);
328 break;
329 }
330 }
331 }
332
333 return 0;
334 }
This page took 0.072219 seconds and 5 git commands to generate.