\r
SRCS = \\r
badge/main.c \\r
+ badge/init.c \\r
badge/jumpnrun/collision.c \\r
badge/jumpnrun/enemies.c \\r
badge/jumpnrun/items.c \\r
SRCS += \\r
dataflash/iobase.c \\r
dataflash/diskio.c \\r
- dataflash/at25df041a.c\r
-# dataflash/at45db041d.c\r
+ dataflash/at45db041d.c\r
\r
SRCS += \\r
project/commands.c\r
--- /dev/null
+#include "init.h"
+#include "pinconfig.h"
+#include "util/util.h"
+#include "ui/display.h"
+
+#include <core/wdt/wdt.h>
+#include <core/gpio/gpio.h>
+
+static void badge_init_backlight(void) {
+ HOB_SET_PIN_FUNC(HOB_LCD_BACKLIGHT, CLKOUT);
+
+ wdtInit(false);
+ SCB_CLKOUTCLKSEL = SCB_MAINCLKSEL_SOURCE_WDTOSC;
+ SCB_CLKOUTCLKUEN = SCB_CLKOUTCLKUEN_DISABLE;
+ SCB_CLKOUTCLKUEN = SCB_CLKOUTCLKUEN_UPDATE;
+ SCB_CLKOUTCLKDIV = 30;
+}
+
+void badge_init(void) {
+#define INPUT_PIN_CONFIG(spec, mode) do { \
+ HOB_SET_PIN_FUNC(spec, GPIO); \
+ gpioSetDir(HOB_PORT(spec), HOB_PIN(spec), gpioDirection_Input); \
+ gpioSetPullup(&HOB_IOCON(spec), (mode)); \
+ } while(0)
+
+ INPUT_PIN_CONFIG(HOB_BTN_UP , gpioPullupMode_PullDown);
+ INPUT_PIN_CONFIG(HOB_BTN_RIGHT , gpioPullupMode_PullDown);
+ INPUT_PIN_CONFIG(HOB_BTN_DOWN , gpioPullupMode_PullDown);
+ INPUT_PIN_CONFIG(HOB_BTN_LEFT , gpioPullupMode_PullDown);
+ INPUT_PIN_CONFIG(HOB_BTN_CENTER, gpioPullupMode_PullDown);
+ INPUT_PIN_CONFIG(HOB_BTN_A , gpioPullupMode_PullDown);
+ INPUT_PIN_CONFIG(HOB_BTN_B , gpioPullupMode_PullDown);
+#undef INPUT_PIN_CONFIG
+
+#define OUTPUT_PIN_CONFIG(spec, value) do { \
+ HOB_SET_PIN_FUNC(spec, GPIO); \
+ gpioSetDir(HOB_PORT(spec), HOB_PIN(spec), gpioDirection_Output); \
+ gpioSetValue(HOB_PORT(spec), HOB_PIN(spec), (value)); \
+ } while(0)
+
+ OUTPUT_PIN_CONFIG(HOB_USB_CONNECT , 1);
+ OUTPUT_PIN_CONFIG(HOB_LCD_CS , 1);
+ OUTPUT_PIN_CONFIG(HOB_LCD_RST , 1);
+ OUTPUT_PIN_CONFIG(HOB_DATAFLASH_CS, 1);
+#undef OUTPUT_PIN_CONFIG
+
+ badge_init_backlight();
+ badge_display_init();
+}
--- /dev/null
+#ifndef INCLUDED_HACKOVER2013_BADGE_INIT_H
+#define INCLUDED_HACKOVER2013_BADGE_INIT_H
+
+void badge_init(void);
+
+#endif
#include "core/cmd/cmd.h"
#endif
+#include "init.h"
#include "ui/display.h"
#include "ui/sprite.h"
#include "ui/event.h"
+#include "util/util.h"
#include "jumpnrun/jumpnrun.h"
-#include "r0ketports.h"
-#include "drivers/fatfs/ff.h"
-
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof*(arr))
-
-void backlightInit(void) {
-#if HW_IS_PROTOTYPE
-
-
- // prototype uses WDT CLKOUT to drive the LCD backlight
- // init without a reset
-
- IOCON_PIO0_1 &= ~(IOCON_PIO0_1_FUNC_MASK);
- IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CLKOUT;
-
- wdtInit(false);
-
- // use the WDT clock as the default WDT frequency is best frequency
- // XXX this register value is missing in lpc1343.h
-#define SCB_CLKOUTCLKSEL_SOURCE_WDTCLOCK ((unsigned int) 0x00000002) // Use the WDT clock
-
- SCB_CLKOUTCLKSEL = SCB_CLKOUTCLKSEL_SOURCE_WDTCLOCK;
-
- // toggle from LOW to HIGH to update source
- SCB_CLKOUTCLKUEN = SCB_CLKOUTCLKUEN_DISABLE;
- SCB_CLKOUTCLKUEN = SCB_CLKOUTCLKUEN_UPDATE;
-
- // divide by 30, to get almost 10 kHz
- SCB_CLKOUTCLKDIV = 30;
-
+#include "dataflash/at45db041d.h"
-#else
+#include "drivers/fatfs/ff.h"
+#ifdef R0KET
+#include "r0ketports.h"
+void rbBacklightInit(void) {
/* Enable the clock for CT16B1 */
SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT16B1);
// Enable Step-UP
gpioSetDir(RB_PWR_LCDBL, gpioDirection_Output);
gpioSetValue(RB_PWR_LCDBL, 0);
-
-
-#endif
}
void rbInit() {
-#if !HW_IS_PROTOTYPE
RB_HB0_IO &= ~IOCON_SWDIO_PIO1_3_FUNC_MASK;
RB_HB0_IO |= IOCON_SWDIO_PIO1_3_FUNC_GPIO;
RB_HB1_IO &= ~IOCON_JTAG_TCK_PIO0_10_FUNC_MASK;
RB_HB1_IO |= IOCON_JTAG_TCK_PIO0_10_FUNC_GPIO;
-#endif
struct {
int port;
uint32_t volatile *reg;
gpioPullupMode_t mode;
} const input_pins[] = {
-#if HW_IS_PROTOTYPE
- { RB_BTN0 , &RB_BTN0_IO , gpioPullupMode_PullDown },
- { RB_BTN1 , &RB_BTN1_IO , gpioPullupMode_PullDown },
- { RB_BTN2 , &RB_BTN2_IO , gpioPullupMode_PullDown },
- { RB_BTN3 , &RB_BTN3_IO , gpioPullupMode_PullDown },
- { RB_BTN4 , &RB_BTN4_IO , gpioPullupMode_PullDown },
- { RB_BTN_A , &RB_BTN_A_IO , gpioPullupMode_PullDown },
- { RB_BTN_B , &RB_BTN_B_IO , gpioPullupMode_PullDown },
-#else
{ RB_BTN0 , &RB_BTN0_IO , gpioPullupMode_PullUp },
{ RB_BTN1 , &RB_BTN1_IO , gpioPullupMode_PullUp },
{ RB_BTN2 , &RB_BTN2_IO , gpioPullupMode_PullUp },
{ RB_HB0 , &RB_HB0_IO , gpioPullupMode_PullUp },
{ RB_HB1 , &RB_HB1_IO , gpioPullupMode_PullUp },
{ RB_PWR_CHRG, &RB_PWR_CHRG_IO, gpioPullupMode_PullUp }
-#endif
};
for(int i = 0; i < ARRAY_SIZE(input_pins); ++i) {
gpioSetPullup(input_pins[i].reg, input_pins[i].mode);
}
-#if HW_IS_PROTOTYPE
- IOCON_JTAG_TMS_PIO1_0 &= ~(IOCON_JTAG_TMS_PIO1_0_FUNC_MASK);
- IOCON_JTAG_TMS_PIO1_0 |= IOCON_JTAG_TMS_PIO1_0_FUNC_GPIO;
-#else
// LED3 zur Bestimmung der Umgebungshelligkeit.
gpioSetDir(RB_LED3, gpioDirection_Input);
RB_LED3_IO = (RB_LED3_IO & IOCON_PIO1_11_FUNC_MASK) | IOCON_PIO1_11_FUNC_AD7;
// prepare LEDs
IOCON_JTAG_TDI_PIO0_11 &= ~IOCON_JTAG_TDI_PIO0_11_FUNC_MASK;
IOCON_JTAG_TDI_PIO0_11 |= IOCON_JTAG_TDI_PIO0_11_FUNC_GPIO;
-#endif
struct {
int port;
{ USB_CONNECT , 1 },
{ RB_LCD_CS , 1 },
{ RB_SPI_CS_DF, 1 },
-#if !HW_IS_PROTOTYPE
{ RB_SPI_SS2 , 1 },
{ RB_SPI_SS3 , 1 },
{ RB_SPI_SS4 , 1 },
{ RB_HB3 , 1 },
{ RB_HB4 , 1 },
{ RB_HB5 , 1 }
-#endif
};
for(int i = 0; i < ARRAY_SIZE(output_pins); ++i) {
gpioSetValue(output_pins[i].port, output_pins[i].pin, output_pins[i].value);
}
-#if !HW_IS_PROTOTYPE
// Set P0.0 to GPIO
RB_PWR_LCDBL_IO &= ~RB_PWR_LCDBL_IO_FUNC_MASK;
RB_PWR_LCDBL_IO |= RB_PWR_LCDBL_IO_FUNC_GPIO;
gpioSetDir ( RB_PWR_LCDBL , gpioDirection_Input);
gpioSetPullup(&RB_PWR_LCDBL_IO, gpioPullupMode_Inactive);
-#endif
- backlightInit();
+ rbBacklightInit();
+ badge_display_init();
}
+#endif
/**************************************************************************/
/*!
// pmuInit();
// adcInit();
+#ifdef R0KET
rbInit();
-
- // usbMSCInit();
-
- badge_display_init();
+#else
+ badge_init();
+#endif
/*
- gpioSetDir(0, 11, gpioDirection_Output);
- gpioSetValue(0, 11, 0);
-
-
{
+ // f_mkfs(0, 1, 0);
badge_framebuffer fb;
int res = 0;
FATFS fatvol;
- if(FR_OK == f_mount(0, &fatvol)) {
- FIL fil;
- if(FR_OK == (res = f_open(&fil, "sshot.dat", FA_OPEN_EXISTING | FA_READ))) {
- UINT readbytes;
-
- if(FR_OK != f_read(&fil, &fb, sizeof(fb), &readbytes)) {
- gpioSetDir(RB_LED3, gpioDirection_Output);
- gpioSetValue(RB_LED3, 1);
- }
-
- f_close(&fil);
- } else {
- fb.data[0][0] = res;
- gpioSetDir(RB_LED1, gpioDirection_Output);
- gpioSetValue(RB_LED1, 1);
+ while(FR_OK != f_mount(0, &fatvol)) {
+ f_mkfs(0, 1, 0);
+ }
+
+ FIL fil;
+ if(FR_OK == (res = f_open(&fil, "sshot.dat", FA_OPEN_EXISTING | FA_READ))) {
+ UINT readbytes;
+
+ if(FR_OK != f_read(&fil, &fb, sizeof(fb), &readbytes)) {
}
- } else {
- gpioSetDir(RB_LED2, gpioDirection_Output);
- gpioSetValue(RB_LED2, 1);
+
+ f_close(&fil);
}
badge_framebuffer_flush(&fb);
+
}
+
+ usbMSCInit();
+ for(;;);
*/
badge_event_start();
+
/*
for(;;) {
if(JUMPNRUN_ERROR == jumpnrun_play("smb.lvl")) {
for(uint8_t i = 0; ; ++i) {
badge_event_t event = badge_event_wait();
- // SCB_CLKOUTCLKDIV = i;
-
switch(badge_event_type(event)) {
case BADGE_EVENT_USER_INPUT: {
buttons = badge_event_current_input_state();
badge_sprite const sp = { 4, 4, (uint8_t const *) "\xff\xff" };
badge_framebuffer fb = { { { 0x80 } } };
- SSP_SSP0CR0 =
- SSP_SSP0CR0_DSS_8BIT // Data size = 8-bit
- | SSP_SSP0CR0_FRF_SPI // Frame format = SPI
- | SSP_SSP0CR0_SCR_8;
-
- gpioSetValue(RB_SPI_CS_DF, 0);
-
- uint8_t st;
- sspSend(0, "\x05", 1);
- sspReceive(0, &st, 1);
-
- gpioSetValue(RB_SPI_CS_DF, 1);
-
- fb.data[0][1] = st;
- /*
- for(int i = 0; i < 9 * 96; ++i) {
- fb.data[0][i] = 0xbb;
- }
- */
-
if(buttons & BADGE_EVENT_KEY_UP) { badge_framebuffer_blt(&fb, 30, 10, &sp, 0); }
if(buttons & BADGE_EVENT_KEY_DOWN) { badge_framebuffer_blt(&fb, 30, 50, &sp, 0); }
if(buttons & BADGE_EVENT_KEY_LEFT) { badge_framebuffer_blt(&fb, 10, 30, &sp, 0); }
--- /dev/null
+#ifndef INCLUDED_HACKOVER_2013_BADGE_PINCONFIG_H
+#define INCLUDED_HACKOVER_2013_BADGE_PINCONFIG_H
+
+#include <lpc134x.h>
+
+#define HOB_BTN_UP (3, 2)
+#define HOB_BTN_RIGHT (1, 5)
+#define HOB_BTN_DOWN (1, 6)
+#define HOB_BTN_LEFT (3, 3)
+#define HOB_BTN_CENTER (1, 7)
+#define HOB_BTN_A (1, 11)
+#define HOB_BTN_B (1, 4)
+
+#define HOB_LCD_CS (1, 0)
+#define HOB_LCD_RST (1, 1)
+#define HOB_LCD_BACKLIGHT (0, 1)
+
+#define HOB_DATAFLASH_CS (0, 7)
+
+#define HOB_RADIO_CE (2, 10)
+#define HOB_RADIO_CS (2, 9)
+#define HOB_RADIO_IRQ (2, 2)
+
+#define HOB_USB_CONNECT (0, 6)
+
+#define HOB_PIO0_0 nRESET_PIO0_0
+#define HOB_PIO0_1 PIO0_1
+#define HOB_PIO0_2 PIO0_2
+#define HOB_PIO0_3 PIO0_3
+#define HOB_PIO0_4 PIO0_4
+#define HOB_PIO0_5 PIO0_5
+#define HOB_PIO0_6 PIO0_6
+#define HOB_PIO0_7 PIO0_7
+#define HOB_PIO0_8 PIO0_8
+#define HOB_PIO0_9 PIO0_9
+#define HOB_PIO0_10 JTAG_TCK_PIO0_10
+#define HOB_PIO0_11 JTAG_TDI_PIO0_11
+
+#define HOB_PIO1_0 JTAG_TMS_PIO1_0
+#define HOB_PIO1_1 JTAG_TDO_PIO1_1
+#define HOB_PIO1_2 JTAG_nTRST_PIO1_2
+#define HOB_PIO1_3 SWDIO_PIO1_3
+#define HOB_PIO1_4 PIO1_4
+#define HOB_PIO1_5 PIO1_5
+#define HOB_PIO1_6 PIO1_6
+#define HOB_PIO1_7 PIO1_7
+#define HOB_PIO1_8 PIO1_8
+#define HOB_PIO1_9 PIO1_9
+#define HOB_PIO1_10 PIO1_10
+#define HOB_PIO1_11 PIO1_11
+
+#define HOB_PIO2_0 PIO2_0
+#define HOB_PIO2_1 PIO2_1
+#define HOB_PIO2_2 PIO2_2
+#define HOB_PIO2_3 PIO2_3
+#define HOB_PIO2_4 PIO2_4
+#define HOB_PIO2_5 PIO2_5
+#define HOB_PIO2_6 PIO2_6
+#define HOB_PIO2_7 PIO2_7
+#define HOB_PIO2_8 PIO2_8
+#define HOB_PIO2_9 PIO2_9
+#define HOB_PIO2_10 PIO2_10
+#define HOB_PIO2_11 PIO2_11
+
+#define HOB_PIO3_0 PIO3_0
+#define HOB_PIO3_1 PIO3_1
+#define HOB_PIO3_2 PIO3_2
+#define HOB_PIO3_3 PIO3_3
+#define HOB_PIO3_4 PIO3_4
+#define HOB_PIO3_5 PIO3_5
+
+#define HOB_EXPAND(foo) foo
+
+#define HOB_PORT_I(port, pin) port
+#define HOB_PIN_I(port, pin) pin
+#define HOB_PORT(spec) HOB_EXPAND(HOB_PORT_I spec)
+#define HOB_PIN(spec) HOB_EXPAND(HOB_PIN_I spec)
+
+#define HOB_BUILD_PIO_SUFFIX_I(port, pin) HOB_PIO ## port ## _ ## pin
+#define HOB_BUILD_PIO_SUFFIX(port, pin) HOB_BUILD_PIO_SUFFIX_I(port, pin)
+#define HOB_PIO_SUFFIX(spec) HOB_BUILD_PIO_SUFFIX(HOB_PORT(spec), HOB_PIN(spec))
+
+#define HOB_BUILD_IOCON_NAME_I(pio) IOCON_ ## pio
+#define HOB_BUILD_IOCON_NAME(pio) HOB_BUILD_IOCON_NAME_I(pio)
+#define HOB_IOCON(spec) HOB_BUILD_IOCON_NAME(HOB_PIO_SUFFIX(spec))
+
+#define HOB_BUILD_IOCON_MASK_I(pio, flag) IOCON_ ## pio ## _ ## flag
+#define HOB_BUILD_IOCON_MASK(pio, flag) HOB_BUILD_IOCON_MASK_I(pio, flag)
+#define HOB_IOCON_MASK(spec, flag) HOB_BUILD_IOCON_MASK(HOB_PIO_SUFFIX(spec), flag)
+
+#define HOB_SET_PIN_FUNC(spec, func) do { \
+ HOB_IOCON(spec) = \
+ (HOB_IOCON(spec) & ~HOB_IOCON_MASK(spec, FUNC_MASK)) \
+ | HOB_IOCON_MASK(spec, FUNC_ ## func); \
+ } while(0)
+
+/*
+HOB_PORT(HOB_LCD_BACKLIGHT)
+HOB_PIN(HOB_LCD_BACKLIGHT)
+HOB_IOCON(HOB_LCD_BACKLIGHT)
+HOB_IOCON_MASK(HOB_LCD_BACKLIGHT, FUNC_GPIO)
+*/
+
+#endif
#include <sysdefs.h>
#include <lpc134x.h>
+#ifdef R0KET
+
#include <r0ketports.h>
+#define CS_LOW() gpioSetValue(RB_LCD_CS , 0)
+#define CS_HIGH() gpioSetValue(RB_LCD_CS , 1)
+#define RST_LOW() gpioSetValue(RB_LCD_RST, 0)
+#define RST_HIGH() gpioSetValue(RB_LCD_RST, 1)
+
+#else
+
+#include <badge/pinconfig.h>
+
+#define CS_LOW() gpioSetValue(HOB_PORT(HOB_LCD_CS ), HOB_PIN(HOB_LCD_CS ), 0)
+#define CS_HIGH() gpioSetValue(HOB_PORT(HOB_LCD_CS ), HOB_PIN(HOB_LCD_CS ), 1)
+#define RST_LOW() gpioSetValue(HOB_PORT(HOB_LCD_RST), HOB_PIN(HOB_LCD_RST), 0)
+#define RST_HIGH() gpioSetValue(HOB_PORT(HOB_LCD_RST), HOB_PIN(HOB_LCD_RST), 1)
+
+#endif
+
#ifdef CFG_USBMSC
#include <core/usbhid-rom/usbmsc.h>
| SSP_SSP0CR0_FRF_SPI // Frame format = SPI
| SSP_SSP0CR0_SCR_8); // Serial clock rate = 8
SSP_SSP0CR0 = configReg;
- gpioSetValue(RB_LCD_CS, 0);
+
+ CS_LOW();
}
static void lcd_deselect() {
- gpioSetValue(RB_LCD_CS, 1);
+ CS_HIGH();
/* reset the bus to 8-Bit frames that everyone else uses */
uint32_t configReg = ( SSP_SSP0CR0_DSS_8BIT // Data size = 8-bit
| SSP_SSP0CR0_FRF_SPI // Frame format = SPI
void badge_display_init(void) {
sspInit(0, sspClockPolarity_Low, sspClockPhase_RisingEdge);
- gpioSetValue(RB_LCD_CS , 1);
- gpioSetValue(RB_LCD_RST, 1);
-
- gpioSetDir (RB_LCD_CS , gpioDirection_Output);
- gpioSetDir (RB_LCD_RST, gpioDirection_Output);
+ CS_HIGH();
+ RST_HIGH();
systickDelay(100);
- gpioSetValue(RB_LCD_RST, 0);
+ RST_LOW();
systickDelay(100);
- gpioSetValue(RB_LCD_RST, 1);
+ RST_HIGH();
systickDelay(100);
/*
int id = lcdRead(220);
#include <core/gpio/gpio.h>
#include <core/timer32/timer32.h>
+
+#ifdef R0KET
#include <r0ketports.h>
+#else
+#include <badge/pinconfig.h>
+#endif
// We depend on input being popped often, so no queue.
static badge_event_t volatile event_buffer;
};
static uint8_t badge_input_raw(void) {
- uint8_t result = BTN_NONE;
+ uint8_t result = 0;
-#if HW_IS_PROTOTYPE
- if (gpioGetValue(RB_BTN3 ) == 1) { result |= BADGE_EVENT_KEY_UP ; }
- if (gpioGetValue(RB_BTN2 ) == 1) { result |= BADGE_EVENT_KEY_DOWN ; }
- if (gpioGetValue(RB_BTN4 ) == 1) { result |= BADGE_EVENT_KEY_CENTER; }
- if (gpioGetValue(RB_BTN0 ) == 1) { result |= BADGE_EVENT_KEY_LEFT ; }
- if (gpioGetValue(RB_BTN1 ) == 1) { result |= BADGE_EVENT_KEY_RIGHT ; }
- if (gpioGetValue(RB_BTN_A) == 1) { result |= BADGE_EVENT_KEY_BTN_A ; }
- if (gpioGetValue(RB_BTN_B) == 1) { result |= BADGE_EVENT_KEY_BTN_B ; }
+#ifdef R0KET
+ if (gpioGetValue(RB_BTN3) == 0) { result |= BADGE_EVENT_KEY_UP ; }
+ if (gpioGetValue(RB_BTN2) == 0) { result |= BADGE_EVENT_KEY_DOWN ; }
+ if (gpioGetValue(RB_BTN4) == 0) { result |= BADGE_EVENT_KEY_CENTER; }
+ if (gpioGetValue(RB_BTN0) == 0) { result |= BADGE_EVENT_KEY_LEFT ; }
+ if (gpioGetValue(RB_BTN1) == 0) { result |= BADGE_EVENT_KEY_RIGHT ; }
+ if (gpioGetValue(RB_HB0 ) == 0) { result |= BADGE_EVENT_KEY_BTN_A ; }
+ if (gpioGetValue(RB_HB1 ) == 0) { result |= BADGE_EVENT_KEY_BTN_B ; }
#else
- if (gpioGetValue(RB_BTN3) == 0) { result |= BADGE_EVENT_KEY_UP ; }
- if (gpioGetValue(RB_BTN2) == 0) { result |= BADGE_EVENT_KEY_DOWN ; }
- if (gpioGetValue(RB_BTN4) == 0) { result |= BADGE_EVENT_KEY_CENTER; }
- if (gpioGetValue(RB_BTN0) == 0) { result |= BADGE_EVENT_KEY_LEFT ; }
- if (gpioGetValue(RB_BTN1) == 0) { result |= BADGE_EVENT_KEY_RIGHT ; }
- if (gpioGetValue(RB_HB0 ) == 0) { result |= BADGE_EVENT_KEY_BTN_A ; }
- if (gpioGetValue(RB_HB1 ) == 0) { result |= BADGE_EVENT_KEY_BTN_B ; }
+ if (gpioGetValue(HOB_PORT(HOB_BTN_UP ), HOB_PIN(HOB_BTN_UP )) == 1) { result |= BADGE_EVENT_KEY_UP ; }
+ if (gpioGetValue(HOB_PORT(HOB_BTN_DOWN ), HOB_PIN(HOB_BTN_DOWN )) == 1) { result |= BADGE_EVENT_KEY_DOWN ; }
+ if (gpioGetValue(HOB_PORT(HOB_BTN_CENTER), HOB_PIN(HOB_BTN_CENTER)) == 1) { result |= BADGE_EVENT_KEY_CENTER; }
+ if (gpioGetValue(HOB_PORT(HOB_BTN_LEFT ), HOB_PIN(HOB_BTN_LEFT )) == 1) { result |= BADGE_EVENT_KEY_LEFT ; }
+ if (gpioGetValue(HOB_PORT(HOB_BTN_RIGHT ), HOB_PIN(HOB_BTN_RIGHT )) == 1) { result |= BADGE_EVENT_KEY_RIGHT ; }
+ if (gpioGetValue(HOB_PORT(HOB_BTN_A ), HOB_PIN(HOB_BTN_A )) == 1) { result |= BADGE_EVENT_KEY_BTN_A ; }
+ if (gpioGetValue(HOB_PORT(HOB_BTN_B ), HOB_PIN(HOB_BTN_B )) == 1) { result |= BADGE_EVENT_KEY_BTN_B ; }
#endif
- return result;
+ return result;
}
uint8_t badge_event_current_input_state(void) {
--- /dev/null
+#ifndef INCLUDED_HACKOVER2013_BADGE_UTIL_UTIL_H
+#define INCLUDED_HACKOVER2013_BADGE_UTIL_UTIL_H
+
+#include "rectangle.h"
+#include "fixed_point.h"
+
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*arr))
+
+#endif
OP_WRITE_ENABLE = 0x06,
OP_WRITE_DISABLE = 0x04,
- OP_SECTOR_PROTEXT = 0x36,
+ OP_SECTOR_PROTECT = 0x36,
OP_SECTOR_UNPROTECT = 0x39,
OP_SECTOR_STATUS = 0x3c,
static volatile DSTATUS status = STA_NOINIT;
-static void wait_for_ready() {
- BYTE reg_status = 0xFF;
+BYTE dataflash_read_status_register(void) {
+ BYTE reg_status = 0xff;
CS_LOW();
xmit_spi(OP_STATUS_READ);
- do {
- rcvr_spi_m((uint8_t *) ®_status);
- } while (reg_status & STATUS_BSY);
+ rcvr_spi_m(®_status);
CS_HIGH();
+
+ return reg_status;
+}
+
+/*
+static void dataflash_write_status_register(BYTE status) {
+ CS_LOW();
+ xmit_spi(OP_WRITE_ENABLE);
+ CS_HIGH();
+
+ CS_LOW();
+ xmit_spi(OP_STATUS_WRITE);
+ xmit_spi(status);
+ CS_HIGH();
+}
+*/
+static void wait_for_ready() {
+ while(dataflash_read_status_register() & STATUS_BSY)
+ ;
}
static void dataflash_powerdown() {
gpioSetDir(RB_SPI_CS_DF, gpioDirection_Output);
dataflash_resume();
+
+ // BYTE status = dataflash_read_status_register();
+ // dataflash_write_status_register((status & ~STATUS_SWP) | STATUS_SWP_NONE);
status &= ~STA_NOINIT;
return status;
if (offset + length > PAGE_MAX * PAGE_SIZE) return RES_PARERR;
wait_for_ready();
+
CS_LOW();
xmit_spi(OP_READARRAY);
xmit_spi((BYTE)(offset >> 16));
- xmit_spi((BYTE)(offset >> 8));
- xmit_spi((BYTE)offset);
+ xmit_spi((BYTE)(offset >> 8));
+ xmit_spi((BYTE) offset );
xmit_spi(0x00); // follow up with don't care byte
do {
}
#if _READONLY == 0
+static void dataflash_sector_protect(DWORD addr) {
+ wait_for_ready();
+
+ addr &= ~(PAGE_SIZE - 1);
+
+ CS_LOW();
+ xmit_spi(OP_WRITE_ENABLE);
+ CS_HIGH();
+
+ CS_LOW();
+ xmit_spi(OP_SECTOR_PROTECT);
+ xmit_spi((BYTE)(addr >> 16));
+ xmit_spi((BYTE)(addr >> 8));
+ xmit_spi((BYTE) addr );
+ CS_HIGH();
+
+ wait_for_ready();
+}
+
+static void dataflash_sector_unprotect(DWORD addr) {
+ wait_for_ready();
+
+ addr &= ~(PAGE_SIZE - 1);
+
+ CS_LOW();
+ xmit_spi(OP_WRITE_ENABLE);
+ CS_HIGH();
+
+ CS_LOW();
+ xmit_spi(OP_SECTOR_UNPROTECT);
+ xmit_spi((BYTE)(addr >> 16));
+ xmit_spi((BYTE)(addr >> 8));
+ xmit_spi((BYTE) addr );
+ CS_HIGH();
+
+ wait_for_ready();
+}
+
+static DRESULT dataflash_write_4k(const BYTE *buff, DWORD addr) {
+ addr &= ~4095u;
+
+ CS_LOW();
+ xmit_spi(OP_WRITE_ENABLE);
+ CS_HIGH();
+
+ CS_LOW();
+ xmit_spi(OP_ERASE_BLOCK_4K);
+ xmit_spi((BYTE)(addr >> 16));
+ xmit_spi((BYTE)(addr >> 8));
+ xmit_spi((BYTE) addr );
+ CS_HIGH();
+
+ CS_LOW();
+ xmit_spi(OP_WRITE_ENABLE);
+ CS_HIGH();
+
+ CS_LOW();
+ xmit_spi(OP_PROGRAM_PAGE);
+ xmit_spi((BYTE)(addr >> 16));
+ xmit_spi((BYTE)(addr >> 8));
+ xmit_spi((BYTE) addr );
+ for(int i = 0; i < 4096; ++i) {
+ xmit_spi(buff[i]);
+ }
+ CS_HIGH();
+}
+
DRESULT dataflash_random_write(const BYTE *buff, DWORD offset, DWORD length) {
if (!length) return RES_PARERR;
if (status & STA_NOINIT) return RES_NOTRDY;
do {
wait_for_ready();
- DWORD pageaddr = (offset / PAGE_SIZE) * PAGE_SIZE;
+ DWORD addr = offset;
+ DWORD blockaddr = addr & ~4095u;
DWORD remaining = PAGE_SIZE - offset % PAGE_SIZE;
+ BYTE blockbuf[4096];
+ dataflash_random_read(blockbuf, blockaddr, 4096);
+
if (remaining > length) {
remaining = length;
}
length -= remaining;
offset += remaining;
+ dataflash_sector_unprotect(addr);
+
CS_LOW();
xmit_spi(OP_WRITE_ENABLE);
CS_HIGH();
- // read page into the internal buffer
CS_LOW();
xmit_spi(OP_PROGRAM_PAGE);
- xmit_spi((BYTE)(pageaddr >> 16));
- xmit_spi((BYTE)(pageaddr >> 8));
- xmit_spi((BYTE) pageaddr );
-
+ xmit_spi((BYTE)(addr >> 16));
+ xmit_spi((BYTE)(addr >> 8));
+ xmit_spi((BYTE) addr );
do {
xmit_spi(*buff++);
} while (--remaining);
-
CS_HIGH();
+
+ dataflash_sector_protect(addr);
} while (length);
+ wait_for_ready();
+
return RES_OK;
}
#include "iobase.h"
#include "core/ssp/ssp.h"
+#ifdef R0KET
#include <r0ketports.h>
+#else
+#include <badge/pinconfig.h>
+#define RB_SPI_CS_DF HOB_PORT(HOB_DATAFLASH_CS), HOB_PIN(HOB_DATAFLASH_CS)
+#endif
/* Opcodes */
#define OP_POWERDOWN (0xB9)
DRESULT dataflash_random_write(const BYTE *buff, DWORD offset, DWORD length);
DRESULT dataflash_ioctl(BYTE ctrl, void *buff);
+BYTE dataflash_read_status_register(void);
+
#endif /* _AT45DB041D_H */
/ data transfer. This reduces memory consumption 512 bytes each file object. */
-#define _FS_READONLY 1 //CFG_SDCARD_READONLY // 0 /* 0 or 1 */
+#define _FS_READONLY 0 //CFG_SDCARD_READONLY // 0 /* 0 or 1 */
/* Setting _FS_READONLY to 1 defines read only configuration. This removes
/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
/ f_truncate and useless f_getfree. */
/* To enable string functions, set _USE_STRFUNC to 1 or 2. */
-#define _USE_MKFS 0 /* 0 or 1 */
+#define _USE_MKFS 1 /* 0 or 1 */
/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */
+++ /dev/null
-#ifndef INCLUDED_HACKOVER_2013_BADGE_PINCONFIG_H
-#define INCLUDED_HACKOVER_2013_BADGE_PINCONFIG_H
-
-#include "lpc134x.h"
-
-#define HOB_TEST (1, 2)
-
-#define HOB_BTN_RIGHT (1, 5)
-#define HOB_BTN_DOWN (1, 6)
-#define HOB_BTN_UP (3, 2)
-#define HOB_BTN_LEFT (3, 3)
-#define HOB_BTN_CENTER (1, 7)
-#define HOB_BTN_A (1, 11)
-#define HOB_BTN_B (1, 4)
-
-#define HOB_LCD_CS (1, 0)
-#define HOB_LCD_RST (1, 1)
-
-#define HOB_DATAFLASH_CS (0, 7)
-
-#define HOB_RADIO_CE (2, 10)
-#define HOB_RADIO_CS (2, 9)
-#define HOB_RADIO_IRQ (2, 2)
-
-#define HOB_IOCON_PIO0_0 IOCON_nRESET_PIO0_0
-#define HOB_IOCON_PIO0_1 IOCON_PIO0_1
-#define HOB_IOCON_PIO0_2 IOCON_PIO0_2
-#define HOB_IOCON_PIO0_3 IOCON_PIO0_3
-#define HOB_IOCON_PIO0_4 IOCON_PIO0_4
-#define HOB_IOCON_PIO0_5 IOCON_PIO0_5
-#define HOB_IOCON_PIO0_6 IOCON_PIO0_6
-#define HOB_IOCON_PIO0_7 IOCON_PIO0_7
-#define HOB_IOCON_PIO0_8 IOCON_PIO0_8
-#define HOB_IOCON_PIO0_9 IOCON_PIO0_9
-#define HOB_IOCON_PIO0_10 IOCON_JTAG_TCK_PIO0_10
-#define HOB_IOCON_PIO0_11 IOCON_JTAG_TDI_PIO0_11
-
-#define HOB_IOCON_PIO1_0 IOCON_JTAG_TMS_PIO1_0
-#define HOB_IOCON_PIO1_1 IOCON_JTAG_TDO_PIO1_1
-#define HOB_IOCON_PIO1_2 IOCON_JTAG_nTRST_PIO1_2
-#define HOB_IOCON_PIO1_3 IOCON_SWDIO_PIO1_3
-#define HOB_IOCON_PIO1_4 IOCON_PIO1_4
-#define HOB_IOCON_PIO1_5 IOCON_PIO1_5
-#define HOB_IOCON_PIO1_6 IOCON_PIO1_6
-#define HOB_IOCON_PIO1_7 IOCON_PIO1_7
-#define HOB_IOCON_PIO1_8 IOCON_PIO1_8
-#define HOB_IOCON_PIO1_9 IOCON_PIO1_9
-#define HOB_IOCON_PIO1_10 IOCON_PIO1_10
-#define HOB_IOCON_PIO1_11 IOCON_PIO1_11
-
-#define HOB_IOCON_PIO2_0 IOCON_PIO2_0
-#define HOB_IOCON_PIO2_1 IOCON_PIO2_1
-#define HOB_IOCON_PIO2_2 IOCON_PIO2_2
-#define HOB_IOCON_PIO2_3 IOCON_PIO2_3
-#define HOB_IOCON_PIO2_4 IOCON_PIO2_4
-#define HOB_IOCON_PIO2_5 IOCON_PIO2_5
-#define HOB_IOCON_PIO2_6 IOCON_PIO2_6
-#define HOB_IOCON_PIO2_7 IOCON_PIO2_7
-#define HOB_IOCON_PIO2_8 IOCON_PIO2_8
-#define HOB_IOCON_PIO2_9 IOCON_PIO2_9
-#define HOB_IOCON_PIO2_10 IOCON_PIO2_10
-#define HOB_IOCON_PIO2_11 IOCON_PIO2_11
-
-#define HOB_IOCON_PIO3_0 IOCON_PIO3_0
-#define HOB_IOCON_PIO3_1 IOCON_PIO3_1
-#define HOB_IOCON_PIO3_2 IOCON_PIO3_2
-#define HOB_IOCON_PIO3_3 IOCON_PIO3_3
-#define HOB_IOCON_PIO3_4 IOCON_PIO3_4
-#define HOB_IOCON_PIO3_5 IOCON_PIO3_5
-
-#define HOB_EXPAND(foo) foo
-
-#define HOB_PORT_I(port, pin) port
-#define HOB_PIN_I(port, pin) pin
-#define HOB_PORT(spec) HOB_EXPAND(HOB_PORT_I HOB_TEST)
-#define HOB_PIN(spec) HOB_EXPAND(HOB_PIN_I HOB_TEST)
-
-#define HOB_BUILD_IOREG_NAME_I(port, pin) HOB_IOCON_PIO ## port ## _ ## pin
-#define HOB_BUILD_IOREG_NAME(port, pin) HOB_BUILD_IOREG_NAME_I(port, pin)
-#define HOB_IOREG(spec) HOB_BUILD_IOREG_NAME(HOB_PORT(spec), HOB_PIN(spec))
-
-#define R0KET_SPEC_I(x, y) x,y
-#define R0KET_SPEC(hobspec) HOB_EXPAND(R0KET_SPEC_I hobspec)
-
-#define RB_SPI_CS_DF R0KET_SPEC(HOB_DATAFLASH_CS)
-
-#endif
#ifndef INCLUDED_R0KET_PORTS_H
#define INCLUDED_R0KET_PORTS_H
-#define HW_IS_PROTOTYPE 1
+#ifdef R0KET
// LED
#define RB_LED0 0,11
// Buttons
-#if HW_IS_PROTOTYPE
-
-// TODO
-// FIXME:
-// order of buttons is without sense!
-#define RB_BTN1 1,5
-#define RB_BTN1_IO IOCON_PIO1_5
-
-#define RB_BTN2 1,6
-#define RB_BTN2_IO IOCON_PIO1_6
-
-#define RB_BTN3 3,2
-#define RB_BTN3_IO IOCON_PIO3_2
-
-#define RB_BTN0 3,3
-#define RB_BTN0_IO IOCON_PIO3_3
-
-#define RB_BTN4 1,7
-#define RB_BTN4_IO IOCON_PIO1_7
-
-// A and B buttons on the hackover badge only
-#define RB_BTN_A 1,11
-#define RB_BTN_A_IO IOCON_PIO1_11
-
-#define RB_BTN_B 1,4
-#define RB_BTN_B_IO IOCON_PIO1_4
-
-#else
-
// TODO: XXX
// use alternate buttons for the board
#define RB_BTN4 2,7
#define RB_BTN4_IO IOCON_PIO2_7
-
-#endif
-
-
-// LCD
-#if HW_IS_PROTOTYPE
-
-// backlight pin is used in another way for prototype
-#define RB_LCD_CS 1,0
-#define RB_LCD_RST 1,1
-
-#define RB_SPI_CS_DF 0,7
-
-#else
-
#define RB_LCD_BL 1,9
#define RB_LCD_CS 2,1
#define RB_LCD_RST 2,2
#define RB_SPI_CS_DF 2,0
-#endif
-
-
// I2C
#define RB_I2C_SCL 0,4
#define RB_HB5 1,2
#define RB_HB5_IO IOCON_PIO1_2
-// Funk
-#if HW_IS_PROTOTYPE
-
-#define RB_NRF_CE 2,10
-#define RB_NRF_CE_IO IOCON_PIO2_10
-#define RB_SPI_NRF_CS 2,9
-#define RB_SPI_NRF_CS_IO IOCON_PIO2_9
-
-// TODO: this pin is new. support must be added for configuration in main.c
-#define RB_SPI_NRF_IRQ 2,2
-#define RB_SPI_NRF_IRQ_IO IOCON_PIO2_2
-
-#else
-
#define RB_NRF_CE 1,5
#define RB_NRF_CE_IO IOCON_PIO1_5
#define RB_SPI_NRF_CS 1,10
#define RB_SPI_NRF_CS_IO IOCON_PIO1_10
-#endif
-
// Misc
#define RB_BUSINT 3,0
#define RB_BUSINT_IO IOCON_PIO3_0
#endif
+#endif
+