diff options
| author | William D. Jones <[email protected]> | 2019-01-10 09:58:06 -0500 |
|---|---|---|
| committer | William D. Jones <[email protected]> | 2019-01-10 09:58:06 -0500 |
| commit | b367baeaf1d64930654f136a2409f1322fc73ab2 (patch) | |
| tree | 710698145d52c72b807971d05512330fde2cc9b1 /hw/bsp | |
| parent | e4d6f336f0d5004fd9ee3074305b7980ba777dfd (diff) | |
| parent | 5804e56e3c2ab4480bf72d94d997f769a645af47 (diff) | |
Merge branch 'master' of https://github.com/hathach/tinyusb into stm32f4
Diffstat (limited to 'hw/bsp')
52 files changed, 1023 insertions, 6006 deletions
diff --git a/hw/bsp/board.h b/hw/bsp/board.h index 6fe463692..1aa51a560 100644 --- a/hw/bsp/board.h +++ b/hw/bsp/board.h @@ -52,38 +52,27 @@ #include "ansi_escape.h" -//--------------------------------------------------------------------+ -// PRINTF TARGET DEFINE -//--------------------------------------------------------------------+ -/** \defgroup group_printf Printf Retarget - * \brief Retarget the standard stdio printf/getchar to other IOs - * @{ */ -#define PRINTF_TARGET_SEMIHOST 1 ///< Using the semihost support from toolchain, requires no hardware but is the slowest -#define PRINTF_TARGET_UART 2 ///< Using UART as stdio, this is the default for most of the board -#define PRINTF_TARGET_SWO 3 ///< Using non-instructive serial wire output (SWO), is the best option since it does not slow down MCU but requires supported from debugger and IDE -#define PRINTF_TARGET_NONE 4 ///< Using none at all. -/** @} */ - -#define PRINTF(...) printf(__VA_ARGS__) - +// NXP LPC #if defined BOARD_LPCXPRESSO11U14 #include "lpcxpresso11u14/board_lpcxpresso11u14.h" -#elif defined BOARD_LPCXPRESSO11U68 - #include "lpcxpresso11u68/board_lpcxpresso11u68.h" #elif defined BOARD_LPCXPRESSO1347 #include "lpcxpresso1347/board_lpcxpresso1347.h" +#elif defined BOARD_LPCXPRESSO11U68 + #include "lpcxpresso11u68/board_lpcxpresso11u68.h" #elif defined BOARD_LPCXPRESSO1769 #include "lpcxpresso1769/board_lpcxpresso1769.h" -#elif defined BOARD_NGX4330 - #include "ngx/board_ngx4330.h" +#elif defined BOARD_MCB1800 + #include "mcb1800/board_mcb1800.h" +#elif defined BOARD_EA4088QS + #include "ea4088qs/board_ea4088qs.h" #elif defined BOARD_EA4357 #include "ea4357/board_ea4357.h" -#elif defined BOARD_MCB4300 - #include "keil/board_mcb4300.h" -#elif defined BOARD_LPCLINK2 - #include "lpcxpresso/board_lpclink2.h" + +// Nordic nRF #elif defined BOARD_PCA10056 #include "pca10056/board_pca10056.h" + +// Atmel SAM #elif defined BOARD_METRO_M4_EXPRESS #include "metro_m4_express/board_metro_m4_express.h" #elif defined BOARD_METRO_M0_EXPRESS @@ -104,20 +93,18 @@ void board_init(void); //--------------------------------------------------------------------+ // LED -// Board variant must defined following -// - BOARD_LED_NUM : number of LEDs -// - BOARD_LEDn : where n is 0,1 etc ... +// Board layer use only 1 LED for indicator //--------------------------------------------------------------------+ -void board_led_control(uint32_t led_id, bool state); +void board_led_control(bool state); -static inline void board_led_on(uint32_t led_id) +static inline void board_led_on(void) { - board_led_control(led_id, true); + board_led_control(true); } -static inline void board_led_off(uint32_t led_id) +static inline void board_led_off(void) { - board_led_control(led_id, false); + board_led_control(false); } //--------------------------------------------------------------------+ diff --git a/hw/bsp/ea4088qs/board_ea4088qs.c b/hw/bsp/ea4088qs/board_ea4088qs.c new file mode 100644 index 000000000..d2bf409aa --- /dev/null +++ b/hw/bsp/ea4088qs/board_ea4088qs.c @@ -0,0 +1,186 @@ +/**************************************************************************/ +/*! + @file board_ea4088qs.c + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2018, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ + +#ifdef BOARD_EA4088QS + +#include "../board.h" +#include "tusb.h" + +#define LED_PORT 2 +#define LED_PIN 19 + +//--------------------------------------------------------------------+ +// MACRO TYPEDEF CONSTANT ENUM DECLARATION +//--------------------------------------------------------------------+ + +/* System oscillator rate and RTC oscillator rate */ +const uint32_t OscRateIn = 12000000; +const uint32_t RTCOscRateIn = 32768; + +/* Pin muxing configuration */ +static const PINMUX_GRP_T pinmuxing[] = +{ + /* LEDs */ + {2, 19, (IOCON_FUNC0 | IOCON_MODE_INACT)}, +}; + +static const PINMUX_GRP_T pin_usb_mux[] = +{ + // USB1 as Host + {0, 29, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // D+1 + {0, 30, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // D-1 + {1, 18, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // UP LED1 + {1, 19, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // PPWR1 +// {2, 14, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // VBUS1 +// {2, 15, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // OVRCR1 + + // USB2 as Device + {0, 31, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // D+2 + {0, 13, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // UP LED + {0, 14, (IOCON_FUNC3 | IOCON_MODE_INACT)}, // CONNECT2 + + /* VBUS is not connected on this board, so leave the pin at default setting. */ + /*Chip_IOCON_PinMux(LPC_IOCON, 1, 30, IOCON_MODE_INACT, IOCON_FUNC2);*/ /* USB VBUS */ +}; + +// Invoked by startup code +void SystemInit(void) +{ + /* Enable IOCON clock */ + Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); + Chip_SetupXtalClocking(); +} + +void board_init(void) +{ + SystemCoreClockUpdate(); + +#if CFG_TUSB_OS == OPT_OS_NONE + SysTick_Config(SystemCoreClock / BOARD_TICKS_HZ); +#elif CFG_TUSB_OS == OPT_OS_FREERTOS + // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher ) + NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ); +#endif + + Chip_GPIO_Init(LPC_GPIO); + + //------------- LED -------------// + Chip_GPIO_SetPinDIROutput(LPC_GPIO, LED_PORT, LED_PIN); + + //------------- BUTTON -------------// +// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIO_SetDir(buttons[i].port, TU_BIT(buttons[i].pin), 0); + + + //------------- UART -------------// + + //------------- USB -------------// + // Port1 as Host, Port2: Device + Chip_USB_Init(); + + enum { + USBCLK = 0x1B // Host + Device + OTG + AHB + }; + + LPC_USB->OTGClkCtrl = USBCLK; + while ( (LPC_USB->OTGClkSt & USBCLK) != USBCLK ) {} + + // USB1 = host, USB2 = device + LPC_USB->StCtrl = 0x3; + + Chip_IOCON_SetPinMuxing(LPC_IOCON, pin_usb_mux, sizeof(pin_usb_mux) / sizeof(PINMUX_GRP_T)); +} + + +//------------- LED -------------// +void board_led_control(bool state) +{ + Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state); +} + +//------------- Buttons -------------// +#if 0 +static bool button_read(uint8_t id) +{ +// return !TU_BIT_TEST( GPIO_ReadValue(buttons[id].gpio_port), buttons[id].gpio_pin ); // button is active low +} +#endif + +uint32_t board_buttons(void) +{ + uint32_t result = 0; + +// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? TU_BIT(i) : 0); + + return result; +} + + +//------------- UART -------------// +uint8_t board_uart_getchar(void) +{ + //return UART_ReceiveByte(BOARD_UART_PORT); + return 0; +} + +void board_uart_putchar(uint8_t c) +{ + //UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING); + (void) c; +} + + +/*------------------------------------------------------------------*/ +/* TUSB HAL MILLISECOND + *------------------------------------------------------------------*/ +#if CFG_TUSB_OS == OPT_OS_NONE + +volatile uint32_t system_ticks = 0; + +void SysTick_Handler (void) +{ + system_ticks++; +} + +uint32_t tusb_hal_millis(void) +{ + return board_tick2ms(system_ticks); +} + +#endif + +#endif diff --git a/hw/bsp/ea4088qs/board_ea4088qs.h b/hw/bsp/ea4088qs/board_ea4088qs.h new file mode 100644 index 000000000..dc5854ada --- /dev/null +++ b/hw/bsp/ea4088qs/board_ea4088qs.h @@ -0,0 +1,51 @@ +/**************************************************************************/ +/*! + @file board_ea4088qs.h + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2018, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ +#ifndef BOARD_EA4088QS_H_ +#define BOARD_EA4088QS_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "chip.h" + +#ifdef __cplusplus + } +#endif + +#endif /* BOARD_EA4088QS_H_ */ diff --git a/hw/bsp/ea4357/board_ea4357.c b/hw/bsp/ea4357/board_ea4357.c index ebe0d02e0..a262b0344 100644 --- a/hw/bsp/ea4357/board_ea4357.c +++ b/hw/bsp/ea4357/board_ea4357.c @@ -36,11 +36,12 @@ */ /**************************************************************************/ -#include "bsp/board.h" -#include "tusb.h" - #ifdef BOARD_EA4357 +#include "../board.h" +#include "pca9532.h" +#include "tusb.h" + #define BOARD_UART_PORT LPC_USART0 #define BOARD_UART_PIN_PORT 0x0f #define BOARD_UART_PIN_TX 10 // PF.10 : UART0_TXD @@ -88,39 +89,75 @@ uint32_t tusb_hal_millis(void) /*------------------------------------------------------------------*/ /* BOARD API *------------------------------------------------------------------*/ -void board_init(void) + +/* System configuration variables used by chip driver */ +const uint32_t ExtRateIn = 0; +const uint32_t OscRateIn = 12000000; + +static const PINMUX_GRP_T pinmuxing[] = { - CGU_Init(); + // USB -#if CFG_TUSB_OS == OPT_OS_NONE // TODO may move to main.c - SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE) / BOARD_TICKS_HZ); // 1 msec tick timer -#endif + /* I2S */ + {0x3, 0, (SCU_PINIO_FAST | SCU_MODE_FUNC2)}, //I2S0_TX_CLK + {0xC, 12, (SCU_PINIO_FAST | SCU_MODE_FUNC6)}, //I2S0_TX_SDA + {0xC, 13, (SCU_PINIO_FAST | SCU_MODE_FUNC6)}, //I2S0_TX_WS + {0x6, 0, (SCU_PINIO_FAST | SCU_MODE_FUNC4)}, //I2S0_RX_SCK + {0x6, 1, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, //I2S0_RX_WS + {0x6, 2, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, //I2S0_RX_SDA +}; - //------------- USB -------------// - // USB0 Power: EA4357 channel B U20 GPIO26 active low (base board), P2_3 on LPC4357 - scu_pinmux(0x02, 3, MD_PUP | MD_EZI, FUNC7); // USB0 VBus Power +/* Pin clock mux values, re-used structure, value in first index is meaningless */ +static const PINMUX_GRP_T pinclockmuxing[] = +{ + {0, 0, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)}, + {0, 1, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)}, + {0, 2, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)}, + {0, 3, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)}, +}; - #if CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE - scu_pinmux(0x09, 5, GPIO_PDN, FUNC4); // P9_5 (GPIO5[18]) (GPIO28 on oem base) as USB connect, active low. - GPIO_SetDir(5, BIT_(18), 1); - #endif +// Invoked by startup code +void SystemInit(void) +{ + /* Setup system level pin muxing */ + Chip_SCU_SetPinMuxing(pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); - // USB1 Power: EA4357 channel A U20 is enabled by SJ5 connected to pad 1-2, no more action required - // TODO Remove R170, R171, solder a pair of 15K to USB1 D+/D- to test with USB1 Host + /* Clock pins only, group field not used */ + for (int i = 0; i <(int) (sizeof(pinclockmuxing) / sizeof(pinclockmuxing[0])); i++) + { + Chip_SCU_ClockPinMuxSet(pinclockmuxing[i].pinnum, pinclockmuxing[i].modefunc); + } + + Chip_SetupXtalClocking(); +} + +void board_init(void) +{ + SystemCoreClockUpdate(); + +#if CFG_TUSB_OS == OPT_OS_NONE + SysTick_Config( SystemCoreClock / BOARD_TICKS_HZ ); +#endif + + Chip_GPIO_Init(LPC_GPIO_PORT); //------------- LED -------------// - I2C_Init(LPC_I2C0, 100000); - I2C_Cmd(LPC_I2C0, ENABLE); + /* Init I2C */ + Chip_SCU_I2C0PinConfig(I2C0_STANDARD_FAST_MODE); + Chip_I2C_Init(I2C0); + Chip_I2C_SetClockRate(I2C0, 100000); + Chip_I2C_SetMasterEventHandler(I2C0, Chip_I2C_EventHandlerPolling); + pca9532_init(); +#if 0 //------------- BUTTON -------------// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) { scu_pinmux(buttons[i].mux_port, buttons[i].mux_pin, GPIO_NOPULL, FUNC0); - GPIO_SetDir(buttons[i].gpio_port, BIT_(buttons[i].gpio_pin), 0); + GPIO_SetDir(buttons[i].gpio_port, TU_BIT(buttons[i].gpio_pin), 0); } -#if 0 //------------- UART -------------// scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN, FUNC1); scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN | MD_EZI | MD_ZI, FUNC1); @@ -134,33 +171,122 @@ void board_init(void) UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit #endif - //------------- NAND Flash (K9FXX) Size = 128M, Page Size = 2K, Block Size = 128K, Number of Block = 1024 -------------// -// nand_init(); + //------------- USB -------------// + enum { + USBMODE_DEVICE = 2, + USBMODE_HOST = 3 + }; + + enum { + USBMODE_VBUS_LOW = 0, + USBMODE_VBUS_HIGH = 1 + }; + + /* USB0 + * For USB Device operation; insert jumpers in position 1-2 in JP17/JP18/JP19. GPIO28 controls USB + * connect functionality and LED32 lights when the USB Device is connected. SJ4 has pads 1-2 shorted + * by default. LED33 is controlled by GPIO27 and signals USB-up state. GPIO54 is used for VBUS + * sensing. + * For USB Host operation; insert jumpers in position 2-3 in JP17/JP18/JP19. USB Host power is + * controlled via distribution switch U20 (found in schematic page 11). Signal GPIO26 is active low and + * enables +5V on VBUS2. LED35 light whenever +5V is present on VBUS2. GPIO55 is connected to + * status feedback from the distribution switch. GPIO54 is used for VBUS sensing. 15Kohm pull-down + * resistors are always active + */ +#if CFG_TUSB_RHPORT0_MODE + Chip_USB0_Init(); + + // Reset controller + LPC_USB0->USBCMD_D |= 0x02; + while( LPC_USB0->USBCMD_D & 0x02 ) {} + + // Set mode + #if CFG_TUSB_RHPORT0_MODE & OPT_MODE_HOST + LPC_USB0->USBMODE_H = USBMODE_HOST | (USBMODE_VBUS_HIGH << 5); + + LPC_USB0->PORTSC1_D |= (1<<24); // FIXME force full speed for debugging + #else // TODO OTG + LPC_USB0->USBMODE_D = USBMODE_DEVICE; + LPC_USB0->OTGSC = (1<<3) | (1<<0) /*| (1<<16)| (1<<24)| (1<<25)| (1<<26)| (1<<27)| (1<<28)| (1<<29)| (1<<30)*/; + #endif +#endif + + /* USB1 + * When USB channel #1 is used as USB Host, 15Kohm pull-down resistors are needed on the USB data + * signals. These are activated inside the USB OTG chip (U31), and this has to be done via the I2C + * interface of GPIO52/GPIO53. + * J20 is the connector to use when USB Host is used. In order to provide +5V to the external USB + * device connected to this connector (J20), channel A of U20 must be enabled. It is enabled by default + * since SJ5 is normally connected between pin 1-2. LED34 lights green when +5V is available on J20. + * JP15 shall not be inserted. JP16 has no effect + * + * When USB channel #1 is used as USB Device, a 1.5Kohm pull-up resistor is needed on the USB DP + * data signal. There are two methods to create this. JP15 is inserted and the pull-up resistor is always + * enabled. Alternatively, the pull-up resistor is activated inside the USB OTG chip (U31), and this has to + * be done via the I2C interface of GPIO52/GPIO53. In the latter case, JP15 shall not be inserted. + * J19 is the connector to use when USB Device is used. Normally it should be a USB-B connector for + * creating a USB Device interface, but the mini-AB connector can also be used in this case. The status + * of VBUS can be read via U31. + * JP16 shall not be inserted. + */ +#if CFG_TUSB_RHPORT1_MODE + Chip_USB1_Init(); + + // Reset controller + LPC_USB1->USBCMD_D |= 0x02; + while( LPC_USB1->USBCMD_D & 0x02 ) {} + + // Set mode + #if CFG_TUSB_RHPORT1_MODE & OPT_MODE_HOST + LPC_USB1->USBMODE_H = USBMODE_HOST | (USBMODE_VBUS_HIGH << 5); + #else // TODO OTG + LPC_USB1->USBMODE_D = USBMODE_DEVICE; + #endif + + // USB1 as fullspeed + LPC_USB1->PORTSC1_D |= (1<<24); +#endif + + // USB0 Vbus Power: P2_3 on EA4357 channel B U20 GPIO26 active low (base board) + Chip_SCU_PinMuxSet(2, 3, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC7); + + #if CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE + // P9_5 (GPIO5[18]) (GPIO28 on oem base) as USB connect, active low. + Chip_SCU_PinMuxSet(9, 5, SCU_MODE_PULLDOWN | SCU_MODE_FUNC4); + Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 5, 18); + #endif + + // USB1 Power: EA4357 channel A U20 is enabled by SJ5 connected to pad 1-2, no more action required + // TODO Remove R170, R171, solder a pair of 15K to USB1 D+/D- to test with USB1 Host } -//--------------------------------------------------------------------+ -// LEDS -//--------------------------------------------------------------------+ -void board_led_control(uint32_t id, bool state) +// LED +void board_led_control(bool state) { - uint16_t on_mask = state ? (1 << id) : 0; - uint16_t off_mask = state ? 0 : (1 << id); - pca9532_setLeds( on_mask << 8, off_mask << 8 ); + if (state) + { + pca9532_setLeds( LED1, 0 ); + }else + { + pca9532_setLeds( 0, LED1); + } } //--------------------------------------------------------------------+ // BUTTONS //--------------------------------------------------------------------+ +#if 0 static bool button_read(uint8_t id) { - return !BIT_TEST_( GPIO_ReadValue(buttons[id].gpio_port), buttons[id].gpio_pin ); // button is active low +// return !TU_BIT_TEST( GPIO_ReadValue(buttons[id].gpio_port), buttons[id].gpio_pin ); // button is active low } +#endif uint32_t board_buttons(void) { uint32_t result = 0; - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0); +// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? TU_BIT(i) : 0); return result; } @@ -171,10 +297,13 @@ uint32_t board_buttons(void) uint8_t board_uart_getchar(void) { //return UART_ReceiveByte(BOARD_UART_PORT); + return 0; } + void board_uart_putchar(uint8_t c) { //UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING); + (void) c; } #endif diff --git a/hw/bsp/ea4357/board_ea4357.h b/hw/bsp/ea4357/board_ea4357.h index 6fe8ca874..80ff678b5 100644 --- a/hw/bsp/ea4357/board_ea4357.h +++ b/hw/bsp/ea4357/board_ea4357.h @@ -43,22 +43,7 @@ extern "C" { #endif -#include "LPC43xx.h" -#include "lpc43xx_scu.h" -#include "lpc43xx_cgu.h" -#include "lpc43xx_gpio.h" -#include "lpc43xx_uart.h" -#include "lpc43xx_i2c.h" - - -#include "oem_base_board/pca9532.h" // LEDs - -#define BOARD_LED_NUM 1 -#define BOARD_LED0 0 - - -//#define CFG_PRINTF_TARGET PRINTF_TARGET_SWO -#define CFG_PRINTF_TARGET PRINTF_TARGET_UART +#include "chip.h" #ifdef __cplusplus } diff --git a/hw/bsp/ea4357/emac.c b/hw/bsp/ea4357/emac.c deleted file mode 100644 index fce042259..000000000 --- a/hw/bsp/ea4357/emac.c +++ /dev/null @@ -1,480 +0,0 @@ -/****************************************************************** - ***** ***** - ***** Name: cs8900.c ***** - ***** Ver.: 1.0 ***** - ***** Date: 07/05/2001 ***** - ***** Auth: Andreas Dannenberg ***** - ***** HTWK Leipzig ***** - ***** university of applied sciences ***** - ***** Germany ***** - ***** Func: ethernet packet-driver for use with LAN- ***** - ***** controller CS8900 from Crystal/Cirrus Logic ***** - ***** ***** - ***** NXP: Module modified for use with NXP ***** - ***** lpc43xx EMAC Ethernet controller ***** - ***** ***** - ******************************************************************/ - -#include "../board.h" - -#if BOARD == BOARD_EA4357 - -#include "emac.h" -//#include "tcpip.h" -#include "LPC43xx.h" -#include "lpc43xx_scu.h" -#include "lpc43xx_rgu.h" - -#define TIMEOUT 100000 - -static unsigned short *rptr; -static unsigned short *tptr; - -static unsigned int TxDescIndex = 0; -static unsigned int RxDescIndex = 0; - -// Keil: function added to write PHY -static void write_PHY (unsigned int PhyReg, unsigned short Value) { - - unsigned int tout; - - /* Write a data 'Value' to PHY register 'PhyReg'. */ - while(LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY); // Check GMII busy bit - LPC_ETHERNET->MAC_MII_ADDR = (DP83848C_DEF_ADR<<11) | (PhyReg<<6) | GMII_WRITE; - LPC_ETHERNET->MAC_MII_DATA = Value; - LPC_ETHERNET->MAC_MII_ADDR |= GMII_BUSY; // Start PHY Write Cycle - - /* Wait utill operation completed */ - for (tout = 0; tout < MII_WR_TOUT; tout++) { - if ((LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY) == 0) { - break; - } - } - if (tout == MII_WR_TOUT) // Trap the timeout - while(1); -} - - -// Keil: function added to read PHY -static unsigned short read_PHY (unsigned int PhyReg) { - - unsigned int tout, val; - - /* Read a PHY register 'PhyReg'. */ - while(LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY); // Check GMII busy bit - LPC_ETHERNET->MAC_MII_ADDR = (DP83848C_DEF_ADR<<11) | (PhyReg<<6) | GMII_READ; - LPC_ETHERNET->MAC_MII_ADDR |= GMII_BUSY; // Start PHY Read Cycle - - /* Wait until operation completed */ - for (tout = 0; tout < MII_RD_TOUT; tout++) { - if ((LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY) == 0) { - break; - } - } - if (tout == MII_RD_TOUT) // Trap the timeout - while(1); - val = LPC_ETHERNET->MAC_MII_DATA; - return (val); -} - - -// Keil: function added to initialize Rx Descriptors -void rx_descr_init (void) -{ - unsigned int i; - - for (i = 0; i < NUM_RX_DESC; i++) { - RX_DESC_STAT(i) = OWN_BIT; - RX_DESC_CTRL(i) = ETH_FRAG_SIZE; - RX_BUFADDR(i) = RX_BUF(i); - if (i == (NUM_RX_DESC-1)) // Last Descriptor? - RX_DESC_CTRL(i) |= RX_END_RING; - } - - /* Set Starting address of RX Descriptor list */ - LPC_ETHERNET->DMA_REC_DES_ADDR = RX_DESC_BASE; -} - - -// Keil: function added to initialize Tx Descriptors -void tx_descr_init (void) -{ - unsigned int i; - - for (i = 0; i < NUM_TX_DESC; i++) { // Take it out!!!! - TX_DESC_STAT(i) = 0; - TX_DESC_CTRL(i) = 0; - TX_BUFADDR(i) = 0; - } - - for (i = 0; i < NUM_TX_DESC; i++) { - TX_DESC_STAT(i) = TX_LAST_SEGM | TX_FIRST_SEGM; - TX_DESC_CTRL(i) = 0; - TX_BUFADDR(i) = TX_BUF(i); - if (i == (NUM_TX_DESC-1)) // Last Descriptor? - TX_DESC_STAT(i) |= TX_END_RING; - } - - /* Set Starting address of RX Descriptor list */ - LPC_ETHERNET->DMA_TRANS_DES_ADDR = TX_DESC_BASE; -} - - - -// configure port-pins for use with LAN-controller, -// reset it and send the configuration-sequence - -void Init_EMAC(void) -{ - int id1, id2, tout, regv; - unsigned phy_in_use = 0; - - /* Ethernet pins configuration */ -#if MII - scu_pinmux(0xC ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_MDC: PC_1 -> FUNC3 - scu_pinmux(0x1 ,17 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_MDIO: P1_17 -> FUNC3 - scu_pinmux(0x1 ,18 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TXD0: P1_18 -> FUNC3 - scu_pinmux(0x1 ,20 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TXD1: P1_20 -> FUNC3 - scu_pinmux(0x1 ,19 , (MD_PLN | MD_EZI | MD_ZI), FUNC0); // ENET_REF: P1_19 -> FUNC0 (default) - -// scu_pinmux(0xC ,4 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TX_EN: PC_4 -> FUNC3 - scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC6); // ENET_TX_EN: P0_1 -> FUNC6 - - scu_pinmux(0x1 ,15 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_RXD0: P1_15 -> FUNC3 - scu_pinmux(0x0 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC2); // ENET_RXD1: P0_0 -> FUNC2 - -// scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_CRS: P1_16 -> FUNC3 - scu_pinmux(0x9 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); // ENET_CRS: P9_0 -> FUNC5 - -// scu_pinmux(0xC ,9 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_RX_ER: PC_9 -> FUNC3 - scu_pinmux(0x9 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); // ENET_RX_ER: P9_1 -> FUNC5 - -// scu_pinmux(0xC ,8 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_RXDV: PC_8 -> FUNC3 - scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC7); // ENET_RXDV: P1_16 -> FUNC7 - -#else - scu_pinmux(0xC ,1 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_MDC: PC_1 -> FUNC3 - scu_pinmux(0x1 ,17 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_MDIO: P1_17 -> FUNC3 - scu_pinmux(0x1 ,18 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TXD0: P1_18 -> FUNC3 - scu_pinmux(0x1 ,20 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TXD1: P1_20 -> FUNC3 - scu_pinmux(0x1 ,19 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC0); // ENET_REF: P1_19 -> FUNC0 (default) -// scu_pinmux(0xC ,4 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TX_EN: PC_4 -> FUNC3 - scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC6); // ENET_TX_EN: P0_1 -> FUNC6 - scu_pinmux(0x1 ,15 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_RXD0: P1_15 -> FUNC3 - scu_pinmux(0x0 ,0 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC2); // ENET_RXD1: P0_0 -> FUNC2 -// scu_pinmux(0x1 ,16 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_CRS: P1_16 -> FUNC3 -// scu_pinmux(0x9 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); // ENET_CRS: P9_0 -> FUNC5 -// scu_pinmux(0xC ,9 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_RX_ER: PC_9 -> FUNC3 -// scu_pinmux(0x9 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); // ENET_RX_ER: P9_1 -> FUNC5 -// scu_pinmux(0xC ,8 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_RXDV: PC_8 -> FUNC3 - scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC7); // ENET_RXDV: P1_16 -> FUNC7 -#endif - - -#if MII /* Select MII interface */ // check MUXING for new Eagle... -// scu_pinmux(0xC ,6 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_RXD2: PC_6 -> FUNC3 - scu_pinmux(0x9 ,3 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); // ENET_RXD2: P9_3 -> FUNC5 - -// scu_pinmux(0xC ,7 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_RXD3: PC_7 -> FUNC3 - scu_pinmux(0x9 ,2 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); // ENET_RXD3: P9_2 -> FUNC5 - - scu_pinmux(0xC ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_RXLK: PC_0 -> FUNC3 - -// scu_pinmux(0xC ,2 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TXD2: PC_2 -> FUNC3 - scu_pinmux(0x9 ,4 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); // ENET_TXD2: P9_4 -> FUNC5 - -// scu_pinmux(0xC ,3 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TXD3: PC_3 -> FUNC3 - scu_pinmux(0x9 ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); // ENET_TXD3: P9_5 -> FUNC5 - -// scu_pinmux(0xC ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TX_ER: PC_5 -> FUNC3 - scu_pinmux(0xC ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); // ENET_TX_ER: PC_5 -> FUNC3 - -// scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC2); // ENET_COL: P0_1 -> FUNC2 - scu_pinmux(0x9 ,6 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); // ENET_COL: P9_6 -> FUNC5 -#else /* Select RMII interface */ - LPC_CREG->CREG6 |= RMII_SELECT; -#endif - - - RGU_SoftReset(RGU_SIG_ETHERNET); - while(1){ // Confirm the reset happened - if (LPC_RGU->RESET_ACTIVE_STATUS0 & (1<<ETHERNET_RST)) - break; - } - - LPC_ETHERNET->DMA_BUS_MODE |= DMA_SOFT_RESET; // Reset all GMAC Subsystem internal registers and logic - while(LPC_ETHERNET->DMA_BUS_MODE & DMA_SOFT_RESET); // Wait for software reset completion - - /* Put the DP83848C in reset mode */ - write_PHY (PHY_REG_BMCR, PHY_BMCR_RESET); - - /* Wait for hardware reset to end. */ - for (tout = 0; tout < TIMEOUT; tout++) { - regv = read_PHY (PHY_REG_BMCR); - if (!(regv & PHY_BMCR_RESET)) { - /* Reset complete */ - break; - } - } - - /* Check if this is a DP83848C PHY. */ - id1 = read_PHY (PHY_REG_IDR1); - id2 = read_PHY (PHY_REG_IDR2); - if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID) { - phy_in_use = DP83848C_ID; - } - else if (((id1 << 16) | (id2 & 0xFFF0)) == LAN8720_ID) { - phy_in_use = LAN8720_ID; - } - - if (phy_in_use != 0) { - /* Configure the PHY device */ -#if !MII - write_PHY (PHY_REG_RBR, 0x20); -#endif - - /* Use autonegotiation about the link speed. */ - write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG); - /* Wait to complete Auto_Negotiation. */ - for (tout = 0; tout < TIMEOUT; tout++) { - regv = read_PHY (PHY_REG_BMSR); - if (regv & PHY_AUTO_NEG_DONE) { - /* Autonegotiation Complete. */ - break; - } - } - } - - - - /* Check the link status. */ - for (tout = 0; tout < TIMEOUT; tout++) { - regv = read_PHY (PHY_REG_STS); - if (regv & LINK_VALID_STS) { - /* Link is on. */ - break; - } - } - - // Configure the EMAC with the established parameters - switch (phy_in_use) { - case DP83848C_ID: - - /* Configure Full/Half Duplex mode. */ - if (regv & FULL_DUP_STS) { - /* Full duplex is enabled. */ - LPC_ETHERNET->MAC_CONFIG |= MAC_DUPMODE; - } - - /* Configure 100MBit/10MBit mode. */ - if (~(regv & SPEED_10M_STS)) { - /* 100MBit mode. */ - LPC_ETHERNET->MAC_CONFIG |= MAC_100MPS; - } - -// value = ReadFromPHY (PHY_REG_STS); /* PHY Extended Status Register */ -// // Now configure for full/half duplex mode -// if (value & 0x0004) { -// // We are in full duplex is enabled mode -// LPC_ETHERNET->MAC2 |= MAC2_FULL_DUP; -// LPC_ETHERNET->Command |= CR_FULL_DUP; -// LPC_ETHERNET->IPGT = IPGT_FULL_DUP; -// } -// else { -// // Otherwise we are in half duplex mode -// LPC_ETHERNET->IPGT = IPGT_HALF_DUP; -// } - -// // Now configure 100MBit or 10MBit mode -// if (value & 0x0002) { -// // 10MBit mode -// LPC_ETHERNET->SUPP = 0; -// } -// else { -// // 100MBit mode -// LPC_ETHERNET->SUPP = SUPP_SPEED; -// } - break; - - case LAN8720_ID: - - regv = read_PHY (PHY_REG_SCSR); /* PHY Extended Status Register */ - // Now configure for full/half duplex mode - if (regv & (1<<4)) { /* bit 4: 1 = Full Duplex, 0 = Half Duplex */ - // We are in full duplex is enabled mode - LPC_ETHERNET->MAC_CONFIG |= MAC_DUPMODE; - } - - // Now configure 100MBit or 10MBit mode - if (regv & (1<<3)) { /* bit 3: 1 = 100Mbps, 0 = 10Mbps */ - // 100MBit mode - LPC_ETHERNET->MAC_CONFIG |= MAC_100MPS; - } - - - break; - - } - - /* Set the Ethernet MAC Address registers */ - LPC_ETHERNET->MAC_ADDR0_HIGH = (MYMAC_6 << 8) | MYMAC_5; - LPC_ETHERNET->MAC_ADDR0_LOW = (MYMAC_4 << 24) | (MYMAC_3 << 16) | (MYMAC_2 << 8) | MYMAC_1; - - /* Initialize Descriptor Lists */ - rx_descr_init(); - tx_descr_init(); - - /* Configure Filter */ - LPC_ETHERNET->MAC_FRAME_FILTER = MAC_PROMISCUOUS | MAC_RECEIVEALL; - - /* Enable Receiver and Transmitter */ - LPC_ETHERNET->MAC_CONFIG |= (MAC_TX_ENABLE | MAC_RX_ENABLE); - - /* Enable interrupts */ - //LPC_ETHERNET->DMA_INT_EN = DMA_INT_NOR_SUM | DMA_INT_RECEIVE | DMA_INT_TRANSMIT; - - /* Start Transmission & Receive processes */ - LPC_ETHERNET->DMA_OP_MODE |= (DMA_SS_TRANSMIT | DMA_SS_RECEIVE ); - -} - - -// reads a word in little-endian byte order from RX_BUFFER - -unsigned short ReadFrame_EMAC(void) -{ - return (*rptr++); -} - - -// easyWEB internal function -// help function to swap the byte order of a WORD - -unsigned short SwapBytes(unsigned short Data) -{ - return (Data >> 8) | (Data << 8); -} - -// reads a word in big-endian byte order from RX_FRAME_PORT -// (useful to avoid permanent byte-swapping while reading -// TCP/IP-data) - -unsigned short ReadFrameBE_EMAC(void) -{ - unsigned short ReturnValue; - - ReturnValue = SwapBytes (*rptr++); - return (ReturnValue); -} - - -// copies bytes from frame port to MCU-memory -// NOTES: * an odd number of byte may only be transfered -// if the frame is read to the end! -// * MCU-memory MUST start at word-boundary - -void CopyFromFrame_EMAC(void *Dest, unsigned short Size) -{ - unsigned short * piDest; // Keil: Pointer added to correct expression - - piDest = Dest; // Keil: Line added - while (Size > 1) { - *piDest++ = ReadFrame_EMAC(); - Size -= 2; - } - - if (Size) { // check for leftover byte... - *(unsigned char *)piDest = (char)ReadFrame_EMAC();// the LAN-Controller will return 0 - } // for the highbyte -} - -// does a dummy read on frame-I/O-port -// NOTE: only an even number of bytes is read! - -void DummyReadFrame_EMAC(unsigned short Size) // discards an EVEN number of bytes -{ // from RX-fifo - while (Size > 1) { - ReadFrame_EMAC(); - Size -= 2; - } -} - -// Reads the length of the received ethernet frame and checks if the -// destination address is a broadcast message or not -// returns the frame length -unsigned short StartReadFrame(void) { - unsigned short RxLen; - - if ((RX_DESC_STAT(RxDescIndex) & OWN_BIT) == 0) { - RxLen = (RX_DESC_STAT(RxDescIndex) >> 16) & 0x03FFF; - rptr = (unsigned short *)RX_BUFADDR(RxDescIndex); - return(RxLen); - } - return 0; - -} - -void EndReadFrame(void) { - - RX_DESC_STAT(RxDescIndex) = OWN_BIT; - RxDescIndex++; - if (RxDescIndex == NUM_RX_DESC) - RxDescIndex = 0; -} - -unsigned int CheckFrameReceived(void) { // Packet received ? - - if ((RX_DESC_STAT(RxDescIndex) & OWN_BIT) == 0) - return(1); - else - return(0); -} - -// requests space in EMAC memory for storing an outgoing frame - -void RequestSend(unsigned short FrameSize) -{ - tptr = (unsigned short *)TX_BUFADDR(TxDescIndex); - TX_DESC_CTRL(TxDescIndex) = FrameSize; -} - -// check if ethernet controller is ready to accept the -// frame we want to send - -unsigned int Rdy4Tx(void) -{ - return (1); // the ethernet controller transmits much faster -} // than the CPU can load its buffers - - -// writes a word in little-endian byte order to TX_BUFFER -void WriteFrame_EMAC(unsigned short Data) -{ - *tptr++ = Data; -} - -// copies bytes from MCU-memory to frame port -// NOTES: * an odd number of byte may only be transfered -// if the frame is written to the end! -// * MCU-memory MUST start at word-boundary - -void CopyToFrame_EMAC(void *Source, unsigned int Size) -{ - unsigned short * piSource; -// unsigned int idx; - - piSource = Source; - Size = (Size + 1) & 0xFFFE; // round Size up to next even number - while (Size > 0) { - WriteFrame_EMAC(*piSource++); - Size -= 2; - } - TX_DESC_STAT(TxDescIndex) |= OWN_BIT; - LPC_ETHERNET->DMA_TRANS_POLL_DEMAND = 1; // Wake Up the DMA if it's in Suspended Mode - TxDescIndex++; - if (TxDescIndex == NUM_TX_DESC) - TxDescIndex = 0; -} - -#endif - diff --git a/hw/bsp/ea4357/emac.h b/hw/bsp/ea4357/emac.h deleted file mode 100644 index b9f0c3baa..000000000 --- a/hw/bsp/ea4357/emac.h +++ /dev/null @@ -1,157 +0,0 @@ -#ifndef __EMAC_H -#define __EMAC_H - - -/* Configuration */ - -/* Interface Selection */ -#define MII 0 // =0 RMII - =1 MII - -/* MAC Configuration */ -#define MYMAC_1 0x1EU /* our ethernet (MAC) address */ -#define MYMAC_2 0x30U /* (MUST be unique in LAN!) */ -#define MYMAC_3 0x6cU -#define MYMAC_4 0xa2U -#define MYMAC_5 0x45U -#define MYMAC_6 0x5eU - - -#define ETH_FRAG_SIZE 1536 -#define NUM_RX_DESC 3 -#define NUM_TX_DESC 3 - -/* End of Configuration */ - - -/* EMAC Descriptors and Buffers located in 16K SRAM */ -/* Rx Descriptors */ -#define RX_DESC_BASE 0x20008000 -#define RX_STAT_BASE RX_DESC_BASE -#define RX_CTRL_BASE (RX_STAT_BASE + 4) -#define RX_BUFADDR_BASE (RX_CTRL_BASE + 4) -#define RX_NEXTDESC_BASE (RX_BUFADDR_BASE + 4) -#define RX_BUF_BASE (RX_DESC_BASE + NUM_RX_DESC*16) - -#define RX_DESC_STAT(i) (*(unsigned int *)(RX_STAT_BASE + 16*i)) -#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_CTRL_BASE + 16*i)) -#define RX_BUFADDR(i) (*(unsigned int *)(RX_BUFADDR_BASE + 16*i)) -#define RX_NEXTDESC(i) (*(unsigned int *)(RX_NEXTDESC_BASE + 16*i)) -#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) - -/* Tx Descriptors */ -#define TX_DESC_BASE RX_BUF_BASE + (ETH_FRAG_SIZE * NUM_RX_DESC) -#define TX_STAT_BASE TX_DESC_BASE -#define TX_CTRL_BASE (TX_STAT_BASE + 4) -#define TX_BUFADDR_BASE (TX_CTRL_BASE + 4) -#define TX_NEXTDESC_BASE (TX_BUFADDR_BASE + 4) -#define TX_BUF_BASE (TX_DESC_BASE + NUM_TX_DESC*16) - -#define TX_DESC_STAT(i) (*(unsigned int *)(TX_STAT_BASE + 16*i)) -#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_CTRL_BASE + 16*i)) -#define TX_BUFADDR(i) (*(unsigned int *)(TX_BUFADDR_BASE + 16*i)) -#define TX_NEXTDESC(i) (*(unsigned int *)(TX_NEXTDESC_BASE + 16*i)) -#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) - -/* Descriptors Fields bits */ -#define OWN_BIT (1U<<31) /* Own bit in RDES0 & TDES0 */ -#define RX_END_RING (1<<15) /* Receive End of Ring bit in RDES1 */ -#define RX_NXTDESC_FLAG (1<<14) /* Second Address Chained bit in RDES1 */ -#define TX_LAST_SEGM (1<<29) /* Last Segment bit in TDES0 */ -#define TX_FIRST_SEGM (1<<28) /* First Segment bit in TDES0 */ -#define TX_END_RING (1<<21) /* Transmit End of Ring bit in TDES0 */ -#define TX_NXTDESC_FLAG (1<<20) /* Second Address Chained bit in TDES0 */ - - - - - -/* EMAC Control and Status bits */ -#define MAC_RX_ENABLE (1<<2) /* Receiver Enable in MAC_CONFIG reg */ -#define MAC_TX_ENABLE (1<<3) /* Transmitter Enable in MAC_CONFIG reg */ -#define MAC_PADCRC_STRIP (1<<7) /* Automatic Pad-CRC Stripping in MAC_CONFIG reg */ -#define MAC_DUPMODE (1<<11) /* Duplex Mode in MAC_CONFIG reg */ -#define MAC_100MPS (1<<14) /* Speed is 100Mbps in MAC_CONFIG reg */ -#define MAC_PROMISCUOUS (1U<<0) /* Promiscuous Mode bit in MAC_FRAME_FILTER reg */ -#define MAC_DIS_BROAD (1U<<5) /* Disable Broadcast Frames bit in MAC_FRAME_FILTER reg */ -#define MAC_RECEIVEALL (1U<<31) /* Receive All bit in MAC_FRAME_FILTER reg */ -#define DMA_SOFT_RESET 0x01 /* Software Reset bit in DMA_BUS_MODE reg */ -#define DMA_SS_RECEIVE (1<<1) /* Start/Stop Receive bit in DMA_OP_MODE reg */ -#define DMA_SS_TRANSMIT (1<<13) /* Start/Stop Transmission bit in DMA_OP_MODE reg */ -#define DMA_INT_TRANSMIT (1<<0) /* Transmit Interrupt Enable bit in DMA_INT_EN reg */ -#define DMA_INT_OVERFLOW (1<<4) /* Overflow Interrupt Enable bit in DMA_INT_EN reg */ -#define DMA_INT_UNDERFLW (1<<5) /* Underflow Interrupt Enable bit in DMA_INT_EN reg */ -#define DMA_INT_RECEIVE (1<<6) /* Receive Interrupt Enable bit in DMA_INT_EN reg */ -#define DMA_INT_ABN_SUM (1<<15) /* Abnormal Interrupt Summary Enable bit in DMA_INT_EN reg */ -#define DMA_INT_NOR_SUM (1<<16) /* Normal Interrupt Summary Enable bit in DMA_INT_EN reg */ - -/* MII Management Command Register */ -#define GMII_READ (0<<1) /* GMII Read PHY */ -#define GMII_WRITE (1<<1) /* GMII Write PHY */ -#define GMII_BUSY 0x00000001 /* GMII is Busy / Start Read/Write */ -#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ -#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ - -/* MII Management Address Register */ -#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ - -/* DP83848C PHY Registers */ -#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ -#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ -#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ -#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ -#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ -#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ -#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ -#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ - -/* PHY Extended Registers */ -#define PHY_REG_STS 0x10 /* Status Register */ -#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ -#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ -#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ -#define PHY_REG_RECR 0x15 /* Receive Error Counter */ -#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ -#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ -#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ -#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ -#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ -#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ -#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ - -/* PHY Control and Status bits */ -#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ -#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ -#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ -#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ -#define PHY_AUTO_NEG 0x1000 /* Select Auto Negotiation */ -#define PHY_AUTO_NEG_DONE 0x0020 /* AutoNegotiation Complete in BMSR PHY reg */ -#define PHY_BMCR_RESET 0x8000 /* Reset bit at BMCR PHY reg */ -#define LINK_VALID_STS 0x0001 /* Link Valid Status at REG_STS PHY reg */ -#define FULL_DUP_STS 0x0004 /* Full Duplex Status at REG_STS PHY reg */ -#define SPEED_10M_STS 0x0002 /* 10Mbps Status at REG_STS PHY reg */ - -#define DP83848C_DEF_ADR 0x01 /* Default PHY device address */ -#define DP83848C_ID 0x20005C90 /* PHY Identifier (without Rev. info */ - -#define LAN8720_ID 0x0007C0F0 /* PHY Identifier */ -#define PHY_REG_SCSR 0x1F /* PHY Special Control/Status Register */ - -/* Misc */ -#define ETHERNET_RST 22 /* Reset Output for EMAC at RGU */ -#define RMII_SELECT 0x04 /* Select RMII in EMACCFG */ - - -/* Prototypes */ -void Init_EMAC(void); -unsigned short ReadFrameBE_EMAC(void); -void CopyToFrame_EMAC(void *Source, unsigned int Size); -void CopyFromFrame_EMAC(void *Dest, unsigned short Size); -void DummyReadFrame_EMAC(unsigned short Size); -unsigned short StartReadFrame(void); -void EndReadFrame(void); -unsigned int CheckFrameReceived(void); -void RequestSend(unsigned short FrameSize); -unsigned int Rdy4Tx(void); - - -#endif diff --git a/hw/bsp/ea4357/nand.c b/hw/bsp/ea4357/nand.c deleted file mode 100644 index 21ec14fbe..000000000 --- a/hw/bsp/ea4357/nand.c +++ /dev/null @@ -1,546 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ - - -/****************************************************************************** - * Includes - *****************************************************************************/ -#include "../board.h" - -#if BOARD == BOARD_EA4357 - -#include "lpc_types.h" -#include "lpc43xx_scu.h" -#include "lpc43xx_timer.h" -#include "nand.h" - - -/****************************************************************************** - * Defines and typedefs - *****************************************************************************/ - -#define K9F1G_CLE ((volatile uint8_t *)0x1D100000) -#define K9F1G_ALE ((volatile uint8_t *)0x1D080000) -#define K9F1G_DATA ((volatile uint8_t *)0x1D000000) - -#define K9FXX_WAIT() - -#define K9FXX_READ_1 0x00 -#define K9FXX_READ_2 0x30 - -#define K9FXX_SET_ADDR_A 0x00 -#define K9FXX_SET_ADDR_B 0x01 -#define K9FXX_SET_ADDR_C 0x50 -#define K9FXX_READ_ID 0x90 -#define K9FXX_RESET 0xff -#define K9FXX_BLOCK_PROGRAM_1 0x80 -#define K9FXX_BLOCK_PROGRAM_2 0x10 -#define K9FXX_BLOCK_ERASE_1 0x60 -#define K9FXX_BLOCK_ERASE_2 0xd0 -#define K9FXX_READ_STATUS 0x70 -#define K9FXX_BUSY (1 << 6) -#define K9FXX_OK (1 << 0) - -#define ID_MARKER_CODE (0xEC) -#define ID_SAMSUNG (0xF1) - -#define ID_PAGE_SZ_1KB (0x00) -#define ID_PAGE_SZ_2KB (0x01) -#define ID_PAGE_SZ_4KB (0x02) -#define ID_PAGE_SZ_8KB (0x03) - -#define ID_BLOCK_SZ_64KB (0x00) -#define ID_BLOCK_SZ_128KB (0x01) -#define ID_BLOCK_SZ_256KB (0x02) -#define ID_BLOCK_SZ_512KB (0x03) - -#define ID_PAGE_SZ_1KB (0x00) -#define ID_PAGE_SZ_2KB (0x01) -#define ID_PAGE_SZ_4KB (0x02) -#define ID_PAGE_SZ_8KB (0x03) - -#define ID_REDUND_SZ_8 (0x00) -#define ID_REDUND_SZ_16 (0x01) - - - -/* This macro could be changed to check the ready pin */ -#define WAIT_READY() (TIM_Waitus(25)) - - -/****************************************************************************** - * External global variables - *****************************************************************************/ - -/****************************************************************************** - * Local variables - *****************************************************************************/ - -static uint32_t pageSize = 0; -static uint32_t blockSize = 0; -static uint32_t reduntSize = 0; - - -/****************************************************************************** - * Local Functions - *****************************************************************************/ - -static void pinConfig(void) -{ - /* Set up EMC pin */ - scu_pinmux( 2 , 9 , MD_PLN_FAST , 3 );//A0 - scu_pinmux( 2 , 10 , MD_PLN_FAST , 3 );//A1 - scu_pinmux( 2 , 11 , MD_PLN_FAST , 3 );//A2 - scu_pinmux( 2 , 12 , MD_PLN_FAST , 3 );//A3 - scu_pinmux( 2 , 13 , MD_PLN_FAST , 3 );//A4 - scu_pinmux( 1 , 0 , MD_PLN_FAST , 2 );//A5 - scu_pinmux( 1 , 1 , MD_PLN_FAST , 2 );//A6 - scu_pinmux( 1 , 2 , MD_PLN_FAST , 2 );//A7 - scu_pinmux( 2 , 8 , MD_PLN_FAST , 3 );//A8 - scu_pinmux( 2 , 7 , MD_PLN_FAST , 3 );//A9 - scu_pinmux( 2 , 6 , MD_PLN_FAST , 2 );//A10 - scu_pinmux( 2 , 2 , MD_PLN_FAST , 2 );//A11 - scu_pinmux( 2 , 1 , MD_PLN_FAST , 2 );//A12 - scu_pinmux( 2 , 0 , MD_PLN_FAST , 2 );//A13 - scu_pinmux( 6 , 8 , MD_PLN_FAST , 1 );//A14 - scu_pinmux( 6 , 7 , MD_PLN_FAST , 1 );//A15 - scu_pinmux( 13 , 16 , MD_PLN_FAST , 2 );//A16 - scu_pinmux( 13 , 15 , MD_PLN_FAST , 2 );//A17 - scu_pinmux( 14 , 0 , MD_PLN_FAST , 3 );//A18 - scu_pinmux( 14 , 1 , MD_PLN_FAST , 3 );//A19 - scu_pinmux( 14 , 2 , MD_PLN_FAST , 3 );//A20 - scu_pinmux( 14 , 3 , MD_PLN_FAST , 3 );//A21 - scu_pinmux( 14 , 4 , MD_PLN_FAST , 3 );//A22 - scu_pinmux( 10 , 4 , MD_PLN_FAST , 3 );//A23 - - scu_pinmux( 1 , 7 , MD_PLN_FAST , 3 );//D0 - scu_pinmux( 1 , 8 , MD_PLN_FAST , 3 );//D1 - scu_pinmux( 1 , 9 , MD_PLN_FAST , 3 );//D2 - scu_pinmux( 1 , 10 , MD_PLN_FAST , 3 );//D3 - scu_pinmux( 1 , 11 , MD_PLN_FAST , 3 );//D4 - scu_pinmux( 1 , 12 , MD_PLN_FAST , 3 );//D5 - scu_pinmux( 1 , 13 , MD_PLN_FAST , 3 );//D6 - scu_pinmux( 1 , 14 , MD_PLN_FAST , 3 );//D7 - scu_pinmux( 5 , 4 , MD_PLN_FAST , 2 );//D8 - scu_pinmux( 5 , 5 , MD_PLN_FAST , 2 );//D9 - scu_pinmux( 5 , 6 , MD_PLN_FAST , 2 );//D10 - scu_pinmux( 5 , 7 , MD_PLN_FAST , 2 );//D11 - scu_pinmux( 5 , 0 , MD_PLN_FAST , 2 );//D12 - scu_pinmux( 5 , 1 , MD_PLN_FAST , 2 );//D13 - scu_pinmux( 5 , 2 , MD_PLN_FAST , 2 );//D14 - scu_pinmux( 5 , 3 , MD_PLN_FAST , 2 );//D15 - scu_pinmux( 13 , 2 , MD_PLN_FAST , 2 );//D16 - scu_pinmux( 13 , 3 , MD_PLN_FAST , 2 );//D17 - scu_pinmux( 13 , 4 , MD_PLN_FAST , 2 );//D18 - scu_pinmux( 13 , 5 , MD_PLN_FAST , 2 );//D19 - scu_pinmux( 13 , 6 , MD_PLN_FAST , 2 );//D20 - scu_pinmux( 13 , 7 , MD_PLN_FAST , 2 );//D21 - scu_pinmux( 13 , 8 , MD_PLN_FAST , 2 );//D22 - scu_pinmux( 13 , 9 , MD_PLN_FAST , 2 );//D23 - scu_pinmux( 14 , 5 , MD_PLN_FAST , 3 );//D24 - scu_pinmux( 14 , 6 , MD_PLN_FAST , 3 );//D25 - scu_pinmux( 14 , 7 , MD_PLN_FAST , 3 );//D26 - scu_pinmux( 14 , 8 , MD_PLN_FAST , 3 );//D27 - scu_pinmux( 14 , 9 , MD_PLN_FAST , 3 );//D28 - scu_pinmux( 14 , 10 , MD_PLN_FAST , 3 );//D29 - scu_pinmux( 14 , 11 , MD_PLN_FAST , 3 );//D30 - scu_pinmux( 14 , 12 , MD_PLN_FAST , 3 );//D31 - - scu_pinmux( 1 , 3 , MD_PLN_FAST , 3 );//OE - scu_pinmux( 1 , 6 , MD_PLN_FAST , 3 );//WE - - scu_pinmux( 1 , 4 , MD_PLN_FAST , 3 );//BLS0 - scu_pinmux( 6 , 6 , MD_PLN_FAST , 1 );//BLS1 - scu_pinmux( 13 , 13 , MD_PLN_FAST , 2 );//BLS2 - scu_pinmux( 13 , 10 , MD_PLN_FAST , 2 );//BLS3 - - scu_pinmux( 1 , 5 , MD_PLN_FAST , 3 );//CS0 - scu_pinmux( 6 , 3 , MD_PLN_FAST , 3 );//CS1 - scu_pinmux( 13 , 12 , MD_PLN_FAST , 2 );//CS2 - scu_pinmux( 13 , 11 , MD_PLN_FAST , 2 );//CS3 -} - - -static uint32_t nandReadId(void) -{ - uint8_t a, b, c, d; - volatile uint8_t *pCLE; - volatile uint8_t *pALE; - volatile uint8_t *pData; - - pCLE = K9F1G_CLE; - pALE = K9F1G_ALE; - pData = K9F1G_DATA; - - *pCLE = K9FXX_READ_ID; - *pALE = 0; - - a = *pData; - b = *pData; - c = *pData; - d = *pData; - - - return (a << 24) | (b << 16) | (c << 8) | d; -} - -static uint8_t nandStatus(void) -{ - uint8_t status = 0; - volatile uint8_t *pCLE; - volatile uint8_t *pALE; - volatile uint8_t *pData; - - pCLE = K9F1G_CLE; - pALE = K9F1G_ALE; - pData = K9F1G_DATA; - - *pCLE = K9FXX_READ_STATUS; - *pALE = 0; - - status = *pData; - - /* remove bits not used */ - return (status & 0xC1); -} - -static void nandWaitReady(void) -{ - while( !(nandStatus() & (1<<6)) ); -} - -/****************************************************************************** - * Public Functions - *****************************************************************************/ - - - -/****************************************************************************** - * - * Description: - * Initialize the NAND Flash - * - * Returns: - * TRUE if initialization successful; otherwise FALSE - * - *****************************************************************************/ -uint32_t nand_init (void) -{ - uint32_t nandId = 0; - TIM_TIMERCFG_Type timerCfg; - -// LPC_SC->PCONP |= 0x00000800; - LPC_EMC->CONTROL = 0x00000001; - LPC_EMC->CONFIG = 0x00000000; - - pinConfig(); - - TIM_ConfigStructInit(TIM_TIMER_MODE, &timerCfg); - TIM_Init(LPC_TIMER0, TIM_TIMER_MODE, &timerCfg); - - LPC_EMC->STATICCONFIG1 = 0x00000080; - - LPC_EMC->STATICWAITWEN1 = 0x00000002; - LPC_EMC->STATICWAITOEN1 = 0x00000002; - LPC_EMC->STATICWAITRD1 = 0x00000008; - LPC_EMC->STATICWAITPAG1 = 0x0000001f; - LPC_EMC->STATICWAITWR1 = 0x00000008; - LPC_EMC->STATICWAITTURN1 = 0x0000000f; - - nandId = nandReadId(); - - if ((nandId & 0xffff0000) != - (((uint32_t)(ID_MARKER_CODE) << 24) | ID_SAMSUNG << 16)) { - /* unknown NAND chip */ - return FALSE; - } - - pageSize = 1024 * (1 << (nandId & 0x03)); - blockSize = 64*1024 * (1 << ((nandId>>4) & 0x03)); - reduntSize = 8 * (1 << ((nandId >> 1) & 0x1)); - - - return TRUE; -} - -/****************************************************************************** - * - * Description: - * Get the page size of the NAND flash - * - * Returns: - * page size in bytes - * - *****************************************************************************/ -uint32_t nand_getPageSize(void) -{ - return pageSize; -} - -/****************************************************************************** - * - * Description: - * Get the block size of the NAND flash - * - * Returns: - * block size in bytes - * - *****************************************************************************/ -uint32_t nand_getBlockSize(void) -{ - return blockSize; -} - -/****************************************************************************** - * - * Description: - * Get the redundant (spare) size per page - * - * Returns: - * redundant/spare size in bytes - * - *****************************************************************************/ -uint32_t nand_getRedundantSize(void) -{ - return reduntSize * (pageSize/512); -} - -/****************************************************************************** - * - * Description: - * Check if a block is valid - * - * Returns: - * TRUE if the block is valid; otherwise FALSE - * - *****************************************************************************/ -uint32_t nand_isBlockValid(uint32_t block) -{ - uint32_t addr = 0; - uint32_t page = 0; - - volatile uint8_t *pCLE; - volatile uint8_t *pALE; - volatile uint8_t *pData; - - - pCLE = K9F1G_CLE; - pALE = K9F1G_ALE; - pData = K9F1G_DATA; - - if (block >= NAND_NUM_BLOCKS) { - return FALSE; - } - - addr = block * (blockSize/pageSize); - - /* - * Check page 0 and page 1 in each block. If the first byte - * in the spare area (of either page 0 or page 1) is != 0xFF - * the block is invalid. - */ - - nandWaitReady(); - - for (page = 0; page < 2; page++) { - addr += page; - - *pCLE = K9FXX_READ_1; - *pALE = (uint8_t) (pageSize & 0x00FF); - *pALE = (uint8_t)((pageSize & 0xFF00) >> 8); - *pALE = (uint8_t)((addr & 0x00FF)); - *pALE = (uint8_t)((addr & 0xFF00) >> 8); - *pCLE = K9FXX_READ_2; - - WAIT_READY(); - - if (*pData != 0xFF) { - return FALSE; - } - - } - - return TRUE; -} - - -/****************************************************************************** - * - * Description: - * Read a page from the NAND memory - * - * Params: - * block - block number to read from - * page - page with�n block to read from - * pageBuf - data is copied to this buffer. The size must be at least - * pageSize. - * - * Returns: - * TRUE if read successful; otherwise FALSE - * - *****************************************************************************/ -uint32_t nand_readPage(uint32_t block, uint32_t page, uint8_t* pageBuf) -{ - uint32_t i = 0; - uint32_t addr = 0; - - volatile uint8_t *pCLE; - volatile uint8_t *pALE; - volatile uint8_t *pData; - - - pCLE = K9F1G_CLE; - pALE = K9F1G_ALE; - pData = K9F1G_DATA; - - if (block >= NAND_NUM_BLOCKS) { - return FALSE; - } - - if (page >= blockSize/pageSize) { - return FALSE; - } - - addr = block * (blockSize/pageSize) + page; - - /* - * Always reading from start of a page address. - * This means that the column address is always 0. - */ - - *pCLE = K9FXX_READ_1; - *pALE = 0; - *pALE = 0; - *pALE = (uint8_t)((addr & 0x00FF)); - *pALE = (uint8_t)((addr & 0xFF00) >> 8); - *pCLE = K9FXX_READ_2; - - WAIT_READY(); - - - for (i = 0; i < pageSize; i++) { - *pageBuf++ = *pData; - } - - - return TRUE; -} - -/****************************************************************************** - * - * Description: - * Write a page of data to the NAND memory - * - * Params: - * block - block number to write to - * page - page within block to write to - * pageBuf - data is copied from this buffer. The size must be at least - * pageSize. - * - * Returns: - * TRUE if write successful; otherwise FALSE - * - *****************************************************************************/ -uint32_t nand_writePage(uint32_t block, uint32_t page, uint8_t* pageBuf) -{ - uint32_t i = 0; - uint32_t addr = 0; - - volatile uint8_t *pCLE; - volatile uint8_t *pALE; - volatile uint8_t *pData; - - - pCLE = K9F1G_CLE; - pALE = K9F1G_ALE; - pData = K9F1G_DATA; - - if (block >= NAND_NUM_BLOCKS) { - return FALSE; - } - - if (page >= blockSize/pageSize) { - return FALSE; - } - - addr = block * (blockSize/pageSize) + page; - - /* - * Always writing to start of a page address. - * This means that the column address is always 0. - */ - - *pCLE = K9FXX_BLOCK_PROGRAM_1; - *pALE = 0; - *pALE = 0; - *pALE = (uint8_t)((addr & 0x00FF)); - *pALE = (uint8_t)((addr & 0xFF00) >> 8); - - - for (i = 0; i < pageSize; i++) { - *pData = *pageBuf++; - } - - *pCLE = K9FXX_BLOCK_PROGRAM_2; - - TIM_Waitus(700); - nandWaitReady(); - - return ((nandStatus() & 0x01) != 0x01); -} - -/****************************************************************************** - * - * Description: - * Erase a block - * - * Params: - * block - block number to erase - * - * Returns: - * TRUE if eras successful; otherwise FALSE - * - *****************************************************************************/ -uint32_t nand_eraseBlock(uint32_t block) -{ - uint32_t addr = 0; - - volatile uint8_t *pCLE; - volatile uint8_t *pALE; - - pCLE = K9F1G_CLE; - pALE = K9F1G_ALE; - - if (block >= NAND_NUM_BLOCKS) { - return FALSE; - } - - addr = block * (blockSize/pageSize); - - *pCLE = K9FXX_BLOCK_ERASE_1; - *pALE = (uint8_t)(addr & 0x00FF); - *pALE = (uint8_t)((addr & 0xFF00) >> 8); - *pCLE = K9FXX_BLOCK_ERASE_2; - - TIM_Waitus(700); - nandWaitReady(); - - return ((nandStatus() & 0x01) != 0x01); -} - -#endif diff --git a/hw/bsp/ea4357/nand.h b/hw/bsp/ea4357/nand.h deleted file mode 100644 index 693c67478..000000000 --- a/hw/bsp/ea4357/nand.h +++ /dev/null @@ -1,36 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ -#ifndef __NAND_H -#define __NAND_H - -#define NAND_NUM_BLOCKS (1024) - -extern uint32_t nand_init (void); -extern uint32_t nand_getPageSize(void); -extern uint32_t nand_getBlockSize(void); -extern uint32_t nand_getRedundantSize(void); -extern uint32_t nand_isBlockValid(uint32_t blockNum); -uint32_t nand_readPage(uint32_t block, uint32_t page, uint8_t* pageBuf); -uint32_t nand_writePage(uint32_t block, uint32_t page, uint8_t* pageBuf); -uint32_t nand_eraseBlock(uint32_t block); - - -#endif /* end __NAND_H */ -/**************************************************************************** -** End Of File -*****************************************************************************/ diff --git a/hw/bsp/ea4357/oem_base_board/acc.c b/hw/bsp/ea4357/oem_base_board/acc.c deleted file mode 100644 index a53634980..000000000 --- a/hw/bsp/ea4357/oem_base_board/acc.c +++ /dev/null @@ -1,254 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ - - - -/****************************************************************************** - * Includes - *****************************************************************************/ -#include "../../board.h" - -#if BOARD == BOARD_EA4357 - -#include "lpc_types.h" -#include "lpc43xx_i2c.h" -#include "acc.h" - -/****************************************************************************** - * Defines and typedefs - *****************************************************************************/ -#define I2C_PORT (LPC_I2C0) - -#define ACC_I2C_ADDR (0x1D) - -#define ACC_ADDR_XOUTL 0x00 -#define ACC_ADDR_XOUTH 0x01 -#define ACC_ADDR_YOUTL 0x02 -#define ACC_ADDR_YOUTX 0x03 -#define ACC_ADDR_ZOUTL 0x04 -#define ACC_ADDR_ZOUTH 0x05 -#define ACC_ADDR_XOUT8 0x06 -#define ACC_ADDR_YOUT8 0x07 -#define ACC_ADDR_ZOUT8 0x08 -#define ACC_ADDR_STATUS 0x09 -#define ACC_ADDR_DETSRC 0x0A -#define ACC_ADDR_TOUT 0x0B -#define ACC_ADDR_I2CAD 0x0D -#define ACC_ADDR_USRINF 0x0E -#define ACC_ADDR_WHOAMI 0x0F -#define ACC_ADDR_XOFFL 0x10 -#define ACC_ADDR_XOFFH 0x11 -#define ACC_ADDR_YOFFL 0x12 -#define ACC_ADDR_YOFFH 0x13 -#define ACC_ADDR_ZOFFL 0x14 -#define ACC_ADDR_ZOFFH 0x15 -#define ACC_ADDR_MCTL 0x16 -#define ACC_ADDR_INTRST 0x17 -#define ACC_ADDR_CTL1 0x18 -#define ACC_ADDR_CTL2 0x19 -#define ACC_ADDR_LDTH 0x1A -#define ACC_ADDR_PDTH 0x1B -#define ACC_ADDR_PW 0x1C -#define ACC_ADDR_LT 0x1D -#define ACC_ADDR_TW 0x1E - -#define ACC_MCTL_MODE(m) ((m) << 0) -#define ACC_MCTL_GLVL(g) ((g) << 2) - - -#define ACC_STATUS_DRDY 0x01 -#define ACC_STATUS_DOVR 0x02 -#define ACC_STATUS_PERR 0x04 - - -/****************************************************************************** - * External global variables - *****************************************************************************/ - -/****************************************************************************** - * Local variables - *****************************************************************************/ - -static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len) -{ - I2C_M_SETUP_Type i2cData; - - i2cData.sl_addr7bit = addr; - i2cData.tx_data = buf; - i2cData.tx_length = len; - i2cData.rx_data = NULL; - i2cData.rx_length = 0; - i2cData.retransmissions_max = 3; - - return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING); -} - -static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len) -{ - I2C_M_SETUP_Type i2cData; - - i2cData.sl_addr7bit = addr; - i2cData.tx_data = NULL; - i2cData.tx_length = 0; - i2cData.rx_data = buf; - i2cData.rx_length = len; - i2cData.retransmissions_max = 3; - - return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING); -} - - -static uint8_t getStatus(void) -{ - uint8_t buf[1]; - - buf[0] = ACC_ADDR_STATUS; - I2CWrite(ACC_I2C_ADDR, buf, 1); - I2CRead(ACC_I2C_ADDR, buf, 1); - - return buf[0]; -} - -static uint8_t getModeControl(void) -{ - uint8_t buf[1]; - - buf[0] = ACC_ADDR_MCTL; - I2CWrite(ACC_I2C_ADDR, buf, 1); - I2CRead(ACC_I2C_ADDR, buf, 1); - - return buf[0]; -} - -static void setModeControl(uint8_t mctl) -{ - uint8_t buf[2]; - - buf[0] = ACC_ADDR_MCTL; - buf[1] = mctl; - I2CWrite(ACC_I2C_ADDR, buf, 2); -} - -/****************************************************************************** - * Local Functions - *****************************************************************************/ - -/****************************************************************************** - * Public Functions - *****************************************************************************/ - -/****************************************************************************** - * - * Description: - * Initialize the ISL29003 Device - * - *****************************************************************************/ -void acc_init (void) -{ - - /* set to measurement mode by default */ - - setModeControl( (ACC_MCTL_MODE(ACC_MODE_MEASURE) - | ACC_MCTL_GLVL(ACC_RANGE_2G) )); - -} - -/****************************************************************************** - * - * Description: - * Read accelerometer data - * - * Params: - * [out] x - read x value - * [out] y - read y value - * [out] z - read z value - * - *****************************************************************************/ -void acc_read (int8_t *x, int8_t *y, int8_t *z) -{ - uint8_t buf[1]; - - /* wait for ready flag */ - while ((getStatus() & ACC_STATUS_DRDY) == 0); - - /* - * Have experienced problems reading all registers - * at once. Change to reading them one-by-one. - */ - buf[0] = ACC_ADDR_XOUT8; - I2CWrite(ACC_I2C_ADDR, buf, 1); - I2CRead(ACC_I2C_ADDR, buf, 1); - - *x = (int8_t)buf[0]; - - buf[0] = ACC_ADDR_YOUT8; - I2CWrite(ACC_I2C_ADDR, buf, 1); - I2CRead(ACC_I2C_ADDR, buf, 1); - - *y = (int8_t)buf[0]; - - buf[0] = ACC_ADDR_ZOUT8; - I2CWrite(ACC_I2C_ADDR, buf, 1); - I2CRead(ACC_I2C_ADDR, buf, 1); - - *z = (int8_t)buf[0]; -} - -/****************************************************************************** - * - * Description: - * Set the g-Range - * - * Params: - * [in] range - the g-Range - * - *****************************************************************************/ -void acc_setRange(acc_range_t range) -{ - uint8_t mctl = 0; - - mctl = getModeControl(); - - mctl &= ~(0x03 << 2); - mctl |= ACC_MCTL_GLVL(range); - - setModeControl(mctl); -} - -/****************************************************************************** - * - * Description: - * Set sensor mode - * - * Params: - * [in] mode - the mode to set - * - *****************************************************************************/ -void acc_setMode(acc_mode_t mode) -{ - uint8_t mctl = 0; - - mctl = getModeControl(); - - mctl &= ~(0x03 << 0); - mctl |= ACC_MCTL_MODE(mode); - - setModeControl(mctl); -} - -#endif diff --git a/hw/bsp/ea4357/oem_base_board/acc.h b/hw/bsp/ea4357/oem_base_board/acc.h deleted file mode 100644 index 3a739e0b0..000000000 --- a/hw/bsp/ea4357/oem_base_board/acc.h +++ /dev/null @@ -1,49 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ -#ifndef __ACC_H -#define __ACC_H - - -typedef enum -{ - ACC_MODE_STANDBY, - ACC_MODE_MEASURE, - ACC_MODE_LEVEL, /* level detection */ - ACC_MODE_PULSE, /* pulse detection */ -} acc_mode_t; - -typedef enum -{ - ACC_RANGE_8G, - ACC_RANGE_2G, - ACC_RANGE_4G, -} acc_range_t; - - -void acc_init (void); - -void acc_read (int8_t *x, int8_t *y, int8_t *z); -void acc_setRange(acc_range_t range); -void acc_setMode(acc_mode_t mode); - - - -#endif /* end __LIGHT_H */ -/**************************************************************************** -** End Of File -*****************************************************************************/ diff --git a/hw/bsp/ea4357/oem_base_board/base_eeprom.c b/hw/bsp/ea4357/oem_base_board/base_eeprom.c deleted file mode 100644 index 7571744a6..000000000 --- a/hw/bsp/ea4357/oem_base_board/base_eeprom.c +++ /dev/null @@ -1,200 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ - -/* - * NOTE: I2C must have been initialized before calling any functions in this - * file. - */ - -/****************************************************************************** - * Includes - *****************************************************************************/ -#include "../../board.h" - -#if BOARD == BOARD_EA4357 - -#include <string.h> -#include <stdio.h> -#include "lpc_types.h" -#include "lpc43xx_i2c.h" -#include "base_eeprom.h" - -/****************************************************************************** - * Defines and typedefs - *****************************************************************************/ - -#define I2C_PORT (LPC_I2C0) - -#ifndef MIN -#define MIN(x, y) ((x) < (y) ? (x) : (y)) -#endif - -#define EEPROM_I2C_ADDR (0x57) - -#define EEPROM_PAGE_SIZE 32 - - -/****************************************************************************** - * External global variables - *****************************************************************************/ - -/****************************************************************************** - * Local variables - *****************************************************************************/ - - -/****************************************************************************** - * Local Functions - *****************************************************************************/ - -static void eepromDelay(void) -{ - volatile int i = 0; - for (i = 0; i <0x20000; i++); -} - -static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len) -{ - I2C_M_SETUP_Type i2cData; - - i2cData.sl_addr7bit = addr; - i2cData.tx_data = buf; - i2cData.tx_length = len; - i2cData.rx_data = NULL; - i2cData.rx_length = 0; - i2cData.retransmissions_max = 3; - - return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING); -} - -static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len) -{ - I2C_M_SETUP_Type i2cData; - - i2cData.sl_addr7bit = addr; - i2cData.tx_data = NULL; - i2cData.tx_length = 0; - i2cData.rx_data = buf; - i2cData.rx_length = len; - i2cData.retransmissions_max = 3; - - return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING); -} - -/****************************************************************************** - * Public Functions - *****************************************************************************/ - -/****************************************************************************** - * - * Description: - * Initialize the EEPROM Driver - * - *****************************************************************************/ -void base_eeprom_init (void) -{ - I2C_Cmd(I2C_PORT, ENABLE); -} - -/****************************************************************************** - * - * Description: - * Read from the EEPROM - * - * Params: - * [in] buf - read buffer - * [in] offset - offset to start to read from - * [in] len - number of bytes to read - * - * Returns: - * number of read bytes or -1 in case of an error - * - *****************************************************************************/ -int16_t base_eeprom_read(uint8_t* buf, uint16_t offset, uint16_t len) -{ - uint8_t addr = 0; - int i = 0; - uint8_t off[2]; - - if (len > BASE_EEPROM_TOTAL_SIZE || offset+len > BASE_EEPROM_TOTAL_SIZE) { - return -1; - } - - addr = EEPROM_I2C_ADDR; - off[0] = ((offset >> 8) & 0xff); - off[1] = (offset & 0xff); - - I2CWrite((addr << 1), off, 2); - for ( i = 0; i < 0x2000; i++); - I2CRead((addr << 1), buf, len); - - return len; - -} - -/****************************************************************************** - * - * Description: - * Write to the EEPROM - * - * Params: - * [in] buf - data to write - * [in] offset - offset to start to write to - * [in] len - number of bytes to write - * - * Returns: - * number of written bytes or -1 in case of an error - * - *****************************************************************************/ -int16_t base_eeprom_write(uint8_t* buf, uint16_t offset, uint16_t len) -{ - uint8_t addr = 0; - int16_t written = 0; - uint16_t wLen = 0; - uint16_t off = offset; - uint8_t tmp[EEPROM_PAGE_SIZE+2]; - - if (len > BASE_EEPROM_TOTAL_SIZE || offset+len > BASE_EEPROM_TOTAL_SIZE) { - return -1; - } - - addr = EEPROM_I2C_ADDR; - - wLen = EEPROM_PAGE_SIZE - (off % EEPROM_PAGE_SIZE); - wLen = MIN(wLen, len); - - while (len) { - tmp[0] = ((off >> 8) & 0xff); - tmp[1] = (off & 0xff); - memcpy(&tmp[2], (void*)&buf[written], wLen); - I2CWrite((addr << 1), tmp, wLen+2); - - /* delay to wait for a write cycle */ - eepromDelay(); - - len -= wLen; - written += wLen; - off += wLen; - - wLen = MIN(EEPROM_PAGE_SIZE, len); - } - - return written; -} - -#endif diff --git a/hw/bsp/ea4357/oem_base_board/base_eeprom.h b/hw/bsp/ea4357/oem_base_board/base_eeprom.h deleted file mode 100644 index 0d7023093..000000000 --- a/hw/bsp/ea4357/oem_base_board/base_eeprom.h +++ /dev/null @@ -1,31 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ -#ifndef __BASE_EEPROM_H -#define __BASE_EEPROM_H - -#define BASE_EEPROM_TOTAL_SIZE 8192 - -void base_eeprom_init (void); -int16_t base_eeprom_read(uint8_t* buf, uint16_t offset, uint16_t len); -int16_t base_eeprom_write(uint8_t* buf, uint16_t offset, uint16_t len); - - -#endif /* end __BASE_EEPROM_H */ -/**************************************************************************** -** End Of File -*****************************************************************************/ diff --git a/hw/bsp/ea4357/oem_base_board/lm75a.c b/hw/bsp/ea4357/oem_base_board/lm75a.c deleted file mode 100644 index db8234405..000000000 --- a/hw/bsp/ea4357/oem_base_board/lm75a.c +++ /dev/null @@ -1,132 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ - -/* - * NOTE: I2C must have been initialized before calling any functions in this - * file. - */ - -/****************************************************************************** - * Includes - *****************************************************************************/ -#include "../../board.h" - -#if BOARD == BOARD_EA4357 - -#include <string.h> -#include <stdio.h> -#include "lpc_types.h" -#include "lpc43xx_i2c.h" - - -/****************************************************************************** - * Defines and typedefs - *****************************************************************************/ - -#define I2C_PORT (LPC_I2C0) - -#define LM75A_I2C_ADDR (0x48) - -#define LM75A_CMD_TEMP 0x00 - -#define I2CDEV LPC_I2C2 - - -/****************************************************************************** - * External global variables - *****************************************************************************/ - -/****************************************************************************** - * Local variables - *****************************************************************************/ - - -/****************************************************************************** - * Local Functions - *****************************************************************************/ -static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len) -{ - I2C_M_SETUP_Type i2cData; - - i2cData.sl_addr7bit = addr; - i2cData.tx_data = buf; - i2cData.tx_length = len; - i2cData.rx_data = NULL; - i2cData.rx_length = 0; - i2cData.retransmissions_max = 3; - - return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING); -} - -static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len) -{ - I2C_M_SETUP_Type i2cData; - - i2cData.sl_addr7bit = addr; - i2cData.tx_data = NULL; - i2cData.tx_length = 0; - i2cData.rx_data = buf; - i2cData.rx_length = len; - i2cData.retransmissions_max = 3; - - return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING); -} - -/****************************************************************************** - * Public Functions - *****************************************************************************/ - -/****************************************************************************** - * - * Description: - * Initialize the EEPROM Driver - * - *****************************************************************************/ -void lm75a_init (void) -{ - -} - -/****************************************************************************** - * - * Description: - * Read the temperature - * - * Params: None - * - * Returns: - * The measured temperature x 100, i.e. 26.50 degrees returned as 2650 - * - *****************************************************************************/ -int32_t lm75a_readTemp(void) -{ - uint8_t temp[2]; - int16_t t = 0; - - I2CWrite(LM75A_I2C_ADDR, LM75A_CMD_TEMP, 1); - I2CRead(LM75A_I2C_ADDR, temp, 2); - - /* 11 MSB bits used. Celcius is calculated as Temp data * 1/8 */ - t = ((temp[0] << 8) | (temp[1])); - - return ((t * 100) >> 8); - -} - - -#endif diff --git a/hw/bsp/ea4357/oem_base_board/lm75a.h b/hw/bsp/ea4357/oem_base_board/lm75a.h deleted file mode 100644 index 0ed6c8dfe..000000000 --- a/hw/bsp/ea4357/oem_base_board/lm75a.h +++ /dev/null @@ -1,29 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ -#ifndef __LM75A_H -#define __LM75A_H - - -void lm75a_init (void); -int32_t lm75a_readTemp(void); - - -#endif /* end __LM75A_H */ -/**************************************************************************** -** End Of File -*****************************************************************************/ diff --git a/hw/bsp/ea4357/oem_base_board/memreg.c b/hw/bsp/ea4357/oem_base_board/memreg.c deleted file mode 100644 index 51bcada4b..000000000 --- a/hw/bsp/ea4357/oem_base_board/memreg.c +++ /dev/null @@ -1,174 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ - - - -/****************************************************************************** - * Includes - *****************************************************************************/ -#include "../../board.h" - -#if BOARD == BOARD_EA4357 - -#include "LPC43xx.h" -#include "lpc_types.h" -#include "lpc43xx_scu.h" -#include "memreg.h" - - -/****************************************************************************** - * Defines and typedefs - *****************************************************************************/ - - -/****************************************************************************** - * External global variables - *****************************************************************************/ - -/****************************************************************************** - * Local variables - *****************************************************************************/ - -static void pinConfig(void) -{ - /* Set up EMC pin */ - scu_pinmux( 2 , 9 , MD_PLN_FAST , 3 );//A0 - scu_pinmux( 2 , 10 , MD_PLN_FAST , 3 );//A1 - scu_pinmux( 2 , 11 , MD_PLN_FAST , 3 );//A2 - scu_pinmux( 2 , 12 , MD_PLN_FAST , 3 );//A3 - scu_pinmux( 2 , 13 , MD_PLN_FAST , 3 );//A4 - scu_pinmux( 1 , 0 , MD_PLN_FAST , 2 );//A5 - scu_pinmux( 1 , 1 , MD_PLN_FAST , 2 );//A6 - scu_pinmux( 1 , 2 , MD_PLN_FAST , 2 );//A7 - scu_pinmux( 2 , 8 , MD_PLN_FAST , 3 );//A8 - scu_pinmux( 2 , 7 , MD_PLN_FAST , 3 );//A9 - scu_pinmux( 2 , 6 , MD_PLN_FAST , 2 );//A10 - scu_pinmux( 2 , 2 , MD_PLN_FAST , 2 );//A11 - scu_pinmux( 2 , 1 , MD_PLN_FAST , 2 );//A12 - scu_pinmux( 2 , 0 , MD_PLN_FAST , 2 );//A13 - scu_pinmux( 6 , 8 , MD_PLN_FAST , 1 );//A14 - scu_pinmux( 6 , 7 , MD_PLN_FAST , 1 );//A15 - scu_pinmux( 13 , 16 , MD_PLN_FAST , 2 );//A16 - scu_pinmux( 13 , 15 , MD_PLN_FAST , 2 );//A17 - scu_pinmux( 14 , 0 , MD_PLN_FAST , 3 );//A18 - scu_pinmux( 14 , 1 , MD_PLN_FAST , 3 );//A19 - scu_pinmux( 14 , 2 , MD_PLN_FAST , 3 );//A20 - scu_pinmux( 14 , 3 , MD_PLN_FAST , 3 );//A21 - scu_pinmux( 14 , 4 , MD_PLN_FAST , 3 );//A22 - scu_pinmux( 10 , 4 , MD_PLN_FAST , 3 );//A23 - - scu_pinmux( 1 , 7 , MD_PLN_FAST , 3 );//D0 - scu_pinmux( 1 , 8 , MD_PLN_FAST , 3 );//D1 - scu_pinmux( 1 , 9 , MD_PLN_FAST , 3 );//D2 - scu_pinmux( 1 , 10 , MD_PLN_FAST , 3 );//D3 - scu_pinmux( 1 , 11 , MD_PLN_FAST , 3 );//D4 - scu_pinmux( 1 , 12 , MD_PLN_FAST , 3 );//D5 - scu_pinmux( 1 , 13 , MD_PLN_FAST , 3 );//D6 - scu_pinmux( 1 , 14 , MD_PLN_FAST , 3 );//D7 - scu_pinmux( 5 , 4 , MD_PLN_FAST , 2 );//D8 - scu_pinmux( 5 , 5 , MD_PLN_FAST , 2 );//D9 - scu_pinmux( 5 , 6 , MD_PLN_FAST , 2 );//D10 - scu_pinmux( 5 , 7 , MD_PLN_FAST , 2 );//D11 - scu_pinmux( 5 , 0 , MD_PLN_FAST , 2 );//D12 - scu_pinmux( 5 , 1 , MD_PLN_FAST , 2 );//D13 - scu_pinmux( 5 , 2 , MD_PLN_FAST , 2 );//D14 - scu_pinmux( 5 , 3 , MD_PLN_FAST , 2 );//D15 - scu_pinmux( 13 , 2 , MD_PLN_FAST , 2 );//D16 - scu_pinmux( 13 , 3 , MD_PLN_FAST , 2 );//D17 - scu_pinmux( 13 , 4 , MD_PLN_FAST , 2 );//D18 - scu_pinmux( 13 , 5 , MD_PLN_FAST , 2 );//D19 - scu_pinmux( 13 , 6 , MD_PLN_FAST , 2 );//D20 - scu_pinmux( 13 , 7 , MD_PLN_FAST , 2 );//D21 - scu_pinmux( 13 , 8 , MD_PLN_FAST , 2 );//D22 - scu_pinmux( 13 , 9 , MD_PLN_FAST , 2 );//D23 - scu_pinmux( 14 , 5 , MD_PLN_FAST , 3 );//D24 - scu_pinmux( 14 , 6 , MD_PLN_FAST , 3 );//D25 - scu_pinmux( 14 , 7 , MD_PLN_FAST , 3 );//D26 - scu_pinmux( 14 , 8 , MD_PLN_FAST , 3 );//D27 - scu_pinmux( 14 , 9 , MD_PLN_FAST , 3 );//D28 - scu_pinmux( 14 , 10 , MD_PLN_FAST , 3 );//D29 - scu_pinmux( 14 , 11 , MD_PLN_FAST , 3 );//D30 - scu_pinmux( 14 , 12 , MD_PLN_FAST , 3 );//D31 - - scu_pinmux( 1 , 3 , MD_PLN_FAST , 3 );//OE - scu_pinmux( 1 , 6 , MD_PLN_FAST , 3 );//WE - - scu_pinmux( 1 , 4 , MD_PLN_FAST , 3 );//BLS0 - scu_pinmux( 6 , 6 , MD_PLN_FAST , 1 );//BLS1 - scu_pinmux( 13 , 13 , MD_PLN_FAST , 2 );//BLS2 - scu_pinmux( 13 , 10 , MD_PLN_FAST , 2 );//BLS3 - - scu_pinmux( 1 , 5 , MD_PLN_FAST , 3 );//CS0 - scu_pinmux( 6 , 3 , MD_PLN_FAST , 3 );//CS1 - scu_pinmux( 13 , 12 , MD_PLN_FAST , 2 );//CS2 - scu_pinmux( 13 , 11 , MD_PLN_FAST , 2 );//CS3 - - scu_pinmux( 6 , 4 , MD_PLN_FAST , 3 );//CAS - scu_pinmux( 6 , 5 , MD_PLN_FAST , 3 );//RAS - - scu_pinmux( 6 , 9 , MD_PLN_FAST , 3 );//DYCS0 - scu_pinmux( 6 , 1 , MD_PLN_FAST , 1 );//DYCS1 - scu_pinmux( 13 , 14 , MD_PLN_FAST , 2 );//DYCS2 - scu_pinmux( 15 , 14 , MD_PLN_FAST , 3 );//DYCS3 - - scu_pinmux( 6 , 11 , MD_PLN_FAST , 3 );//CKEOUT0 - scu_pinmux( 6 , 2 , MD_PLN_FAST , 1 );//CKEOUT1 - scu_pinmux( 13 , 1 , MD_PLN_FAST , 2 );//CKEOUT2 - scu_pinmux( 14 , 15 , MD_PLN_FAST , 3 );//CKEOUT3 - - scu_pinmux( 6 , 12 , MD_PLN_FAST , 3 );//DQMOUT0 - scu_pinmux( 6 , 10 , MD_PLN_FAST , 3 );//DQMOUT1 - scu_pinmux( 13 , 0 , MD_PLN_FAST , 2 );//DQMOUT2 - scu_pinmux( 14 , 13 , MD_PLN_FAST , 3 );//DQMOUT3 -} - - - -/****************************************************************************** - * Local Functions - *****************************************************************************/ - - - -/****************************************************************************** - * Public Functions - *****************************************************************************/ - - - -/****************************************************************************** - * - * Description: - * Initialize the NOR Flash - * - *****************************************************************************/ -uint32_t memreg_init (void) -{ - LPC_EMC->CONTROL = 0x00000001; - LPC_EMC->CONFIG = 0x00000000; - - pinConfig(); - - // Setup for 16-bit access - LPC_EMC->STATICCONFIG2 = 0x00000001; - - return FALSE; -} - -#endif - diff --git a/hw/bsp/ea4357/oem_base_board/memreg.h b/hw/bsp/ea4357/oem_base_board/memreg.h deleted file mode 100644 index e9ef85f03..000000000 --- a/hw/bsp/ea4357/oem_base_board/memreg.h +++ /dev/null @@ -1,30 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ -#ifndef __MEMREG_H -#define __MEMREG_H - -#define MEMREG_BASE 0x1e000000 - - -extern uint32_t memreg_init (void); - - -#endif /* end __MEMREG_H */ -/**************************************************************************** -** End Of File -*****************************************************************************/ diff --git a/hw/bsp/ea4357/oem_base_board/norflash.c b/hw/bsp/ea4357/oem_base_board/norflash.c deleted file mode 100644 index 0baf62c49..000000000 --- a/hw/bsp/ea4357/oem_base_board/norflash.c +++ /dev/null @@ -1,547 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ - - - -/****************************************************************************** - * Includes - *****************************************************************************/ -#include "../../board.h" - -#if BOARD == BOARD_EA4357 - -#include "lpc_types.h" -#include "lpc43xx_scu.h" -#include "lpc43xx_timer.h" -#include "norflash.h" - - -/****************************************************************************** - * Defines and typedefs - *****************************************************************************/ - -#define CMD_SWID 0x90 -#define CMD_CFI_QRY 0x98 -#define CMD_ID_EXIT 0xF0 - -#define CMD_ERASE_BLOCK 0x0050 -#define CMD_ERASE_SECTOR 0x0030 -#define CMD_ERASE_CHIP 0x0010 - -#define MAN_ID_SST 0x00BF -#define DEV_ID_SST39VF3201 0x235B - -/****************************************************************************** - * External global variables - *****************************************************************************/ - -/****************************************************************************** - * Local variables - *****************************************************************************/ - -static geometry_t chip_info; - -/****************************************************************************** - * Local Functions - *****************************************************************************/ - -static void pinConfig(void) -{ - /* Set up EMC pin */ - scu_pinmux( 2 , 9 , MD_PLN_FAST , 3 );//A0 - scu_pinmux( 2 , 10 , MD_PLN_FAST , 3 );//A1 - scu_pinmux( 2 , 11 , MD_PLN_FAST , 3 );//A2 - scu_pinmux( 2 , 12 , MD_PLN_FAST , 3 );//A3 - scu_pinmux( 2 , 13 , MD_PLN_FAST , 3 );//A4 - scu_pinmux( 1 , 0 , MD_PLN_FAST , 2 );//A5 - scu_pinmux( 1 , 1 , MD_PLN_FAST , 2 );//A6 - scu_pinmux( 1 , 2 , MD_PLN_FAST , 2 );//A7 - scu_pinmux( 2 , 8 , MD_PLN_FAST , 3 );//A8 - scu_pinmux( 2 , 7 , MD_PLN_FAST , 3 );//A9 - scu_pinmux( 2 , 6 , MD_PLN_FAST , 2 );//A10 - scu_pinmux( 2 , 2 , MD_PLN_FAST , 2 );//A11 - scu_pinmux( 2 , 1 , MD_PLN_FAST , 2 );//A12 - scu_pinmux( 2 , 0 , MD_PLN_FAST , 2 );//A13 - scu_pinmux( 6 , 8 , MD_PLN_FAST , 1 );//A14 - scu_pinmux( 6 , 7 , MD_PLN_FAST , 1 );//A15 - scu_pinmux( 13 , 16 , MD_PLN_FAST , 2 );//A16 - scu_pinmux( 13 , 15 , MD_PLN_FAST , 2 );//A17 - scu_pinmux( 14 , 0 , MD_PLN_FAST , 3 );//A18 - scu_pinmux( 14 , 1 , MD_PLN_FAST , 3 );//A19 - scu_pinmux( 14 , 2 , MD_PLN_FAST , 3 );//A20 - scu_pinmux( 14 , 3 , MD_PLN_FAST , 3 );//A21 - scu_pinmux( 14 , 4 , MD_PLN_FAST , 3 );//A22 - scu_pinmux( 10 , 4 , MD_PLN_FAST , 3 );//A23 - - scu_pinmux( 1 , 7 , MD_PLN_FAST , 3 );//D0 - scu_pinmux( 1 , 8 , MD_PLN_FAST , 3 );//D1 - scu_pinmux( 1 , 9 , MD_PLN_FAST , 3 );//D2 - scu_pinmux( 1 , 10 , MD_PLN_FAST , 3 );//D3 - scu_pinmux( 1 , 11 , MD_PLN_FAST , 3 );//D4 - scu_pinmux( 1 , 12 , MD_PLN_FAST , 3 );//D5 - scu_pinmux( 1 , 13 , MD_PLN_FAST , 3 );//D6 - scu_pinmux( 1 , 14 , MD_PLN_FAST , 3 );//D7 - scu_pinmux( 5 , 4 , MD_PLN_FAST , 2 );//D8 - scu_pinmux( 5 , 5 , MD_PLN_FAST , 2 );//D9 - scu_pinmux( 5 , 6 , MD_PLN_FAST , 2 );//D10 - scu_pinmux( 5 , 7 , MD_PLN_FAST , 2 );//D11 - scu_pinmux( 5 , 0 , MD_PLN_FAST , 2 );//D12 - scu_pinmux( 5 , 1 , MD_PLN_FAST , 2 );//D13 - scu_pinmux( 5 , 2 , MD_PLN_FAST , 2 );//D14 - scu_pinmux( 5 , 3 , MD_PLN_FAST , 2 );//D15 - scu_pinmux( 13 , 2 , MD_PLN_FAST , 2 );//D16 - scu_pinmux( 13 , 3 , MD_PLN_FAST , 2 );//D17 - scu_pinmux( 13 , 4 , MD_PLN_FAST , 2 );//D18 - scu_pinmux( 13 , 5 , MD_PLN_FAST , 2 );//D19 - scu_pinmux( 13 , 6 , MD_PLN_FAST , 2 );//D20 - scu_pinmux( 13 , 7 , MD_PLN_FAST , 2 );//D21 - scu_pinmux( 13 , 8 , MD_PLN_FAST , 2 );//D22 - scu_pinmux( 13 , 9 , MD_PLN_FAST , 2 );//D23 - scu_pinmux( 14 , 5 , MD_PLN_FAST , 3 );//D24 - scu_pinmux( 14 , 6 , MD_PLN_FAST , 3 );//D25 - scu_pinmux( 14 , 7 , MD_PLN_FAST , 3 );//D26 - scu_pinmux( 14 , 8 , MD_PLN_FAST , 3 );//D27 - scu_pinmux( 14 , 9 , MD_PLN_FAST , 3 );//D28 - scu_pinmux( 14 , 10 , MD_PLN_FAST , 3 );//D29 - scu_pinmux( 14 , 11 , MD_PLN_FAST , 3 );//D30 - scu_pinmux( 14 , 12 , MD_PLN_FAST , 3 );//D31 - - scu_pinmux( 1 , 3 , MD_PLN_FAST , 3 );//OE - scu_pinmux( 1 , 6 , MD_PLN_FAST , 3 );//WE - - scu_pinmux( 1 , 4 , MD_PLN_FAST , 3 );//BLS0 - scu_pinmux( 6 , 6 , MD_PLN_FAST , 1 );//BLS1 - scu_pinmux( 13 , 13 , MD_PLN_FAST , 2 );//BLS2 - scu_pinmux( 13 , 10 , MD_PLN_FAST , 2 );//BLS3 - - scu_pinmux( 1 , 5 , MD_PLN_FAST , 3 );//CS0 - scu_pinmux( 6 , 3 , MD_PLN_FAST , 3 );//CS1 - scu_pinmux( 13 , 12 , MD_PLN_FAST , 2 );//CS2 - scu_pinmux( 13 , 11 , MD_PLN_FAST , 2 );//CS3 -} - -#if 0 -static void getIdString(uint16_t idString[11]) -{ - int i = 0; - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2aaa)) = 0x0055; - *(GET_ADDR(0x5555)) = CMD_CFI_QRY; - - for (i = 0; i < 11; i++) { - idString[i] = *(GET_ADDR(0x10 + i)); - } - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2aaa)) = 0x0055; - *(GET_ADDR(0x5555)) = CMD_ID_EXIT; -} -#endif - -static void getGeoInfo(uint16_t info[14]) -{ - int i = 0; - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2aaa)) = 0x0055; - *(GET_ADDR(0x5555)) = CMD_CFI_QRY; - - for (i = 0; i < 14; i++) { - info[i] = *(GET_ADDR(0x27 + i)); - } - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2aaa)) = 0x0055; - *(GET_ADDR(0x5555)) = CMD_ID_EXIT; -} - -static uint32_t getProductId(void) -{ - uint16_t manuid = 0; - uint16_t devid = 0; - uint32_t result = 0; - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2aaa)) = 0x0055; - *(GET_ADDR(0x5555)) = CMD_SWID; - - manuid = *(GET_ADDR(0x00)); - devid = *(GET_ADDR(0x01)); - - result = ((manuid << 16) | devid); - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2aaa)) = 0x0055; - *(GET_ADDR(0x5555)) = CMD_ID_EXIT; - - return result; -} - -/****************************************************************************** - * - * Description: - * When the SST39VF160x/320x are in the internal Program operation, any - * attempt to read DQ7 will produce the complement of the true data. Once - * the Program operation is completed, DQ7 will produce true data. Note - * that even though DQ7 may have valid data immediately following the - * completion of an internal Write operation, the remaining data outputs - * may still be invalid: valid data on the entire data bus will appear in - * subsequent successive Read cycles after an interval of 1 �s. During - * internal Erase operation, any attempt to read DQ7 will produce a '0'. - * Once the internal Erase operation is completed, DQ7 will produce a '1'. - * - * Parameters: - * addr The device address - * data The original (true) data - * timeout Maximum number of loops to delay - * - * Returns: - * TRUE if success - * - *****************************************************************************/ -static uint16_t check_data_polling(uint32_t addr, uint16_t data, uint32_t timeout) -{ - volatile uint16_t *p = (uint16_t*) addr; - uint16_t true_data = data & 0x80; - int i; - - for (i = 0; i < timeout; i++) - { - if ( true_data == (*p &0x80) ) - { - TIM_Waitus(1); - return (TRUE); - } - } - return (FALSE); -} - -/****************************************************************************** - * - * Description: - * During the internal Program or Erase operation, any consecutive attempts - * to read DQ6 will produce alternating �1�s and �0�s, i.e., toggling - * between 1 and 0. When the internal Program or Erase operation is - * completed, the DQ6 bit will stop toggling. The device is then ready - * for the next operation. - * - * Parameters: - * addr The device address - * timeout Maximum number of loops to delay - * - * Returns: - * TRUE if success - * - *****************************************************************************/ -static uint16_t check_toggle_ready(uint32_t addr, uint32_t timeout) -{ - volatile uint16_t *p = (uint16_t*) addr; - uint16_t predata, currdata; - int i; - - predata = *p & 0x40; - for (i = 0; i < timeout; i++) - { - currdata = *p & 0x40; - if (predata == currdata) - { - TIM_Waitus(1); - return (TRUE); - } - predata = currdata; - } - return (FALSE); -} - -/****************************************************************************** - * Public Functions - *****************************************************************************/ - - - -/****************************************************************************** - * - * Description: - * Initialize the NOR Flash - * - *****************************************************************************/ -uint32_t norflash_init() -{ - uint32_t prodId = 0; - -// LPC_SC->PCONP |= 0x00000800; - - LPC_EMC->CONTROL = 0x00000001; - - LPC_EMC->CONFIG = 0x00000000; - - //Disable Auto-Byte Addressing (on boards designed for LPC24xx) - //LPC_SC->SCS |= 0x00000001; - - pinConfig(); - - LPC_EMC->STATICCONFIG0 = 0x00000081; - - LPC_EMC->STATICWAITWEN0 = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ - LPC_EMC->STATICWAITOEN0 = 0x00000003; /* ( n ) -> 0 clock cycles */ - LPC_EMC->STATICWAITRD0 = 0x00000006; /* ( n + 1 ) -> 7 clock cycles */ - LPC_EMC->STATICWAITPAG0 = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ - LPC_EMC->STATICWAITWR0 = 0x00000005; /* ( n + 2 ) -> 7 clock cycles */ - LPC_EMC->STATICWAITTURN0 = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ - -#if 0 - M32(0x40086400) = 3;//SFSP8_0, pin config P8_0, FUNC3, (PUP_DISABLE | PDN_DISABLE | INBUF_DISABLE | FILTER_ENABLE) - M32(0x40086404) = 3;//SFSP8_1, pin config P8_1, FUNC3, (PUP_DISABLE | PDN_DISABLE | INBUF_DISABLE | FILTER_ENABLE) - M32(0x40086408) = 3;//SFSP8_2, pin config P8_2, FUNC3, (PUP_DISABLE | PDN_DISABLE | INBUF_DISABLE | FILTER_ENABLE) - M32(0x4008640C) = 3;//SFSP8_3, pin config P8_3, FUNC3, (PUP_DISABLE | PDN_DISABLE | SLEWRATE_SLOW | INBUF_DISABLE | FILTER_ENABLE) - M32(0x40086410) = 3;//SFSP8_4, pin config P8_4, FUNC3, (PUP_DISABLE | PDN_DISABLE | SLEWRATE_SLOW | INBUF_DISABLE | FILTER_ENABLE) - M32(0x40086414) = 3;//SFSP8_5, pin config P8_5, FUNC3, (PUP_DISABLE | PDN_DISABLE | SLEWRATE_SLOW | INBUF_DISABLE | FILTER_ENABLE) - M32(0x40086418) = 3;//SFSP8_6, pin config P8_6, FUNC3, (PUP_DISABLE | PDN_DISABLE | SLEWRATE_SLOW | INBUF_DISABLE | FILTER_ENABLE) - M32(0x4008641C) = 3;//SFSP8_7, pin config P8_7, FUNC3, (PUP_DISABLE | PDN_DISABLE | SLEWRATE_SLOW | INBUF_DISABLE | FILTER_ENABLE) -#endif - - prodId = getProductId(); - - if (prodId == ((MAN_ID_SST << 16) | DEV_ID_SST39VF3201)) { - - uint16_t info[14]; - getGeoInfo(info); - chip_info.device_size = 1 << info[0]; - chip_info.num_sectors = ((info[7] << 8) | info[6]) + 1; - chip_info.sector_size = ((info[9] << 8) | info[8]) * 256; - chip_info.num_blocks = ((info[11] << 8) | info[10]) + 1; - chip_info.block_size = ((info[13] << 8) | info[12]) * 256; - - return TRUE; - } - - return FALSE; -} - -void norflash_getGeometry(geometry_t* geometry) -{ - *geometry = chip_info; -} - - -uint32_t norflash_eraseSector(uint32_t addr) -{ - volatile uint16_t* p; - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = 0x0080; - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - - p = (uint16_t*) addr; - *p = CMD_ERASE_SECTOR; - - return check_data_polling(addr, 0xffff, 500000); -} - -uint32_t norflash_eraseBlock(uint32_t addr) -{ - volatile uint16_t* p; - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = 0x0080; - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - - p = (uint16_t*) addr; - *p = CMD_ERASE_BLOCK; - - return check_toggle_ready(addr, 500000); -} - -uint32_t norflash_eraseEntireChip(void) -{ - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = 0x0080; - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = CMD_ERASE_CHIP; - - return check_toggle_ready(NORFLASH_BASE, 500000); -} - -uint32_t norflash_writeWord(uint32_t addr, uint16_t data) -{ - volatile uint16_t *p; - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = 0x00A0; - - p = (uint16_t*) addr; - *p = data; - - return check_toggle_ready(addr, 500000); -} - -uint32_t norflash_writeBuff(uint32_t addr, uint16_t* data, uint16_t len) -{ - uint16_t i; - for (i = 0; i < len; i++) - { - if (!norflash_writeWord(addr, data[i])) - { - return (FALSE); - } - } - return (TRUE); -} - -/****************************************************************************** - * - * Description: - * Reads the security information from the chip. For an explanation - * see the user manual. - * - * Parameters: - * SST_SecID The factory programmed security segment - * User_SecID The user defined security segment - * - *****************************************************************************/ -void norflash_secid_read(uint16_t SST_SecID[8], uint16_t User_SecID[8]) -{ - uint16_t i; - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = 0x0088; - - for (i = 0; i < 7; i++) - { - SST_SecID[i] = *(GET_ADDR(i)); // SST security is 0x00 - 0x07 - User_SecID[i] = *(GET_ADDR(i + 0x10)); // User security is 0x10 - 0x17 - } - - // exit command - *(GET_ADDR(0x5555)) = CMD_ID_EXIT; -} - -/****************************************************************************** - * - * Description: - * Checks if the user defined security segment has been locked or not. - * See the user manual for more information. - * - * Returns: - * TRUE if the segment is locked - * - *****************************************************************************/ -uint32_t norflash_secid_getLockStatus(void) -{ - uint16_t status; - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = 0x0088; - - // read status - status = *(GET_ADDR(0xff)); - status &= 0x0008; - - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = CMD_ID_EXIT; - - if (!status) - return TRUE; // locked - return FALSE; // not locked -} - -/****************************************************************************** - * - * Description: - * Lock the user security segment. CANNOT BE UNDONE. - * See the user manual for more information. - * - * Returns: - * TRUE if the segment is locked after programming - * - *****************************************************************************/ -uint32_t norflash_secid_lockOut() -{ - // Code not verified. Use at own risk -#if 0 - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = 0x0085; - *(GET_ADDR(0x0 )) = 0x0000; // Write 0x0000 to any address - - if (check_toggle_ready(GET_ADDR(0x0), 500000)) - { - return norflash_secid_getLockStatus(); - } -#endif - return FALSE; -} - -/****************************************************************************** - * - * Description: - * Writes data to the user security segment (0x0010 - 0x0017). - * See the user manual for more information. - * - * Parameters: - * target Must be in the range 0x10 to 0x17 - * data The data to write - * len The number of words to write - * - * Returns: - * TRUE if the programming was successful - * - *****************************************************************************/ -uint32_t norflash_secid_writeWord(uint16_t target, uint16_t* data, uint16_t len) -{ - // Code not verified. Use at own risk -#if 0 - uint16_t i; - - if ((target < 0x10) || (target > 0x17)) - return FALSE; - - if ((len > 8) || ((target + len) > 0x17)) - return FALSE; - - for (i = 0; i < len; i++) - { - *(GET_ADDR(0x5555)) = 0x00AA; - *(GET_ADDR(0x2AAA)) = 0x0055; - *(GET_ADDR(0x5555)) = 0x00A5; - *(GET_ADDR(target + i)) = data; - - data++; - - /* Read the toggle bit to detect end-of-programming for User Sec ID. - Do Not use Data# Polling for User_SecID_Word_Program!! */ - if (!check_toggle_ready(GET_ADDR(target + i), 500000)) - return FALSE; - } -#endif - - return TRUE; -} - -#endif diff --git a/hw/bsp/ea4357/oem_base_board/norflash.h b/hw/bsp/ea4357/oem_base_board/norflash.h deleted file mode 100644 index 11eb675e6..000000000 --- a/hw/bsp/ea4357/oem_base_board/norflash.h +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ -#ifndef __NORFLASH_H -#define __NORFLASH_H - -#define NORFLASH_SIZE 0x400000 /*Bytes or 0x200000 16bit words*/ -#define NORFLASH_BLOCK_SIZE 0x10000 /*Bytes, or 32K 16bit words*/ -#define NORFLASH_BASE 0x1C000000 - -//16 bit data -#define GET_ADDR(addr) (volatile uint16_t *)(NORFLASH_BASE | ((addr) << 1)) - -typedef struct -{ - uint32_t device_size; /* Device size in bytes */ - uint32_t num_sectors; /* Number of sectors */ - uint32_t sector_size; /* Sector size in bytes */ - uint32_t num_blocks; /* Number of blocks */ - uint32_t block_size; /* Block size in bytes */ -} geometry_t; - -extern uint32_t norflash_init(void); - -extern void norflash_getGeometry(geometry_t* geometry); - -extern uint32_t norflash_eraseBlock(uint32_t addr); -extern uint32_t norflash_eraseSector(uint32_t addr); -extern uint32_t norflash_eraseEntireChip(void); - -extern uint32_t norflash_writeWord(uint32_t addr, uint16_t data); -extern uint32_t norflash_writeBuff(uint32_t addr, uint16_t* data, uint16_t len); - -extern void norflash_secid_read(uint16_t SST_SecID[8], uint16_t user_SecID[8]); -extern uint32_t norflash_secid_getLockStatus(void); -extern uint32_t norflash_secid_lockOut(void); -extern uint32_t norflash_secid_writeWord(uint16_t target, uint16_t* data, uint16_t len); - -#endif /* end __NORFLASH_H */ -/**************************************************************************** -** End Of File -*****************************************************************************/ diff --git a/hw/bsp/ea4357/oem_base_board/uda1380.c b/hw/bsp/ea4357/oem_base_board/uda1380.c deleted file mode 100644 index 654e4eb9a..000000000 --- a/hw/bsp/ea4357/oem_base_board/uda1380.c +++ /dev/null @@ -1,159 +0,0 @@ -#include "../../board.h" - -#if BOARD == BOARD_EA4357 - -#include "lpc43xx_i2c.h" -#include "lpc43xx_scu.h" -#include "uda1380.h" - -//Uda1380 link to I2C0 only -#define UDA1380_I2C LPC_I2C0 - - - -/*********************************************************************//** - * @brief Initialize Uda1380 - * @param[in] i2cClockFreq I2C clock frequency that Uda1380 operate - * @param[in] i2sClockFreq I2S bit clock frequency - * @return None - **********************************************************************/ -int32_t Uda1380_Init(uint32_t i2cClockFreq, uint32_t i2sClockFreq) -{ - int32_t ret; - uint8_t clk; - -// // Config Pin for I2C_SDA and I2C_SCL of I2C0 -// scu_pinmux( 2 , 3 , MD_PLN_FAST, FUNC1 ); -// scu_pinmux( 2 , 4 , MD_PLN_FAST, FUNC1 ); - - I2C_Init(UDA1380_I2C, i2cClockFreq); - - /* Enable I2C1 operation */ - I2C_Cmd(UDA1380_I2C, ENABLE); - - /* Reset */ - ret = Uda1380_WriteData(UDA1380_REG_L3, 0 ); - if(ret != UDA1380_FUNC_OK) - return ret; - - /* Write clock settings */ - ret = Uda1380_WriteData(UDA1380_REG_I2S,0 ); - if(ret != UDA1380_FUNC_OK) - return ret; - - ret = Uda1380_WriteData(UDA1380_REG_MSTRMUTE,0); - if(ret != UDA1380_FUNC_OK) - return ret; - - ret = Uda1380_WriteData(UDA1380_REG_MIXSDO,0); - if(ret != UDA1380_FUNC_OK) - return ret; - -#if UDA1380_SYSCLK_USED //Use SYSCLK - ret = Uda1380_WriteData(UDA1380_REG_EVALCLK, - EVALCLK_DEC_EN | EVALCLK_DAC_EN | EVALCLK_INT_EN | EVALCLK_DAC_SEL_SYSCLK ); - if(ret != UDA1380_FUNC_OK) - return ret; - - ret = Uda1380_WriteData(UDA1380_REG_PWRCTRL, - PWR_PON_HP_EN | PWR_PON_DAC_EN | PWR_PON_BIAS_EN); - if(ret != UDA1380_FUNC_OK) - return ret; - -#else //Use WSPLL - if(i2sClockFreq >= 6250 && i2sClockFreq < 12500) - clk = EVALCLK_WSPLL_SEL6_12K; - else if(i2sClockFreq >= 12501 && i2sClockFreq < 25000) - clk = EVALCLK_WSPLL_SEL12_25K; - else if(i2sClockFreq >= 25001 && i2sClockFreq < 50000) - clk = EVALCLK_WSPLL_SEL25_50K; - else if(i2sClockFreq >= 50001 && i2sClockFreq < 100000) - clk = EVALCLK_WSPLL_SEL50_100K; - else - clk= 0; - - ret = Uda1380_WriteData(UDA1380_REG_EVALCLK, - EVALCLK_DEC_EN | EVALCLK_DAC_EN | EVALCLK_INT_EN | EVALCLK_DAC_SEL_WSPLL | clk); - if(ret != UDA1380_FUNC_OK) - return ret; - - ret = Uda1380_WriteData(UDA1380_REG_PWRCTRL, - PWR_PON_PLL_EN | PWR_PON_HP_EN | PWR_PON_DAC_EN | PWR_PON_BIAS_EN); - if(ret != UDA1380_FUNC_OK) - return ret; -#endif - return UDA1380_FUNC_OK; -} - -/*********************************************************************//** - * @brief Write data to a register of Uda1380 - * @param[in] reg Register address - * @param[out] data data value. - * @return None - **********************************************************************/ -int32_t Uda1380_WriteData(uint8_t reg, uint16_t data) -{ - I2C_M_SETUP_Type i2cData; - uint8_t i2cBuf[UDA1380_CMD_BUFF_SIZE]; - - i2cBuf[0] = reg; - i2cBuf[1] = (data >> 8) & 0xFF; - i2cBuf[2] = data & 0xFF; - - i2cData.sl_addr7bit = UDA1380_SLAVE_ADDR; - i2cData.tx_length = UDA1380_CMD_BUFF_SIZE; - i2cData.tx_data = i2cBuf; - i2cData.rx_data = NULL; - i2cData.rx_length = 0; - i2cData.retransmissions_max = 3; - - if (I2C_MasterTransferData(UDA1380_I2C, &i2cData, I2C_TRANSFER_POLLING) == SUCCESS) - { - uint16_t dataTmp; - if(Uda1380_ReadData(reg, &dataTmp) != UDA1380_FUNC_OK) { - return UDA1380_FUNC_ERR; - } - if(dataTmp != data) - return UDA1380_FUNC_ERR; - - return UDA1380_FUNC_OK; - } - - return UDA1380_FUNC_ERR; -} - - -/*********************************************************************//** - * @brief Read data stored in register of Uda1380 - * @param[in] reg Register address - * @param[out] data point to the buffer which is used for storing data. - * @return None - **********************************************************************/ -int32_t Uda1380_ReadData(uint8_t reg, uint16_t *data) -{ - I2C_M_SETUP_Type i2cData; - uint8_t i2cBuf[UDA1380_CMD_BUFF_SIZE]; - - if(data == NULL) - return UDA1380_FUNC_ERR; - - i2cBuf[0] = reg; - - i2cData.sl_addr7bit = UDA1380_SLAVE_ADDR; - i2cData.tx_length = 1; - i2cData.tx_data = i2cBuf; - i2cData.rx_data = &i2cBuf[1]; - i2cData.rx_length = UDA1380_CMD_BUFF_SIZE - 1; - i2cData.retransmissions_max = 3; - - if (I2C_MasterTransferData(UDA1380_I2C, &i2cData, I2C_TRANSFER_POLLING) == SUCCESS) - { - *data = i2cBuf[1] << 8 | i2cBuf[2]; - return UDA1380_FUNC_OK; - } - - return UDA1380_FUNC_ERR; -} - -#endif - diff --git a/hw/bsp/ea4357/oem_base_board/uda1380.h b/hw/bsp/ea4357/oem_base_board/uda1380.h deleted file mode 100644 index b953cf501..000000000 --- a/hw/bsp/ea4357/oem_base_board/uda1380.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef _UDA1380_H_ -#define _UDA1380_H_ - -#include "lpc_types.h" - -#define UDA1380_SYSCLK_USED 0 -#define UDA1380_SLAVE_ADDR 0x1A -#define UDA1380_CMD_BUFF_SIZE 3 - -/** UDA1380 Registers */ -#define UDA1380_REG_EVALCLK 0x00 -#define UDA1380_REG_I2S 0x01 -#define UDA1380_REG_PWRCTRL 0x02 -#define UDA1380_REG_ANAMIX 0x03 -#define UDA1380_REG_HEADAMP 0x04 -#define UDA1380_REG_MSTRVOL 0x10 -#define UDA1380_REG_MIXVOL 0x11 -#define UDA1380_REG_MODEBBT 0x12 -#define UDA1380_REG_MSTRMUTE 0x13 -#define UDA1380_REG_MIXSDO 0x14 -#define UDA1380_REG_DECVOL 0x20 -#define UDA1380_REG_PGA 0x21 -#define UDA1380_REG_ADC 0x22 -#define UDA1380_REG_AGC 0x23 -#define UDA1380_REG_L3 0x7f -#define UDA1380_REG_HEADPHONE 0x18 -#define UDA1380_REG_DEC 0x28 - -// UDA1380_REG_EVALCLK bit defines -#define EVALCLK_ADC_EN 0x0800 // Enable ADC clock -#define EVALCLK_DEC_EN 0x0400 // Enable decimator clock -#define EVALCLK_DAC_EN 0x0200 // Enable DAC clock -#define EVALCLK_INT_EN 0x0100 // Enable interpolator clock -#define EVALCLK_ADC_SEL_WSPLL 0x0020 // Select SYSCLK input for ADC clock -#define EVALCLK_ADC_SEL_SYSCLK 0x0000 // Select WSPLL clock for ADC clock -#define EVALCLK_DAC_SEL_WSPLL 0x0010 // Select SYSCLK input for DAC clock -#define EVALCLK_DAC_SEL_SYSCLK 0x0000 // Select WSPLL clock for DAC clock -#define EVALCLK_SYSDIV_SEL(n) ((n) << 2) // System clock input divider select -#define EVALCLK_WSPLL_SEL6_12K 0x0000 // WSPLL input freq selection = 6.25 to 12.5K -#define EVALCLK_WSPLL_SEL12_25K 0x0001 // WSPLL input freq selection = 12.5K to 25K -#define EVALCLK_WSPLL_SEL25_50K 0x0002 // WSPLL input freq selection = 25K to 50K -#define EVALCLK_WSPLL_SEL50_100K 0x0003 // WSPLL input freq selection = 50K to 100K - -// UDA1380_REG_I2S -#define I2S_SFORI_I2S 0x0000 -#define I2S_SFORI_LSB16 0x0100 -#define I2S_SFORI_LSB18 0x0200 -#define I2S_SFORI_LSB20 0x0300 -#define I2S_SFORI_MSB 0x0500 -#define I2S_SFORI_MASK 0x0700 -#define I2S_SFORO_I2S 0x0000 -#define I2S_SFORO_LSB16 0x0001 -#define I2S_SFORO_LSB18 0x0002 -#define I2S_SFORO_LSB20 0x0003 -#define I2S_SFORO_LSB24 0x0004 -#define I2S_SFORO_MSB 0x0005 -#define I2S_SFORO_MASK 0x0007 -#define I2S_SEL_SOURCE 0x0040 -#define I2S_SIM 0x0010 - -// UDA1380_REG_PWRCTRL bit defines -#define PWR_PON_PLL_EN 0x8000 // WSPLL enable -#define PWR_PON_HP_EN 0x2000 // Headphone driver enable -#define PWR_PON_DAC_EN 0x0400 // DAC power enable -#define PWR_PON_BIAS_EN 0x0100 // Power on bias enable (for ADC, AVC, and FSDAC) -#define PWR_EN_AVC_EN 0x0080 // Analog mixer enable -#define PWR_PON_AVC_EN 0x0040 // Analog mixer power enable -#define PWR_EN_LNA_EN 0x0010 // LNA and SDC power enable -#define PWR_EN_PGAL_EN 0x0008 // PGA left power enable -#define PWR_EN_ADCL_EN 0x0004 // ADC left power enable -#define PWR_EN_PGAR_EN 0x0002 // PGA right power enable -#define PWR_EN_ADCR_EN 0x0001 // ADC right power enable - -// UDA1380_REG_MSTRMUTE bit defines -#define MSTRMUTE_MTM_MUTE_EN 0x4000 // Master mute enable -#define MSRTMUTE_CHANNEL2_MUTE_EN 0x0800 -#define MSRTMUTE_CHANNEL1_MUTE_EN 0x0008 - - -// UDA1380_REG_MODEBBT bit defines -#define MODEBBT_BOOST_FLAT 0x0000 // Bits for selecting flat boost -#define MODEBBT_BOOST_FULL 0xC000 // Bits for selecting maximum boost -#define MODEBBT_BOOST_MASK 0xC000 // Bits for selecting boost mask - -#define UDA1380_FUNC_OK 0 -#define UDA1380_FUNC_ERR -1 - -int32_t Uda1380_Init(uint32_t i2cClockFreq, uint32_t i2sClockFreq); -int32_t Uda1380_WriteData(uint8_t reg, uint16_t data); -int32_t Uda1380_ReadData(uint8_t reg, uint16_t *data); - - -#endif /* _UDA1380_H_ */ diff --git a/hw/bsp/ea4357/oem_base_board/pca9532.c b/hw/bsp/ea4357/pca9532.c index 7b526f670..eae3805c2 100644 --- a/hw/bsp/ea4357/oem_base_board/pca9532.c +++ b/hw/bsp/ea4357/pca9532.c @@ -24,13 +24,10 @@ /****************************************************************************** * Includes *****************************************************************************/ -#include "bsp/board.h" -#ifdef BOARD_EA4357 +//#include "board.h" +#include "chip.h" -#include "lpc43xx_i2c.h" -#include "lpc43xx_cgu.h" -#include "lpc_types.h" #include "pca9532.h" /****************************************************************************** @@ -60,32 +57,40 @@ static uint16_t ledStateShadow = 0; * Local Functions *****************************************************************************/ -static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len) +static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len) { - I2C_M_SETUP_Type i2cData; + I2CM_XFER_T i2cData; - i2cData.sl_addr7bit = addr; - i2cData.tx_data = buf; - i2cData.tx_length = len; - i2cData.rx_data = NULL; - i2cData.rx_length = 0; - i2cData.retransmissions_max = 3; + i2cData.slaveAddr = addr; + i2cData.options = 0; + i2cData.status = 0; + i2cData.txBuff = buf; + i2cData.txSz = len; + i2cData.rxBuff = NULL; + i2cData.rxSz = 0; - return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING); + if (Chip_I2CM_XferBlocking(LPC_I2C0, &i2cData) == 0) { + return ERROR; + } + return SUCCESS; } -static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len) +static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len) { - I2C_M_SETUP_Type i2cData; + I2CM_XFER_T i2cData; - i2cData.sl_addr7bit = addr; - i2cData.tx_data = NULL; - i2cData.tx_length = 0; - i2cData.rx_data = buf; - i2cData.rx_length = len; - i2cData.retransmissions_max = 3; + i2cData.slaveAddr = addr; + i2cData.options = 0; + i2cData.status = 0; + i2cData.txBuff = NULL; + i2cData.txSz = 0; + i2cData.rxBuff = buf; + i2cData.rxSz = len; - return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING); + if (Chip_I2CM_XferBlocking(LPC_I2C0, &i2cData) == 0) { + return ERROR; + } + return SUCCESS; } static void setLsStates(uint16_t states, uint8_t* ls, uint8_t mode) @@ -176,7 +181,7 @@ uint16_t pca9532_getLedState (uint32_t shadow) * A blinking LED may be reported as on or off depending on * its state when reading the Input register. */ - + buf[0] = PCA9532_INPUT0; I2CWrite(PCA9532_I2C_ADDR, buf, 1); @@ -345,5 +350,3 @@ void pca9532_setBlink1Leds(uint16_t ledMask) blink1Shadow |= ledMask; setLeds(); } - -#endif diff --git a/hw/bsp/ea4357/oem_base_board/pca9532.h b/hw/bsp/ea4357/pca9532.h index 885075326..7a7c6e145 100644 --- a/hw/bsp/ea4357/oem_base_board/pca9532.h +++ b/hw/bsp/ea4357/pca9532.h @@ -19,7 +19,7 @@ #define __PCA9532C_H -#define PCA9532_I2C_ADDR (0x60) +#define PCA9532_I2C_ADDR (0xC0>>1) #define PCA9532_INPUT0 0x00 #define PCA9532_INPUT1 0x01 @@ -48,7 +48,7 @@ #define KEY_MASK 0x000F /* - * MMC Card Detect and MMC Write Protect are mapped to LED4 + * MMC Card Detect and MMC Write Protect are mapped to LED4 * and LED5 on the PCA9532. Please note that WP is active low. */ diff --git a/hw/bsp/ea4357/sdram.c b/hw/bsp/ea4357/sdram.c deleted file mode 100644 index 68c67cf52..000000000 --- a/hw/bsp/ea4357/sdram.c +++ /dev/null @@ -1,272 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ - - - -/****************************************************************************** - * Includes - *****************************************************************************/ -#include "../board.h" - -#if BOARD == BOARD_EA4357 - -#include "LPC43xx.h" -#include "lpc_types.h" -#include "lpc43xx_scu.h" -#include "lpc43xx_timer.h" -#include "lpc43xx_cgu.h" -#include "sdram.h" -#include <string.h> - -/****************************************************************************** - * Defines and typedefs - *****************************************************************************/ - -/* SDRAM refresh time to 16 clock num */ -#define EMC_SDRAM_REFRESH(freq,time) \ - (((uint64_t)((uint64_t)time * freq)/16000000000ull)+1) - -/****************************************************************************** - * External global variables - *****************************************************************************/ - -/****************************************************************************** - * Local variables - *****************************************************************************/ - -/****************************************************************************** - * Local Functions - *****************************************************************************/ - - -/*-------------------------PRIVATE FUNCTIONS------------------------------*/ -/********************************************************************* - * @brief Calculate EMC Clock from nano second - * @param[in] freq - frequency of EMC Clk - * @param[in] time - nano second - * @return None - **********************************************************************/ -uint32_t NS2CLK(uint32_t freq, uint32_t time){ - return (((uint64_t)time*freq/1000000000)); -} - -static void pinConfig(void) -{ - /* Set up EMC pin */ - scu_pinmux( 2 , 9 , MD_PLN_FAST , 3 );//A0 - scu_pinmux( 2 , 10 , MD_PLN_FAST , 3 );//A1 - scu_pinmux( 2 , 11 , MD_PLN_FAST , 3 );//A2 - scu_pinmux( 2 , 12 , MD_PLN_FAST , 3 );//A3 - scu_pinmux( 2 , 13 , MD_PLN_FAST , 3 );//A4 - scu_pinmux( 1 , 0 , MD_PLN_FAST , 2 );//A5 - scu_pinmux( 1 , 1 , MD_PLN_FAST , 2 );//A6 - scu_pinmux( 1 , 2 , MD_PLN_FAST , 2 );//A7 - scu_pinmux( 2 , 8 , MD_PLN_FAST , 3 );//A8 - scu_pinmux( 2 , 7 , MD_PLN_FAST , 3 );//A9 - scu_pinmux( 2 , 6 , MD_PLN_FAST , 2 );//A10 - scu_pinmux( 2 , 2 , MD_PLN_FAST , 2 );//A11 - scu_pinmux( 2 , 1 , MD_PLN_FAST , 2 );//A12 - scu_pinmux( 2 , 0 , MD_PLN_FAST , 2 );//A13 - scu_pinmux( 6 , 8 , MD_PLN_FAST , 1 );//A14 - scu_pinmux( 6 , 7 , MD_PLN_FAST , 1 );//A15 - scu_pinmux( 13 , 16 , MD_PLN_FAST , 2 );//A16 - scu_pinmux( 13 , 15 , MD_PLN_FAST , 2 );//A17 - scu_pinmux( 14 , 0 , MD_PLN_FAST , 3 );//A18 - scu_pinmux( 14 , 1 , MD_PLN_FAST , 3 );//A19 - scu_pinmux( 14 , 2 , MD_PLN_FAST , 3 );//A20 - scu_pinmux( 14 , 3 , MD_PLN_FAST , 3 );//A21 - scu_pinmux( 14 , 4 , MD_PLN_FAST , 3 );//A22 - scu_pinmux( 10 , 4 , MD_PLN_FAST , 3 );//A23 - - scu_pinmux( 1 , 7 , MD_PLN_FAST , 3 );//D0 - scu_pinmux( 1 , 8 , MD_PLN_FAST , 3 );//D1 - scu_pinmux( 1 , 9 , MD_PLN_FAST , 3 );//D2 - scu_pinmux( 1 , 10 , MD_PLN_FAST , 3 );//D3 - scu_pinmux( 1 , 11 , MD_PLN_FAST , 3 );//D4 - scu_pinmux( 1 , 12 , MD_PLN_FAST , 3 );//D5 - scu_pinmux( 1 , 13 , MD_PLN_FAST , 3 );//D6 - scu_pinmux( 1 , 14 , MD_PLN_FAST , 3 );//D7 - scu_pinmux( 5 , 4 , MD_PLN_FAST , 2 );//D8 - scu_pinmux( 5 , 5 , MD_PLN_FAST , 2 );//D9 - scu_pinmux( 5 , 6 , MD_PLN_FAST , 2 );//D10 - scu_pinmux( 5 , 7 , MD_PLN_FAST , 2 );//D11 - scu_pinmux( 5 , 0 , MD_PLN_FAST , 2 );//D12 - scu_pinmux( 5 , 1 , MD_PLN_FAST , 2 );//D13 - scu_pinmux( 5 , 2 , MD_PLN_FAST , 2 );//D14 - scu_pinmux( 5 , 3 , MD_PLN_FAST , 2 );//D15 - scu_pinmux( 13 , 2 , MD_PLN_FAST , 2 );//D16 - scu_pinmux( 13 , 3 , MD_PLN_FAST , 2 );//D17 - scu_pinmux( 13 , 4 , MD_PLN_FAST , 2 );//D18 - scu_pinmux( 13 , 5 , MD_PLN_FAST , 2 );//D19 - scu_pinmux( 13 , 6 , MD_PLN_FAST , 2 );//D20 - scu_pinmux( 13 , 7 , MD_PLN_FAST , 2 );//D21 - scu_pinmux( 13 , 8 , MD_PLN_FAST , 2 );//D22 - scu_pinmux( 13 , 9 , MD_PLN_FAST , 2 );//D23 - scu_pinmux( 14 , 5 , MD_PLN_FAST , 3 );//D24 - scu_pinmux( 14 , 6 , MD_PLN_FAST , 3 );//D25 - scu_pinmux( 14 , 7 , MD_PLN_FAST , 3 );//D26 - scu_pinmux( 14 , 8 , MD_PLN_FAST , 3 );//D27 - scu_pinmux( 14 , 9 , MD_PLN_FAST , 3 );//D28 - scu_pinmux( 14 , 10 , MD_PLN_FAST , 3 );//D29 - scu_pinmux( 14 , 11 , MD_PLN_FAST , 3 );//D30 - scu_pinmux( 14 , 12 , MD_PLN_FAST , 3 );//D31 - - scu_pinmux( 1 , 3 , MD_PLN_FAST , 3 );//OE - scu_pinmux( 1 , 6 , MD_PLN_FAST , 3 );//WE - - scu_pinmux( 1 , 4 , MD_PLN_FAST , 3 );//BLS0 - scu_pinmux( 6 , 6 , MD_PLN_FAST , 1 );//BLS1 - scu_pinmux( 13 , 13 , MD_PLN_FAST , 2 );//BLS2 - scu_pinmux( 13 , 10 , MD_PLN_FAST , 2 );//BLS3 - - scu_pinmux( 1 , 5 , MD_PLN_FAST , 3 );//CS0 - scu_pinmux( 6 , 3 , MD_PLN_FAST , 3 );//CS1 - scu_pinmux( 13 , 12 , MD_PLN_FAST , 2 );//CS2 - scu_pinmux( 13 , 11 , MD_PLN_FAST , 2 );//CS3 - - scu_pinmux( 6 , 4 , MD_PLN_FAST , 3 );//CAS - scu_pinmux( 6 , 5 , MD_PLN_FAST , 3 );//RAS - - scu_pinmux( 6 , 9 , MD_PLN_FAST , 3 );//DYCS0 - scu_pinmux( 6 , 1 , MD_PLN_FAST , 1 );//DYCS1 - scu_pinmux( 13 , 14 , MD_PLN_FAST , 2 );//DYCS2 - scu_pinmux( 15 , 14 , MD_PLN_FAST , 3 );//DYCS3 - - scu_pinmux( 6 , 11 , MD_PLN_FAST , 3 );//CKEOUT0 - scu_pinmux( 6 , 2 , MD_PLN_FAST , 1 );//CKEOUT1 - scu_pinmux( 13 , 1 , MD_PLN_FAST , 2 );//CKEOUT2 - scu_pinmux( 14 , 15 , MD_PLN_FAST , 3 );//CKEOUT3 - - scu_pinmux( 6 , 12 , MD_PLN_FAST , 3 );//DQMOUT0 - scu_pinmux( 6 , 10 , MD_PLN_FAST , 3 );//DQMOUT1 - scu_pinmux( 13 , 0 , MD_PLN_FAST , 2 );//DQMOUT2 - scu_pinmux( 14 , 13 , MD_PLN_FAST , 3 );//DQMOUT3 -} - - - -/****************************************************************************** - * Public Functions - *****************************************************************************/ - - -/****************************************************************************** - * - * Description: - * Initialize the SDRAM - * - *****************************************************************************/ -uint32_t sdram_init (void) -{ - uint32_t pclk, temp; - uint64_t tmpclk; - - pinConfig(); //Full 32-bit Data bus, 24-bit Address - - /* Select EMC clock-out */ - LPC_SCU->SFSCLK_0 = MD_PLN_FAST; - LPC_SCU->SFSCLK_1 = MD_PLN_FAST; - LPC_SCU->SFSCLK_2 = MD_PLN_FAST; - LPC_SCU->SFSCLK_3 = MD_PLN_FAST; - - LPC_EMC->CONTROL = 0x00000001; - LPC_EMC->CONFIG = 0x00000000; - LPC_EMC->DYNAMICCONFIG0 = 1<<14 | 0<<12 | 2<<9 | 1<<7; /* 256Mb, 8Mx32, 4 banks, row=12, column=9 */ - - pclk = CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE); - - LPC_EMC->DYNAMICRASCAS0 = 0x00000202; /* 2 RAS, 2 CAS latency */ - LPC_EMC->DYNAMICREADCONFIG = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */ - - LPC_EMC->DYNAMICRP = NS2CLK(pclk, 20); - LPC_EMC->DYNAMICRAS = NS2CLK(pclk, 42); - LPC_EMC->DYNAMICSREX = NS2CLK(pclk, 63); - LPC_EMC->DYNAMICAPR = 0x00000005; - LPC_EMC->DYNAMICDAL = 0x00000005; - LPC_EMC->DYNAMICWR = 2; - LPC_EMC->DYNAMICRC = NS2CLK(pclk, 63); - LPC_EMC->DYNAMICRFC = NS2CLK(pclk, 63); - LPC_EMC->DYNAMICXSR = NS2CLK(pclk, 63); - LPC_EMC->DYNAMICRRD = NS2CLK(pclk, 14); - LPC_EMC->DYNAMICMRD = 0x00000002; - - TIM_Waitus(100); /* wait 100ms */ - LPC_EMC->DYNAMICCONTROL = 0x00000183; /* Issue NOP command */ - - TIM_Waitus(200); /* wait 200ms */ - LPC_EMC->DYNAMICCONTROL = 0x00000103; /* Issue PALL command */ - - LPC_EMC->DYNAMICREFRESH = EMC_SDRAM_REFRESH(pclk,70); /* ( n * 16 ) -> 32 clock cycles */ - - //for(i = 0; i < 0x80; i++); /* wait 128 AHB clock cycles */ - TIM_Waitus(200); /* wait 200ms */ - - tmpclk = (uint64_t)15625*(uint64_t)pclk/1000000000/16; - LPC_EMC->DYNAMICREFRESH = tmpclk; /* ( n * 16 ) -> 736 clock cycles -> 15.330uS at 48MHz <= 15.625uS ( 64ms / 4096 row ) */ - - LPC_EMC->DYNAMICCONTROL = 0x00000083; /* Issue MODE command */ - - //Timing for 48/60/72MHZ Bus - temp = *((volatile uint32_t *)(SDRAM_BASE | (2<<4| 2)<<(9+2+2))); /* 4 burst, 2 CAS latency */ - temp = temp; - LPC_EMC->DYNAMICCONTROL = 0x00000000; /* Issue NORMAL command */ - - //[re]enable buffers - LPC_EMC->DYNAMICCONFIG0 |= 1<<19; - - return TRUE; -} - -uint32_t sdram_test( void ) -{ - volatile uint32_t *wr_ptr; - volatile uint16_t *short_wr_ptr; - uint32_t data; - uint32_t i, j; - - wr_ptr = (uint32_t *)SDRAM_BASE; - short_wr_ptr = (uint16_t *)wr_ptr; - - /* 16 bit write */ - for (i = 0; i < SDRAM_SIZE/0x40000; i++) - { - for (j = 0; j < 0x100; j++) - { - *short_wr_ptr++ = (i + j) & 0xFFFF; - *short_wr_ptr++ = ((i + j) + 1) & 0xFFFF; - } - } - - /* Verifying */ - wr_ptr = (uint32_t *)SDRAM_BASE; - for (i = 0; i < SDRAM_SIZE/0x40000; i++) - { - for (j = 0; j < 0x100; j++) - { - data = *wr_ptr; - if (data != (((((i + j) + 1) & 0xFFFF) << 16) | ((i + j) & 0xFFFF))) - { - return 0x0; - } - wr_ptr++; - } - } - return 0x1; -} - -#endif diff --git a/hw/bsp/ea4357/sdram.h b/hw/bsp/ea4357/sdram.h deleted file mode 100644 index 82122b9f8..000000000 --- a/hw/bsp/ea4357/sdram.h +++ /dev/null @@ -1,31 +0,0 @@ -/***************************************************************************** - * - * Copyright(C) 2011, Embedded Artists AB - * All rights reserved. - * - ****************************************************************************** - * Software that is described herein is for illustrative purposes only - * which provides customers with programming information regarding the - * products. This software is supplied "AS IS" without any warranties. - * Embedded Artists AB assumes no responsibility or liability for the - * use of the software, conveys no license or title under any patent, - * copyright, or mask work right to the product. Embedded Artists AB - * reserves the right to make changes in the software without - * notification. Embedded Artists AB also make no representation or - * warranty that such application will be suitable for the specified - * use without further testing or modification. - *****************************************************************************/ -#ifndef __SDRAM_H -#define __SDRAM_H - -#define SDRAM_SIZE 0x2000000 /* 256Mbit = 32MB */ - -#define SDRAM_BASE 0x28000000 /*CS0*/ - -extern uint32_t sdram_init(void); -extern uint32_t sdram_test(void); - -#endif /* end __SDRAM_H */ -/**************************************************************************** -** End Of File -*****************************************************************************/ diff --git a/hw/bsp/ea4357/startup/xpresso/cr_startup_lpc43xx.c b/hw/bsp/ea4357/startup/xpresso/cr_startup_lpc43xx.c deleted file mode 100644 index a5f06006a..000000000 --- a/hw/bsp/ea4357/startup/xpresso/cr_startup_lpc43xx.c +++ /dev/null @@ -1,509 +0,0 @@ -//***************************************************************************** -// LPC43xx (Cortex-M4) Microcontroller Startup code for use with LPCXpresso IDE -// -// Version : 150706 -//***************************************************************************** -// -// Copyright(C) NXP Semiconductors, 2013-2015 -// All rights reserved. -// -// Software that is described herein is for illustrative purposes only -// which provides customers with programming information regarding the -// LPC products. This software is supplied "AS IS" without any warranties of -// any kind, and NXP Semiconductors and its licensor disclaim any and -// all warranties, express or implied, including all implied warranties of -// merchantability, fitness for a particular purpose and non-infringement of -// intellectual property rights. NXP Semiconductors assumes no responsibility -// or liability for the use of the software, conveys no license or rights under any -// patent, copyright, mask work right, or any other intellectual property rights in -// or to any products. NXP Semiconductors reserves the right to make changes -// in the software without notification. NXP Semiconductors also makes no -// representation or warranty that such application will be suitable for the -// specified use without further testing or modification. -// -// Permission to use, copy, modify, and distribute this software and its -// documentation is hereby granted, under NXP Semiconductors' and its -// licensor's relevant copyrights in the software, without fee, provided that it -// is used in conjunction with NXP Semiconductors microcontrollers. This -// copyright, permission, and disclaimer notice must appear in all copies of -// this code. -//***************************************************************************** - -#if defined (__cplusplus) -#ifdef __REDLIB__ -#error Redlib does not support C++ -#else -//***************************************************************************** -// -// The entry point for the C++ library startup -// -//***************************************************************************** -extern "C" { - extern void __libc_init_array(void); -} -#endif -#endif - -#define WEAK __attribute__ ((weak)) -#define ALIAS(f) __attribute__ ((weak, alias (#f))) - -//***************************************************************************** -#if defined (__cplusplus) -extern "C" { -#endif - -//***************************************************************************** -#if defined (__USE_CMSIS) || defined (__USE_LPCOPEN) -// Declaration of external SystemInit function -extern void SystemInit(void); -#endif - -//***************************************************************************** -// -// Forward declaration of the default handlers. These are aliased. -// When the application defines a handler (with the same name), this will -// automatically take precedence over these weak definitions -// -//***************************************************************************** -void ResetISR(void); -WEAK void NMI_Handler(void); -WEAK void HardFault_Handler(void); -WEAK void MemManage_Handler(void); -WEAK void BusFault_Handler(void); -WEAK void UsageFault_Handler(void); -WEAK void SVC_Handler(void); -WEAK void DebugMon_Handler(void); -WEAK void PendSV_Handler(void); -WEAK void SysTick_Handler(void); -WEAK void IntDefaultHandler(void); - -//***************************************************************************** -// -// Forward declaration of the specific IRQ handlers. These are aliased -// to the IntDefaultHandler, which is a 'forever' loop. When the application -// defines a handler (with the same name), this will automatically take -// precedence over these weak definitions -// -//***************************************************************************** -void DAC_IRQHandler(void) ALIAS(IntDefaultHandler); -#if defined (__USE_LPCOPEN) -void M0APP_IRQHandler(void) ALIAS(IntDefaultHandler); -#else -void M0CORE_IRQHandler(void) ALIAS(IntDefaultHandler); -#endif -void DMA_IRQHandler(void) ALIAS(IntDefaultHandler); -void FLASH_EEPROM_IRQHandler(void) ALIAS(IntDefaultHandler); -void ETH_IRQHandler(void) ALIAS(IntDefaultHandler); -void SDIO_IRQHandler(void) ALIAS(IntDefaultHandler); -void LCD_IRQHandler(void) ALIAS(IntDefaultHandler); -void USB0_IRQHandler(void) ALIAS(IntDefaultHandler); -void USB1_IRQHandler(void) ALIAS(IntDefaultHandler); -void SCT_IRQHandler(void) ALIAS(IntDefaultHandler); -void RIT_IRQHandler(void) ALIAS(IntDefaultHandler); -void TIMER0_IRQHandler(void) ALIAS(IntDefaultHandler); -void TIMER1_IRQHandler(void) ALIAS(IntDefaultHandler); -void TIMER2_IRQHandler(void) ALIAS(IntDefaultHandler); -void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); -void MCPWM_IRQHandler(void) ALIAS(IntDefaultHandler); -void ADC0_IRQHandler(void) ALIAS(IntDefaultHandler); -void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler); -void SPI_IRQHandler(void) ALIAS(IntDefaultHandler); -void I2C1_IRQHandler(void) ALIAS(IntDefaultHandler); -void ADC1_IRQHandler(void) ALIAS(IntDefaultHandler); -void SSP0_IRQHandler(void) ALIAS(IntDefaultHandler); -void SSP1_IRQHandler(void) ALIAS(IntDefaultHandler); -void UART0_IRQHandler(void) ALIAS(IntDefaultHandler); -void UART1_IRQHandler(void) ALIAS(IntDefaultHandler); -void UART2_IRQHandler(void) ALIAS(IntDefaultHandler); -void UART3_IRQHandler(void) ALIAS(IntDefaultHandler); -void I2S0_IRQHandler(void) ALIAS(IntDefaultHandler); -void I2S1_IRQHandler(void) ALIAS(IntDefaultHandler); -void SPIFI_IRQHandler(void) ALIAS(IntDefaultHandler); -void SGPIO_IRQHandler(void) ALIAS(IntDefaultHandler); -void GPIO0_IRQHandler(void) ALIAS(IntDefaultHandler); -void GPIO1_IRQHandler(void) ALIAS(IntDefaultHandler); -void GPIO2_IRQHandler(void) ALIAS(IntDefaultHandler); -void GPIO3_IRQHandler(void) ALIAS(IntDefaultHandler); -void GPIO4_IRQHandler(void) ALIAS(IntDefaultHandler); -void GPIO5_IRQHandler(void) ALIAS(IntDefaultHandler); -void GPIO6_IRQHandler(void) ALIAS(IntDefaultHandler); -void GPIO7_IRQHandler(void) ALIAS(IntDefaultHandler); -void GINT0_IRQHandler(void) ALIAS(IntDefaultHandler); -void GINT1_IRQHandler(void) ALIAS(IntDefaultHandler); -void EVRT_IRQHandler(void) ALIAS(IntDefaultHandler); -void CAN1_IRQHandler(void) ALIAS(IntDefaultHandler); -#if defined (__USE_LPCOPEN) -void ADCHS_IRQHandler(void) ALIAS(IntDefaultHandler); -#else -void VADC_IRQHandler(void) ALIAS(IntDefaultHandler); -#endif -void ATIMER_IRQHandler(void) ALIAS(IntDefaultHandler); -void RTC_IRQHandler(void) ALIAS(IntDefaultHandler); -void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); -void M0SUB_IRQHandler(void) ALIAS(IntDefaultHandler); -void CAN0_IRQHandler(void) ALIAS(IntDefaultHandler); -void QEI_IRQHandler(void) ALIAS(IntDefaultHandler); - -//***************************************************************************** -// -// The entry point for the application. -// __main() is the entry point for Redlib based applications -// main() is the entry point for Newlib based applications -// -//***************************************************************************** -#if defined (__REDLIB__) -extern void __main(void); -#endif -extern int main(void); -//***************************************************************************** -// -// External declaration for the pointer to the stack top from the Linker Script -// -//***************************************************************************** -extern void _vStackTop(void); - -//***************************************************************************** -// -// External declaration for LPC MCU vector table checksum from Linker Script -// -//***************************************************************************** -WEAK extern void __valid_user_code_checksum(); - -//***************************************************************************** -#if defined (__cplusplus) -} // extern "C" -#endif -//***************************************************************************** -// -// The vector table. -// This relies on the linker script to place at correct location in memory. -// -//***************************************************************************** -extern void (* const g_pfnVectors[])(void); -__attribute__ ((used,section(".isr_vector"))) -void (* const g_pfnVectors[])(void) = { - // Core Level - CM4 - &_vStackTop, // The initial stack pointer - ResetISR, // The reset handler - NMI_Handler, // The NMI handler - HardFault_Handler, // The hard fault handler - MemManage_Handler, // The MPU fault handler - BusFault_Handler, // The bus fault handler - UsageFault_Handler, // The usage fault handler - __valid_user_code_checksum, // LPC MCU Checksum - 0, // Reserved - 0, // Reserved - 0, // Reserved - SVC_Handler, // SVCall handler - DebugMon_Handler, // Debug monitor handler - 0, // Reserved - PendSV_Handler, // The PendSV handler - SysTick_Handler, // The SysTick handler - - // Chip Level - LPC43 (M4) - DAC_IRQHandler, // 16 -#if defined (__USE_LPCOPEN) - M0APP_IRQHandler, // 17 CortexM4/M0 (LPC43XX ONLY) -#else - M0CORE_IRQHandler, // 17 -#endif - DMA_IRQHandler, // 18 - 0, // 19 - FLASH_EEPROM_IRQHandler, // 20 ORed flash Bank A, flash Bank B, EEPROM interrupts - ETH_IRQHandler, // 21 - SDIO_IRQHandler, // 22 - LCD_IRQHandler, // 23 - USB0_IRQHandler, // 24 - USB1_IRQHandler, // 25 - SCT_IRQHandler, // 26 - RIT_IRQHandler, // 27 - TIMER0_IRQHandler, // 28 - TIMER1_IRQHandler, // 29 - TIMER2_IRQHandler, // 30 - TIMER3_IRQHandler, // 31 - MCPWM_IRQHandler, // 32 - ADC0_IRQHandler, // 33 - I2C0_IRQHandler, // 34 - I2C1_IRQHandler, // 35 - SPI_IRQHandler, // 36 - ADC1_IRQHandler, // 37 - SSP0_IRQHandler, // 38 - SSP1_IRQHandler, // 39 - UART0_IRQHandler, // 40 - UART1_IRQHandler, // 41 - UART2_IRQHandler, // 42 - UART3_IRQHandler, // 43 - I2S0_IRQHandler, // 44 - I2S1_IRQHandler, // 45 - SPIFI_IRQHandler, // 46 - SGPIO_IRQHandler, // 47 - GPIO0_IRQHandler, // 48 - GPIO1_IRQHandler, // 49 - GPIO2_IRQHandler, // 50 - GPIO3_IRQHandler, // 51 - GPIO4_IRQHandler, // 52 - GPIO5_IRQHandler, // 53 - GPIO6_IRQHandler, // 54 - GPIO7_IRQHandler, // 55 - GINT0_IRQHandler, // 56 - GINT1_IRQHandler, // 57 - EVRT_IRQHandler, // 58 - CAN1_IRQHandler, // 59 - 0, // 60 -#if defined (__USE_LPCOPEN) - ADCHS_IRQHandler, // 61 ADCHS combined interrupt -#else - VADC_IRQHandler, // 61 -#endif - ATIMER_IRQHandler, // 62 - RTC_IRQHandler, // 63 - 0, // 64 - WDT_IRQHandler, // 65 - M0SUB_IRQHandler, // 66 - CAN0_IRQHandler, // 67 - QEI_IRQHandler, // 68 -}; - - -//***************************************************************************** -// Functions to carry out the initialization of RW and BSS data sections. These -// are written as separate functions rather than being inlined within the -// ResetISR() function in order to cope with MCUs with multiple banks of -// memory. -//***************************************************************************** - __attribute__((section(".after_vectors" -))) -void data_init(unsigned int romstart, unsigned int start, unsigned int len) { - unsigned int *pulDest = (unsigned int*) start; - unsigned int *pulSrc = (unsigned int*) romstart; - unsigned int loop; - for (loop = 0; loop < len; loop = loop + 4) - *pulDest++ = *pulSrc++; -} - -__attribute__ ((section(".after_vectors"))) -void bss_init(unsigned int start, unsigned int len) { - unsigned int *pulDest = (unsigned int*) start; - unsigned int loop; - for (loop = 0; loop < len; loop = loop + 4) - *pulDest++ = 0; -} - -//***************************************************************************** -// The following symbols are constructs generated by the linker, indicating -// the location of various points in the "Global Section Table". This table is -// created by the linker via the Code Red managed linker script mechanism. It -// contains the load address, execution address and length of each RW data -// section and the execution and length of each BSS (zero initialized) section. -//***************************************************************************** -extern unsigned int __data_section_table; -extern unsigned int __data_section_table_end; -extern unsigned int __bss_section_table; -extern unsigned int __bss_section_table_end; - -//***************************************************************************** -// Reset entry point for your code. -// Sets up a simple runtime environment and initializes the C/C++ -// library. -// -//***************************************************************************** -void ResetISR(void) { - -// ************************************************************* -// The following conditional block of code manually resets as -// much of the peripheral set of the LPC43 as possible. This is -// done because the LPC43 does not provide a means of triggering -// a full system reset under debugger control, which can cause -// problems in certain circumstances when debugging. -// -// You can prevent this code block being included if you require -// (for example when creating a final executable which you will -// not debug) by setting the define 'DONT_RESET_ON_RESTART'. -// -#ifndef DONT_RESET_ON_RESTART - - // Disable interrupts - __asm volatile ("cpsid i"); - // equivalent to CMSIS '__disable_irq()' function - - unsigned int *RESET_CONTROL = (unsigned int *) 0x40053100; - // LPC_RGU->RESET_CTRL0 @ 0x40053100 - // LPC_RGU->RESET_CTRL1 @ 0x40053104 - // Note that we do not use the CMSIS register access mechanism, - // as there is no guarantee that the project has been configured - // to use CMSIS. - - // Write to LPC_RGU->RESET_CTRL0 - *(RESET_CONTROL + 0) = 0x10DF1000; - // GPIO_RST|AES_RST|ETHERNET_RST|SDIO_RST|DMA_RST| - // USB1_RST|USB0_RST|LCD_RST|M0_SUB_RST - - // Write to LPC_RGU->RESET_CTRL1 - *(RESET_CONTROL + 1) = 0x01DFF7FF; - // M0APP_RST|CAN0_RST|CAN1_RST|I2S_RST|SSP1_RST|SSP0_RST| - // I2C1_RST|I2C0_RST|UART3_RST|UART1_RST|UART1_RST|UART0_RST| - // DAC_RST|ADC1_RST|ADC0_RST|QEI_RST|MOTOCONPWM_RST|SCT_RST| - // RITIMER_RST|TIMER3_RST|TIMER2_RST|TIMER1_RST|TIMER0_RST - - // Clear all pending interrupts in the NVIC - volatile unsigned int *NVIC_ICPR = (unsigned int *) 0xE000E280; - unsigned int irqpendloop; - for (irqpendloop = 0; irqpendloop < 8; irqpendloop++) { - *(NVIC_ICPR + irqpendloop) = 0xFFFFFFFF; - } - - // Reenable interrupts - __asm volatile ("cpsie i"); - // equivalent to CMSIS '__enable_irq()' function - -#endif // ifndef DONT_RESET_ON_RESTART -// ************************************************************* - -#if defined (__USE_LPCOPEN) - SystemInit(); -#endif - - // - // Copy the data sections from flash to SRAM. - // - unsigned int LoadAddr, ExeAddr, SectionLen; - unsigned int *SectionTableAddr; - - // Load base address of Global Section Table - SectionTableAddr = &__data_section_table; - - // Copy the data sections from flash to SRAM. - while (SectionTableAddr < &__data_section_table_end) { - LoadAddr = *SectionTableAddr++; - ExeAddr = *SectionTableAddr++; - SectionLen = *SectionTableAddr++; - data_init(LoadAddr, ExeAddr, SectionLen); - } - // At this point, SectionTableAddr = &__bss_section_table; - // Zero fill the bss segment - while (SectionTableAddr < &__bss_section_table_end) { - ExeAddr = *SectionTableAddr++; - SectionLen = *SectionTableAddr++; - bss_init(ExeAddr, SectionLen); - } - -#if !defined (__USE_LPCOPEN) -// LPCOpen init code deals with FP and VTOR initialisation -#if defined (__VFP_FP__) && !defined (__SOFTFP__) - /* - * Code to enable the Cortex-M4 FPU only included - * if appropriate build options have been selected. - * Code taken from Section 7.1, Cortex-M4 TRM (DDI0439C) - */ - // CPACR is located at address 0xE000ED88 - asm("LDR.W R0, =0xE000ED88"); - // Read CPACR - asm("LDR R1, [R0]"); - // Set bits 20-23 to enable CP10 and CP11 coprocessors - asm(" ORR R1, R1, #(0xF << 20)"); - // Write back the modified value to the CPACR - asm("STR R1, [R0]"); -#endif // (__VFP_FP__) && !(__SOFTFP__) - // ****************************** - // Check to see if we are running the code from a non-zero - // address (eg RAM, external flash), in which case we need - // to modify the VTOR register to tell the CPU that the - // vector table is located at a non-0x0 address. - - // Note that we do not use the CMSIS register access mechanism, - // as there is no guarantee that the project has been configured - // to use CMSIS. - unsigned int * pSCB_VTOR = (unsigned int *) 0xE000ED08; - if ((unsigned int *) g_pfnVectors != (unsigned int *) 0x00000000) { - // CMSIS : SCB->VTOR = <address of vector table> - *pSCB_VTOR = (unsigned int) g_pfnVectors; - } -#endif - -#if defined (__USE_CMSIS) - SystemInit(); -#endif - -#if defined (__cplusplus) - // - // Call C++ library initialisation - // - __libc_init_array(); -#endif - -#if defined (__REDLIB__) - // Call the Redlib library, which in turn calls main() - __main(); -#else - main(); -#endif - - // - // main() shouldn't return, but if it does, we'll just enter an infinite loop - // - while (1) { - ; - } -} - -//***************************************************************************** -// Default exception handlers. Override the ones here by defining your own -// handler routines in your application code. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void NMI_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void HardFault_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void MemManage_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void BusFault_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void UsageFault_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void SVC_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void DebugMon_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void PendSV_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void SysTick_Handler(void) { - while (1) { - } -} - -//***************************************************************************** -// -// Processor ends up here if an unexpected interrupt occurs or a specific -// handler is not present in the application code. -// -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void IntDefaultHandler(void) { - while (1) { - } -} diff --git a/hw/bsp/keil/board_mcb4300.c b/hw/bsp/keil/board_mcb4300.c deleted file mode 100644 index 1cd8b070e..000000000 --- a/hw/bsp/keil/board_mcb4300.c +++ /dev/null @@ -1,154 +0,0 @@ -/**************************************************************************/ -/*! - @file board_mcb4300.c - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#include "../board.h" - -#ifdef BOARD_MCB4300 - -//--------------------------------------------------------------------+ -// INCLUDE -//--------------------------------------------------------------------+ -#define BOARD_MAX_LEDS 8 - -#define BOARD_UART_PORT LPC_USART0 -#define BOARD_UART_PIN_PORT 2 -#define BOARD_UART_PIN_TX 0 -#define BOARD_UART_PIN_RX 1 - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ -static const uint8_t ledports[] = {6, 6, 6, 6, 6, 4, 4, 4}; -static const uint8_t ledbits[] = {24, 25, 26, 27, 28, 12, 13, 14}; - -const static struct { - uint8_t port; - uint8_t pin; -}leds[BOARD_MAX_LEDS] = { - {6, 24}, {6, 25}, {6, 26}, {6, 27}, - {4, 28}, {4, 12}, {4, 13}, {4, 14}}; - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// IMPLEMENTATION -//--------------------------------------------------------------------+ -void board_init(void) -{ - CGU_Init(); - -#if CFG_TUSB_OS == OPT_OS_NONE // TODO may move to main.c - SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE) / BOARD_TICKS_HZ); // 1 msec tick timer -#endif - - //------------- USB Bus power HOST ONLY-------------// - // Keil VBUS0 is P6_3 - scu_pinmux(0x6, 3, MD_PUP | MD_EZI, FUNC1); // P6_3 USB0_PWR_EN, USB0 VBus function - - // Keil VBUS1 is P9_5 - scu_pinmux(0x9, 5, MD_PUP | MD_EZI, FUNC2); // P9_5 USB1_PWR_EN, USB1 VBus function - - //------------- LEDs init, J21 must be installed -------------// - LPC_SCU->SFSPD_10 = 4; // GPIO6[24] - LPC_SCU->SFSPD_11 = 4; // GPIO6[25] - LPC_SCU->SFSPD_12 = 4; // GPIO6[26] - LPC_SCU->SFSPD_13 = 4; // GPIO6[27] - LPC_SCU->SFSPD_14 = 4; // GPIO6[28] - LPC_SCU->SFSP9_0 = 0; // GPIO4[12] - LPC_SCU->SFSP9_1 = 0; // GPIO4[13] - LPC_SCU->SFSP9_2 = 0; // GPIO4[14] - - for(uint32_t i=0; i<BOARD_MAX_LEDS; i++) - { - GPIO_SetDir(leds[i].port, BIT_(leds[i].pin), 1); // output - } - - //------------- UART -------------// - scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN , FUNC1); - scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN|MD_EZI|MD_ZI, FUNC1); - - UART_CFG_Type UARTConfigStruct; - UART_ConfigStructInit(&UARTConfigStruct); - UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE; - UARTConfigStruct.Clock_Speed = 0; - - UART_Init(BOARD_UART_PORT, &UARTConfigStruct); - UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit -} - -//--------------------------------------------------------------------+ -// LEDS -//--------------------------------------------------------------------+ -void board_leds(uint32_t on_mask, uint32_t off_mask) -{ - for (uint32_t i=0; i<BOARD_MAX_LEDS; i++) - { - if ( on_mask & BIT_(i)) - { - GPIO_SetValue(leds[i].port, BIT_(leds[i].pin)); - }else if ( off_mask & BIT_(i)) // on_mask take precedence over off_mask - { - GPIO_ClearValue(leds[i].port, BIT_(leds[i].pin)); - } - } -} - -//--------------------------------------------------------------------+ -// BUTTONS -//--------------------------------------------------------------------+ -uint32_t board_buttons(void) -{ - return 0; // TODO buttons for mcb4300 -} - -//--------------------------------------------------------------------+ -// UART -//--------------------------------------------------------------------+ -uint8_t board_uart_getchar(void) -{ - return UART_ReceiveByte(BOARD_UART_PORT); -} - -void board_uart_putchar(uint8_t c) -{ - UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING); -} - -#endif diff --git a/hw/bsp/keil/board_mcb4300.h b/hw/bsp/keil/board_mcb4300.h deleted file mode 100644 index b414e142a..000000000 --- a/hw/bsp/keil/board_mcb4300.h +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************/ -/*! - @file board_mcb4300.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#ifndef _TUSB_BOARD_MCB4300_H_ -#define _TUSB_BOARD_MCB4300_H_ - -#include "LPC43xx.h" -#include "lpc43xx_scu.h" -#include "lpc43xx_cgu.h" -#include "lpc43xx_gpio.h" -#include "lpc43xx_uart.h" - -#ifdef __cplusplus - extern "C" { -#endif - -#define CFG_PRINTF_TARGET PRINTF_TARGET_UART - - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_BOARD_MCB4300_H_ */ diff --git a/hw/bsp/lpcxpresso/board_lpclink2.c b/hw/bsp/lpcxpresso/board_lpclink2.c deleted file mode 100644 index ea2610f55..000000000 --- a/hw/bsp/lpcxpresso/board_lpclink2.c +++ /dev/null @@ -1,126 +0,0 @@ -/**************************************************************************/ -/*! - @file board_lpclink2.c - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#include "../board.h" - -#if BOARD == BOARD_LPCLINK2 - -#define BOARD_UART_PORT LPC_USART0 -#define BOARD_UART_PIN_PORT 0x0f -#define BOARD_UART_PIN_TX 10 // PF.10 : UART0_TXD -#define BOARD_UART_PIN_RX 11 // PF.11 : UART0_RXD - -#define BOARD_MAX_LEDS 1 - -const static struct { - uint8_t port; - uint8_t pin; -}leds[BOARD_MAX_LEDS] = { {0, 8} }; - -void board_init(void) -{ - CGU_Init(); - -#if CFG_TUSB_OS == OPT_OS_NONE // TODO may move to main.c - SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE) / BOARD_TICKS_HZ); // 1 msec tick timer -#endif - - //------------- USB -------------// - - - //------------- LED -------------// - for (uint8_t i=0; i<BOARD_MAX_LEDS; i++) - { - scu_pinmux(leds[i].port, leds[i].pin, MD_PUP|MD_EZI|MD_ZI, FUNC0); - GPIO_SetDir(leds[i].port, BIT_(leds[i].pin), 1); // output - } - - -#if CFG_UART_ENABLE - //------------- UART -------------// - scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN, FUNC1); - scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN | MD_EZI | MD_ZI, FUNC1); - - UART_CFG_Type UARTConfigStruct; - UART_ConfigStructInit(&UARTConfigStruct); - UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE; - UARTConfigStruct.Clock_Speed = 0; - - UART_Init(BOARD_UART_PORT, &UARTConfigStruct); - UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit -#endif -} - -//--------------------------------------------------------------------+ -// LEDS -//--------------------------------------------------------------------+ -void board_leds(uint32_t on_mask, uint32_t off_mask) -{ - for (uint32_t i=0; i<BOARD_MAX_LEDS; i++) - { - if ( on_mask & BIT_(i)) - { - GPIO_SetValue(leds[i].port, BIT_(leds[i].pin)); - }else if ( off_mask & BIT_(i)) // on_mask take precedence over off_mask - { - GPIO_ClearValue(leds[i].port, BIT_(leds[i].pin)); - } - } -} - -//--------------------------------------------------------------------+ -// UART -//--------------------------------------------------------------------+ -#if CFG_UART_ENABLE -uint32_t board_uart_send(uint8_t *buffer, uint32_t length) -{ - return UART_Send(BOARD_UART_PORT, buffer, length, BLOCKING); -} - -uint32_t board_uart_recv(uint8_t *buffer, uint32_t length) -{ - return UART_Receive(BOARD_UART_PORT, buffer, length, BLOCKING); -} - -uint8_t board_uart_getchar(void) -{ - return UART_ReceiveByte(BOARD_UART_PORT); -} -#endif - -#endif diff --git a/hw/bsp/lpcxpresso/board_lpclink2.h b/hw/bsp/lpcxpresso/board_lpclink2.h deleted file mode 100644 index ddb2f80ec..000000000 --- a/hw/bsp/lpcxpresso/board_lpclink2.h +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************/ -/*! - @file board_lpclink2.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#ifndef _TUSB_BOARD_LPCLINK2_H_ -#define _TUSB_BOARD_LPCLINK2_H_ - -#ifdef __cplusplus - extern "C" { -#endif - -#include "LPC43xx.h" -#include "lpc43xx_scu.h" -#include "lpc43xx_cgu.h"a -#include "lpc43xx_gpio.h" -#include "lpc43xx_uart.h" -#include "lpc43xx_i2c.h" - -#define CFG_PRINTF_TARGET PRINTF_TARGET_UART - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_BOARD_LPCLINK2_H_ */ diff --git a/hw/bsp/lpcxpresso/board_lpcxpresso11u14.c b/hw/bsp/lpcxpresso/board_lpcxpresso11u14.c deleted file mode 100644 index 7b9705436..000000000 --- a/hw/bsp/lpcxpresso/board_lpcxpresso11u14.c +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************/ -/*! - @file board_lpcxpresso11u14.c - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#include "../board.h" - -#ifdef BOARD_LPCXPRESSO11U14 - -#define LED_PORT (0) -#define LED_PIN (7) -#define LED_ON (1) - -const static struct { - uint8_t port; - uint8_t pin; -} buttons[] = -{ - {1, 22 }, // Joystick up - {1, 20 }, // Joystick down - {1, 23 }, // Joystick left - {1, 21 }, // Joystick right - {1, 19 }, // Joystick press - {0, 1 }, // SW3 -// {1, 4 }, // SW4 (require to remove J28) -}; - - -enum { - BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0]) -}; - -void board_init(void) -{ - SystemInit(); - -#if CFG_TUSB_OS == OPT_OS_NONE // TODO may move to main.c - SysTick_Config(SystemCoreClock / BOARD_TICKS_HZ); // 1 msec tick timer -#endif - - GPIOInit(); - - //------------- LED -------------// - GPIOSetDir(LED_PORT, LED_PIN, 1); - - //------------- BUTTON -------------// - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOSetDir(buttons[i].port, buttons[i].pin, 0); - - //------------- UART -------------// - UARTInit(CFG_UART_BAUDRATE); -} - -//--------------------------------------------------------------------+ -// LEDS -//--------------------------------------------------------------------+ -void board_leds(uint32_t on_mask, uint32_t off_mask) -{ - if (on_mask & BIT_(0)) - { - GPIOSetBitValue(LED_PORT, LED_PIN, LED_ON); - }else if (off_mask & BIT_(0)) - { - GPIOSetBitValue(LED_PORT, LED_PIN, 1 - LED_ON); - } -} - -//--------------------------------------------------------------------+ -// Buttons -//--------------------------------------------------------------------+ -static bool button_read(uint8_t id) -{ - return !GPIOGetPinValue(buttons[id].port, buttons[id].pin); // button is active low -} - -uint32_t board_buttons(void) -{ - uint32_t result = 0; - - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0); - - return result; -} - -//--------------------------------------------------------------------+ -// UART -//--------------------------------------------------------------------+ -void board_uart_putchar(uint8_t c) -{ - UARTSend(&c, 1); -} - -uint8_t board_uart_getchar(void) -{ -// *buffer = get_key(); TODO cannot find available code for uart getchar - return 0; -} - -#endif diff --git a/hw/bsp/lpcxpresso/board_lpcxpresso11u14.h b/hw/bsp/lpcxpresso/board_lpcxpresso11u14.h deleted file mode 100644 index 5da48c33b..000000000 --- a/hw/bsp/lpcxpresso/board_lpcxpresso11u14.h +++ /dev/null @@ -1,57 +0,0 @@ -/**************************************************************************/ -/*! - @file board_lpcxpresso11u14.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#ifndef _TUSB_BOARD_LPCXPRESSO11U14_H_ -#define _TUSB_BOARD_LPCXPRESSO11U14_H_ - -#ifdef __cplusplus - extern "C" { -#endif - -#include "LPC11Uxx.h" -#include "lpc11uxx_gpio.h" -#include "lpc11uxx_uart.h" - -//#define CFG_PRINTF_TARGET PRINTF_TARGET_SEMIHOST -#define CFG_PRINTF_TARGET PRINTF_TARGET_UART - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_BOARD_LPCXPRESSO11U14_H_ */ diff --git a/hw/bsp/lpcxpresso11u68/board_lpcxpresso11u68.c b/hw/bsp/lpcxpresso11u68/board_lpcxpresso11u68.c index 854d8cda7..4349bbc68 100644 --- a/hw/bsp/lpcxpresso11u68/board_lpcxpresso11u68.c +++ b/hw/bsp/lpcxpresso11u68/board_lpcxpresso11u68.c @@ -36,16 +36,15 @@ */ /**************************************************************************/ -#include "../board.h" - #ifdef BOARD_LPCXPRESSO11U68 -#define LED_PORT (1) -#define LED_PIN (31) -#define LED_ON (0) -#define LED_OFF (1) +#include "../board.h" + +#define LED_PORT 2 +#define LED_PIN 17 +#define LED_STATE_ON 0 -const static struct { +static const struct { uint8_t port; uint8_t pin; } buttons[] = { { 0, 1 } }; @@ -54,38 +53,78 @@ enum { BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0]) }; +/* System oscillator rate and RTC oscillator rate */ +const uint32_t OscRateIn = 12000000; +const uint32_t RTCOscRateIn = 32768; + +/* Pin muxing table, only items that need changing from their default pin + state are in this table. Not every pin is mapped. */ +static const PINMUX_GRP_T pinmuxing[] = +{ + {0, 3, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN)}, // USB VBUS + {0, 18, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN)}, // UART0 RX + {0, 19, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN)}, // UART0 TX + {2, 0, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // XTALIN + {2, 1, (IOCON_FUNC1 | IOCON_MODE_INACT)}, // XTALOUT +}; + +// Invoked by startup code +void SystemInit(void) +{ + /* Enable IOCON clock */ + Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON); + Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); + Chip_SetupXtalClocking(); +} + void board_init(void) { - SystemInit(); + SystemCoreClockUpdate(); -#if CFG_TUSB_OS == OPT_OS_NONE // TODO may move to main.c +#if CFG_TUSB_OS == OPT_OS_NONE SysTick_Config(SystemCoreClock / BOARD_TICKS_HZ); // 1 msec tick timer #endif - GPIOInit(); + Chip_GPIO_Init(LPC_GPIO); //------------- LED -------------// - GPIOSetDir(LED_PORT, LED_PIN, 1); + Chip_GPIO_SetPinDIROutput(LPC_GPIO, LED_PORT, LED_PIN); //------------- BUTTON -------------// - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOSetDir(buttons[i].port, buttons[i].pin, 0); + //for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOSetDir(buttons[i].port, buttons[i].pin, 0); //------------- UART -------------// - UARTInit(CFG_UART_BAUDRATE); + //UARTInit(CFG_UART_BAUDRATE); + + // USB + Chip_USB_Init(); // Setup PLL clock, and power } +/*------------------------------------------------------------------*/ +/* TUSB HAL MILLISECOND + *------------------------------------------------------------------*/ +#if CFG_TUSB_OS == OPT_OS_NONE + +volatile uint32_t system_ticks = 0; + +void SysTick_Handler (void) +{ + system_ticks++; +} + +uint32_t tusb_hal_millis(void) +{ + return board_tick2ms(system_ticks); +} + +#endif + //--------------------------------------------------------------------+ // LEDS //--------------------------------------------------------------------+ -void board_leds(uint32_t on_mask, uint32_t off_mask) +void board_led_control(bool state) { - if (on_mask & BIT_(0)) - { - GPIOSetBitValue(LED_PORT, LED_PIN, LED_ON); - }else if (off_mask & BIT_(0)) - { - GPIOSetBitValue(LED_PORT, LED_PIN, LED_OFF); - } + Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON)); } //--------------------------------------------------------------------+ @@ -94,7 +133,8 @@ void board_leds(uint32_t on_mask, uint32_t off_mask) uint32_t board_buttons(void) { // for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOGetPinValue(buttons[i].port, buttons[i].pin); - return GPIOGetPinValue(buttons[0].port, buttons[0].pin) ? 0 : 1; // button is active low +// return GPIOGetPinValue(buttons[0].port, buttons[0].pin) ? 0 : 1; // button is active low + return 0; } //--------------------------------------------------------------------+ @@ -102,7 +142,8 @@ uint32_t board_buttons(void) //--------------------------------------------------------------------+ void board_uart_putchar(uint8_t c) { - UARTSend(&c, 1); + (void) c; + //UARTSend(&c, 1); } uint8_t board_uart_getchar(void) diff --git a/hw/bsp/lpcxpresso11u68/board_lpcxpresso11u68.h b/hw/bsp/lpcxpresso11u68/board_lpcxpresso11u68.h index fa62315e5..74e68e5e2 100644 --- a/hw/bsp/lpcxpresso11u68/board_lpcxpresso11u68.h +++ b/hw/bsp/lpcxpresso11u68/board_lpcxpresso11u68.h @@ -43,12 +43,7 @@ extern "C" { #endif -#include "LPC11Uxx.h" -#include "lpc11uxx_gpio.h" -#include "lpc11uxx_uart.h" - -//#define CFG_PRINTF_TARGET PRINTF_TARGET_SEMIHOST -#define CFG_PRINTF_TARGET PRINTF_TARGET_UART +#include "chip.h" #ifdef __cplusplus } diff --git a/hw/bsp/lpcxpresso11u68/startup/xpresso/cr_startup_lpc11u.c b/hw/bsp/lpcxpresso11u68/startup/xpresso/cr_startup_lpc11u.c deleted file mode 100644 index 582b71f15..000000000 --- a/hw/bsp/lpcxpresso11u68/startup/xpresso/cr_startup_lpc11u.c +++ /dev/null @@ -1,382 +0,0 @@ -//***************************************************************************** -// +--+ -// | ++----+ -// +-++ | -// | | -// +-+--+ | -// | +--+--+ -// +----+ Copyright (c) 2011 Code Red Technologies Ltd. -// -// Microcontroller Startup code for use with Red Suite -// -// Version : 110323 -// -// Software License Agreement -// -// The software is owned by Code Red Technologies and/or its suppliers, and is -// protected under applicable copyright laws. All rights are reserved. Any -// use in violation of the foregoing restrictions may subject the user to criminal -// sanctions under applicable laws, as well as to civil liability for the breach -// of the terms and conditions of this license. -// -// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED -// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. -// USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT -// TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH -// CODE RED TECHNOLOGIES LTD. -// -//***************************************************************************** -#if defined (__cplusplus) -#ifdef __REDLIB__ -#error Redlib does not support C++ -#else -//***************************************************************************** -// -// The entry point for the C++ library startup -// -//***************************************************************************** -extern "C" { - extern void __libc_init_array(void); -} -#endif -#endif - -#define WEAK __attribute__ ((weak)) -#define ALIAS(f) __attribute__ ((weak, alias (#f))) -#define SVCall_Handler SVC_Handler - -// Code Red - if CMSIS is being used, then SystemInit() routine -// will be called by startup code rather than in application's main() -#if defined (__USE_CMSIS) -#include "LPC11Uxx.h" -#endif - -//***************************************************************************** -#if defined (__cplusplus) -extern "C" { -#endif - -//***************************************************************************** -// -// Forward declaration of the default handlers. These are aliased. -// When the application defines a handler (with the same name), this will -// automatically take precedence over these weak definitions -// -//***************************************************************************** - void ResetISR(void); -WEAK void NMI_Handler(void); -WEAK void HardFault_Handler(void); -WEAK void SVCall_Handler(void); -WEAK void PendSV_Handler(void); -WEAK void SysTick_Handler(void); -WEAK void IntDefaultHandler(void); -//***************************************************************************** -// -// Forward declaration of the specific IRQ handlers. These are aliased -// to the IntDefaultHandler, which is a 'forever' loop. When the application -// defines a handler (with the same name), this will automatically take -// precedence over these weak definitions -// -//***************************************************************************** - -void FLEX_INT0_IRQHandler (void) ALIAS(IntDefaultHandler); -void FLEX_INT1_IRQHandler (void) ALIAS(IntDefaultHandler); -void FLEX_INT2_IRQHandler (void) ALIAS(IntDefaultHandler); -void FLEX_INT3_IRQHandler (void) ALIAS(IntDefaultHandler); -void FLEX_INT4_IRQHandler (void) ALIAS(IntDefaultHandler); -void FLEX_INT5_IRQHandler (void) ALIAS(IntDefaultHandler); -void FLEX_INT6_IRQHandler (void) ALIAS(IntDefaultHandler); -void FLEX_INT7_IRQHandler (void) ALIAS(IntDefaultHandler); -void GINT0_IRQHandler (void) ALIAS(IntDefaultHandler); -void GINT1_IRQHandler (void) ALIAS(IntDefaultHandler); -void SSP1_IRQHandler (void) ALIAS(IntDefaultHandler); -void I2C_IRQHandler (void) ALIAS(IntDefaultHandler); -void TIMER16_0_IRQHandler (void) ALIAS(IntDefaultHandler); -void TIMER16_1_IRQHandler (void) ALIAS(IntDefaultHandler); -void TIMER32_0_IRQHandler (void) ALIAS(IntDefaultHandler); -void TIMER32_1_IRQHandler (void) ALIAS(IntDefaultHandler); -void SSP0_IRQHandler (void) ALIAS(IntDefaultHandler); -void UART_IRQHandler (void) ALIAS(IntDefaultHandler); -void USB_IRQHandler (void) ALIAS(IntDefaultHandler); -void USB_FIQHandler (void) ALIAS(IntDefaultHandler); -void ADC_IRQHandler (void) ALIAS(IntDefaultHandler); -void WDT_IRQHandler (void) ALIAS(IntDefaultHandler); -void BOD_IRQHandler (void) ALIAS(IntDefaultHandler); -void FMC_IRQHandler (void) ALIAS(IntDefaultHandler); -void USBWakeup_IRQHandler (void) ALIAS(IntDefaultHandler); - -//***************************************************************************** -// -// The entry point for the application. -// __main() is the entry point for redlib based applications -// main() is the entry point for newlib based applications -// -//***************************************************************************** -// -// The entry point for the application. -// __main() is the entry point for Redlib based applications -// main() is the entry point for Newlib based applications -// -//***************************************************************************** -#if defined (__REDLIB__) -extern void __main(void); -#endif -extern int main(void); -//***************************************************************************** -// -// External declaration for the pointer to the stack top from the Linker Script -// -//***************************************************************************** -extern void _vStackTop(void); - -//***************************************************************************** -#if defined (__cplusplus) -} // extern "C" -#endif -//***************************************************************************** -// -// The vector table. Note that the proper constructs must be placed on this to -// ensure that it ends up at physical address 0x0000.0000. -// -//***************************************************************************** -extern void (* const g_pfnVectors[])(void); -__attribute__ ((section(".isr_vector"))) -void (* const g_pfnVectors[])(void) = { - &_vStackTop, // The initial stack pointer - ResetISR, // The reset handler - NMI_Handler, // The NMI handler - HardFault_Handler, // The hard fault handler - 0, // Reserved - 0, // Reserved - 0, // Reserved - 0, // Reserved - 0, // Reserved - 0, // Reserved - 0, // Reserved - SVCall_Handler, // SVCall handler - 0, // Reserved - 0, // Reserved - PendSV_Handler, // The PendSV handler - SysTick_Handler, // The SysTick handler - - // LPC11U specific handlers - FLEX_INT0_IRQHandler, // 0 - GPIO pin interrupt 0 - FLEX_INT1_IRQHandler, // 1 - GPIO pin interrupt 1 - FLEX_INT2_IRQHandler, // 2 - GPIO pin interrupt 2 - FLEX_INT3_IRQHandler, // 3 - GPIO pin interrupt 3 - FLEX_INT4_IRQHandler, // 4 - GPIO pin interrupt 4 - FLEX_INT5_IRQHandler, // 5 - GPIO pin interrupt 5 - FLEX_INT6_IRQHandler, // 6 - GPIO pin interrupt 6 - FLEX_INT7_IRQHandler, // 7 - GPIO pin interrupt 7 - GINT0_IRQHandler, // 8 - GPIO GROUP0 interrupt - GINT1_IRQHandler, // 9 - GPIO GROUP1 interrupt - 0, // 10 - Reserved - 0, // 11 - Reserved - 0, // 12 - Reserved - 0, // 13 - Reserved - SSP1_IRQHandler, // 14 - SPI/SSP1 Interrupt - I2C_IRQHandler, // 15 - I2C0 - TIMER16_0_IRQHandler, // 16 - CT16B0 (16-bit Timer 0) - TIMER16_1_IRQHandler, // 17 - CT16B1 (16-bit Timer 1) - TIMER32_0_IRQHandler, // 18 - CT32B0 (32-bit Timer 0) - TIMER32_1_IRQHandler, // 19 - CT32B1 (32-bit Timer 1) - SSP0_IRQHandler, // 20 - SPI/SSP0 Interrupt - UART_IRQHandler, // 21 - UART0 - USB_IRQHandler, // 22 - USB IRQ - USB_FIQHandler, // 23 - USB FIQ - ADC_IRQHandler, // 24 - ADC (A/D Converter) - WDT_IRQHandler, // 25 - WDT (Watchdog Timer) - BOD_IRQHandler, // 26 - BOD (Brownout Detect) - FMC_IRQHandler, // 27 - IP2111 Flash Memory Controller - 0, // 28 - Reserved - 0, // 29 - Reserved - USBWakeup_IRQHandler, // 30 - USB wake-up interrupt - 0, // 31 - Reserved -}; - -//***************************************************************************** -// Functions to carry out the initialization of RW and BSS data sections. These -// are written as separate functions rather than being inlined within the -// ResetISR() function in order to cope with MCUs with multiple banks of -// memory. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void data_init(unsigned int romstart, unsigned int start, unsigned int len) { - unsigned int *pulDest = (unsigned int*) start; - unsigned int *pulSrc = (unsigned int*) romstart; - unsigned int loop; - for (loop = 0; loop < len; loop = loop + 4) - *pulDest++ = *pulSrc++; -} - -__attribute__ ((section(".after_vectors"))) -void bss_init(unsigned int start, unsigned int len) { - unsigned int *pulDest = (unsigned int*) start; - unsigned int loop; - for (loop = 0; loop < len; loop = loop + 4) - *pulDest++ = 0; -} - -#ifndef USE_OLD_STYLE_DATA_BSS_INIT -//***************************************************************************** -// The following symbols are constructs generated by the linker, indicating -// the location of various points in the "Global Section Table". This table is -// created by the linker via the Code Red managed linker script mechanism. It -// contains the load address, execution address and length of each RW data -// section and the execution and length of each BSS (zero initialized) section. -//***************************************************************************** -extern unsigned int __data_section_table; -extern unsigned int __data_section_table_end; -extern unsigned int __bss_section_table; -extern unsigned int __bss_section_table_end; -#else -//***************************************************************************** -// The following symbols are constructs generated by the linker, indicating -// the load address, execution address and length of the RW data section and -// the execution and length of the BSS (zero initialized) section. -// Note that these symbols are not normally used by the managed linker script -// mechanism in Red Suite/LPCXpresso 3.6 (Windows) and LPCXpresso 3.8 (Linux). -// They are provide here simply so this startup code can be used with earlier -// versions of Red Suite which do not support the more advanced managed linker -// script mechanism introduced in the above version. To enable their use, -// define "USE_OLD_STYLE_DATA_BSS_INIT". -//***************************************************************************** -extern unsigned int _etext; -extern unsigned int _data; -extern unsigned int _edata; -extern unsigned int _bss; -extern unsigned int _ebss; -#endif - - -//***************************************************************************** -// Reset entry point for your code. -// Sets up a simple runtime environment and initializes the C/C++ -// library. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void -ResetISR(void) { - -#ifndef USE_OLD_STYLE_DATA_BSS_INIT - // - // Copy the data sections from flash to SRAM. - // - unsigned int LoadAddr, ExeAddr, SectionLen; - unsigned int *SectionTableAddr; - - // Load base address of Global Section Table - SectionTableAddr = &__data_section_table; - - // Copy the data sections from flash to SRAM. - while (SectionTableAddr < &__data_section_table_end) { - LoadAddr = *SectionTableAddr++; - ExeAddr = *SectionTableAddr++; - SectionLen = *SectionTableAddr++; - data_init(LoadAddr, ExeAddr, SectionLen); - } - // At this point, SectionTableAddr = &__bss_section_table; - // Zero fill the bss segment - while (SectionTableAddr < &__bss_section_table_end) { - ExeAddr = *SectionTableAddr++; - SectionLen = *SectionTableAddr++; - bss_init(ExeAddr, SectionLen); - } -#else - // Use Old Style Data and BSS section initialization. - // This will only initialize a single RAM bank. - unsigned int * LoadAddr, *ExeAddr, *EndAddr, SectionLen; - - // Copy the data segment from flash to SRAM. - LoadAddr = &_etext; - ExeAddr = &_data; - EndAddr = &_edata; - SectionLen = (void*)EndAddr - (void*)ExeAddr; - data_init((unsigned int)LoadAddr, (unsigned int)ExeAddr, SectionLen); - // Zero fill the bss segment - ExeAddr = &_bss; - EndAddr = &_ebss; - SectionLen = (void*)EndAddr - (void*)ExeAddr; - bss_init ((unsigned int)ExeAddr, SectionLen); -#endif - -#ifdef __USE_CMSIS - SystemInit(); -#endif - -#if defined (__cplusplus) - // - // Call C++ library initialisation - // - __libc_init_array(); -#endif - -#if defined (__REDLIB__) - // Call the Redlib library, which in turn calls main() - __main() ; -#else - main(); -#endif - // - // main() shouldn't return, but if it does, we'll just enter an infinite loop - // - while (1) { - ; - } -} - -//***************************************************************************** -// Default exception handlers. Override the ones here by defining your own -// handler routines in your application code. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void NMI_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void HardFault_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void SVCall_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void PendSV_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void SysTick_Handler(void) -{ - while(1) - { - } -} - -//***************************************************************************** -// -// Processor ends up here if an unexpected interrupt occurs or a specific -// handler is not present in the application code. -// -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void IntDefaultHandler(void) -{ - while(1) - { - } -} - diff --git a/hw/bsp/lpcxpresso1347/board_lpcxpresso1347.c b/hw/bsp/lpcxpresso1347/board_lpcxpresso1347.c index d72402d66..95812f84d 100644 --- a/hw/bsp/lpcxpresso1347/board_lpcxpresso1347.c +++ b/hw/bsp/lpcxpresso1347/board_lpcxpresso1347.c @@ -36,16 +36,14 @@ */ /**************************************************************************/ -#include "../board.h" - #ifdef BOARD_LPCXPRESSO1347 -#define LED_PORT (0) -#define LED_PIN (7) -#define LED_ON (1) -#define LED_OFF (0) +#include "../board.h" + +#define LED_PORT 0 +#define LED_PIN 7 -const static struct { +static const struct { uint8_t port; uint8_t pin; } buttons[] = @@ -63,55 +61,103 @@ enum { BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0]) }; +/* System oscillator rate and RTC oscillator rate */ +const uint32_t OscRateIn = 12000000; +const uint32_t ExtRateIn = 0; + +/* Pin muxing table, only items that need changing from their default pin + state are in this table. */ +static const PINMUX_GRP_T pinmuxing[] = +{ + {0, 1, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)}, /* PIO0_1 used for CLKOUT */ + {0, 2, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_PULLUP)}, /* PIO0_2 used for SSEL */ + {0, 3, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)}, /* PIO0_3 used for USB_VBUS */ + {0, 6, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)}, /* PIO0_6 used for USB_CONNECT */ + {0, 8, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)}, /* PIO0_8 used for MISO0 */ + {0, 9, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)}, /* PIO0_9 used for MOSI0 */ + {0, 11, (IOCON_FUNC2 | IOCON_ADMODE_EN | IOCON_FILT_DIS)}, /* PIO0_11 used for AD0 */ + {0, 18, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)}, /* PIO0_18 used for RXD */ + {0, 19, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)}, /* PIO0_19 used for TXD */ + {1, 29, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)}, /* PIO1_29 used for SCK0 */ +}; + +// Invoked by startup code +void SystemInit(void) +{ + /* Enable IOCON clock */ + Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON); + Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); + Chip_SetupXtalClocking(); +} void board_init(void) { - SystemInit(); + SystemCoreClockUpdate(); -#if CFG_TUSB_OS == OPT_OS_NONE // TODO may move to main.c +#if CFG_TUSB_OS == OPT_OS_NONE SysTick_Config(SystemCoreClock / BOARD_TICKS_HZ); // 1 msec tick timer #endif - GPIOInit(); + Chip_GPIO_Init(LPC_GPIO_PORT); //------------- LED -------------// - GPIOSetDir(LED_PORT, LED_PIN, 1); + Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, LED_PORT, LED_PIN); //------------- BUTTON -------------// - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOSetDir(buttons[i].port, BIT_(buttons[i].pin), 0); +// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOSetDir(buttons[i].port, TU_BIT(buttons[i].pin), 0); //------------- UART -------------// - UARTInit(CFG_UART_BAUDRATE); + //UARTInit(CFG_UART_BAUDRATE); + // USB + Chip_USB_Init(); // Setup PLL clock, and power } +/*------------------------------------------------------------------*/ +/* TUSB HAL MILLISECOND + *------------------------------------------------------------------*/ +#if CFG_TUSB_OS == OPT_OS_NONE + +volatile uint32_t system_ticks = 0; + +void SysTick_Handler (void) +{ + system_ticks++; +} + +uint32_t tusb_hal_millis(void) +{ + return board_tick2ms(system_ticks); +} + +#endif + //--------------------------------------------------------------------+ // LEDS //--------------------------------------------------------------------+ -void board_leds(uint32_t on_mask, uint32_t off_mask) +void board_led_control(bool state) { - if (on_mask & BIT_(0)) - { - GPIOSetBitValue(LED_PORT, LED_PIN, LED_ON); - }else if (off_mask & BIT_(0)) - { - GPIOSetBitValue(LED_PORT, LED_PIN, LED_OFF); - } + Chip_GPIO_SetPinState(LPC_GPIO_PORT, LED_PORT, LED_PIN, state); } + //--------------------------------------------------------------------+ // BUTTONS //--------------------------------------------------------------------+ +#if 0 static bool button_read(uint8_t id) { - return !GPIOGetPinValue(buttons[id].port, buttons[id].pin); // button is active low + (void) id; +// return !GPIOGetPinValue(buttons[id].port, buttons[id].pin); // button is active low + return 0; } +#endif uint32_t board_buttons(void) { uint32_t result = 0; - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0); +// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? TU_BIT(i) : 0); return result; } @@ -121,7 +167,8 @@ uint32_t board_buttons(void) //--------------------------------------------------------------------+ void board_uart_putchar(uint8_t c) { - UARTSend(&c, 1); + (void) c; +// UARTSend(&c, 1); } uint8_t board_uart_getchar(void) diff --git a/hw/bsp/lpcxpresso1347/board_lpcxpresso1347.h b/hw/bsp/lpcxpresso1347/board_lpcxpresso1347.h index 643aec7f3..81a631fb5 100644 --- a/hw/bsp/lpcxpresso1347/board_lpcxpresso1347.h +++ b/hw/bsp/lpcxpresso1347/board_lpcxpresso1347.h @@ -43,11 +43,7 @@ extern "C" { #endif -#include "LPC13Uxx.h" -#include "gpio.h" -#include "uart.h" - -#define CFG_PRINTF_TARGET PRINTF_TARGET_UART +#include "chip.h" #ifdef __cplusplus } diff --git a/hw/bsp/lpcxpresso1347/startup/xpresso/cr_startup_lpc13u.c b/hw/bsp/lpcxpresso1347/startup/xpresso/cr_startup_lpc13u.c deleted file mode 100644 index 8b5d7eebb..000000000 --- a/hw/bsp/lpcxpresso1347/startup/xpresso/cr_startup_lpc13u.c +++ /dev/null @@ -1,354 +0,0 @@ -//***************************************************************************** -// +--+ -// | ++----+ -// +-++ | -// | | -// +-+--+ | -// | +--+--+ -// +----+ Copyright (c) 2012 Code Red Technologies Ltd. -// -// NXP LPC13U Microcontroller Startup code for use with Red Suite -// -// Version : 120202 -// -// Software License Agreement -// -// The software is owned by Code Red Technologies and/or its suppliers, and is -// protected under applicable copyright laws. All rights are reserved. Any -// use in violation of the foregoing restrictions may subject the user to criminal -// sanctions under applicable laws, as well as to civil liability for the breach -// of the terms and conditions of this license. -// -// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED -// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. -// USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT -// TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH -// CODE RED TECHNOLOGIES LTD. -// -//***************************************************************************** -#if defined (__cplusplus) -#ifdef __REDLIB__ -#error Redlib does not support C++ -#else -//***************************************************************************** -// -// The entry point for the C++ library startup -// -//***************************************************************************** -extern "C" { - extern void __libc_init_array(void); -} -#endif -#endif - -#define WEAK __attribute__ ((weak)) -#define ALIAS(f) __attribute__ ((weak, alias (#f))) - -// Code Red - if CMSIS is being used, then SystemInit() routine -// will be called by startup code rather than in application's main() -#if defined (__USE_CMSIS) -#include "LPC13Uxx.h" -#endif - -//***************************************************************************** -#if defined (__cplusplus) -extern "C" { -#endif - -//***************************************************************************** -// -// Forward declaration of the default handlers. These are aliased. -// When the application defines a handler (with the same name), this will -// automatically take precedence over these weak definitions -// -//***************************************************************************** -void ResetISR(void); -WEAK void NMI_Handler(void); -WEAK void HardFault_Handler(void); -WEAK void MemManage_Handler(void); -WEAK void BusFault_Handler(void); -WEAK void UsageFault_Handler(void); -WEAK void SVC_Handler(void); -WEAK void DebugMon_Handler(void); -WEAK void PendSV_Handler(void); -WEAK void SysTick_Handler(void); -WEAK void IntDefaultHandler(void); -//***************************************************************************** -// -// Forward declaration of the specific IRQ handlers. These are aliased -// to the IntDefaultHandler, which is a 'forever' loop. When the application -// defines a handler (with the same name), this will automatically take -// precedence over these weak definitions -// -//***************************************************************************** -void PIN_INT0_IRQHandler(void) ALIAS(IntDefaultHandler); -void PIN_INT1_IRQHandler(void) ALIAS(IntDefaultHandler); -void PIN_INT2_IRQHandler(void) ALIAS(IntDefaultHandler); -void PIN_INT3_IRQHandler(void) ALIAS(IntDefaultHandler); -void PIN_INT4_IRQHandler(void) ALIAS(IntDefaultHandler); -void PIN_INT5_IRQHandler(void) ALIAS(IntDefaultHandler); -void PIN_INT6_IRQHandler(void) ALIAS(IntDefaultHandler); -void PIN_INT7_IRQHandler(void) ALIAS(IntDefaultHandler); -void GINT0_IRQHandler(void) ALIAS(IntDefaultHandler); -void GINT1_IRQHandler(void) ALIAS(IntDefaultHandler); -void OSTIMER_IRQHandler(void) ALIAS(IntDefaultHandler); -void SSP1_IRQHandler(void) ALIAS(IntDefaultHandler); -void I2C_IRQHandler(void) ALIAS(IntDefaultHandler); -void CT16B0_IRQHandler(void) ALIAS(IntDefaultHandler); -void CT16B1_IRQHandler(void) ALIAS(IntDefaultHandler); -void CT32B0_IRQHandler(void) ALIAS(IntDefaultHandler); -void CT32B1_IRQHandler(void) ALIAS(IntDefaultHandler); -void SSP0_IRQHandler(void) ALIAS(IntDefaultHandler); -void USART_IRQHandler(void) ALIAS(IntDefaultHandler); -void USB_IRQHandler(void) ALIAS(IntDefaultHandler); -void USB_FIQHandler(void) ALIAS(IntDefaultHandler); -void ADC_IRQHandler(void) ALIAS(IntDefaultHandler); -void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); -void BOD_IRQHandler(void) ALIAS(IntDefaultHandler); -void FMC_IRQHandler(void) ALIAS(IntDefaultHandler); -void OSCFAIL_IRQHandler(void) ALIAS(IntDefaultHandler); -void PVTCIRCUIT_IRQHandler(void) ALIAS(IntDefaultHandler); -void USBWakeup_IRQHandler(void) ALIAS(IntDefaultHandler); - -//***************************************************************************** -// -// The entry point for the application. -// __main() is the entry point for Redlib based applications -// main() is the entry point for Newlib based applications -// -//***************************************************************************** -#if defined (__REDLIB__) -extern void __main(void); -#endif -extern int main(void); -//***************************************************************************** -// -// External declaration for the pointer to the stack top from the Linker Script -// -//***************************************************************************** -extern void _vStackTop(void); - -//***************************************************************************** -#if defined (__cplusplus) -} // extern "C" -#endif -//***************************************************************************** -// -// The vector table. Note that the proper constructs must be placed on this to -// ensure that it ends up at physical address 0x0000.0000. -// -//***************************************************************************** -extern void (* const g_pfnVectors[])(void); -__attribute__ ((section(".isr_vector"))) -void (* const g_pfnVectors[])(void) = { - // Core Level - CM3 - &_vStackTop, // The initial stack pointer - ResetISR, // The reset handler - NMI_Handler, // The NMI handler - HardFault_Handler, // The hard fault handler - MemManage_Handler, // The MPU fault handler - BusFault_Handler, // The bus fault handler - UsageFault_Handler, // The usage fault handler - 0, // Reserved - 0, // Reserved - 0, // Reserved - 0, // Reserved - SVC_Handler, // SVCall handler - DebugMon_Handler, // Debug monitor handler - 0, // Reserved - PendSV_Handler, // The PendSV handler - SysTick_Handler, // The SysTick handler - - // LPC13U External Interrupts - PIN_INT0_IRQHandler, // All GPIO pin can be routed to PIN_INTx - PIN_INT1_IRQHandler, - PIN_INT2_IRQHandler, - PIN_INT3_IRQHandler, - PIN_INT4_IRQHandler, - PIN_INT5_IRQHandler, - PIN_INT6_IRQHandler, - PIN_INT7_IRQHandler, - GINT0_IRQHandler, - GINT1_IRQHandler, // PIO0 (0:7) - 0, - 0, - OSTIMER_IRQHandler, - 0, - SSP1_IRQHandler, // SSP1 - I2C_IRQHandler, // I2C - CT16B0_IRQHandler, // 16-bit Timer0 - CT16B1_IRQHandler, // 16-bit Timer1 - CT32B0_IRQHandler, // 32-bit Timer0 - CT32B1_IRQHandler, // 32-bit Timer1 - SSP0_IRQHandler, // SSP0 - USART_IRQHandler, // USART - USB_IRQHandler, // USB IRQ - USB_FIQHandler, // USB FIQ - ADC_IRQHandler, // A/D Converter - WDT_IRQHandler, // Watchdog timer - BOD_IRQHandler, // Brown Out Detect - FMC_IRQHandler, // IP2111 Flash Memory Controller - OSCFAIL_IRQHandler, // OSC FAIL - PVTCIRCUIT_IRQHandler, // PVT CIRCUIT - USBWakeup_IRQHandler, // USB wake up - 0, - }; - -//***************************************************************************** -// Functions to carry out the initialization of RW and BSS data sections. These -// are written as separate functions rather than being inlined within the -// ResetISR() function in order to cope with MCUs with multiple banks of -// memory. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void data_init(unsigned int romstart, unsigned int start, unsigned int len) { - unsigned int *pulDest = (unsigned int*) start; - unsigned int *pulSrc = (unsigned int*) romstart; - unsigned int loop; - for (loop = 0; loop < len; loop = loop + 4) - *pulDest++ = *pulSrc++; -} - -__attribute__ ((section(".after_vectors"))) -void bss_init(unsigned int start, unsigned int len) { - unsigned int *pulDest = (unsigned int*) start; - unsigned int loop; - for (loop = 0; loop < len; loop = loop + 4) - *pulDest++ = 0; -} - -//***************************************************************************** -// The following symbols are constructs generated by the linker, indicating -// the location of various points in the "Global Section Table". This table is -// created by the linker via the Code Red managed linker script mechanism. It -// contains the load address, execution address and length of each RW data -// section and the execution and length of each BSS (zero initialized) section. -//***************************************************************************** -extern unsigned int __data_section_table; -extern unsigned int __data_section_table_end; -extern unsigned int __bss_section_table; -extern unsigned int __bss_section_table_end; - -//***************************************************************************** -// Reset entry point for your code. -// Sets up a simple runtime environment and initializes the C/C++ -// library. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void -ResetISR(void) { - - // - // Copy the data sections from flash to SRAM. - // - unsigned int LoadAddr, ExeAddr, SectionLen; - unsigned int *SectionTableAddr; - - // Load base address of Global Section Table - SectionTableAddr = &__data_section_table; - - // Copy the data sections from flash to SRAM. - while (SectionTableAddr < &__data_section_table_end) { - LoadAddr = *SectionTableAddr++; - ExeAddr = *SectionTableAddr++; - SectionLen = *SectionTableAddr++; - data_init(LoadAddr, ExeAddr, SectionLen); - } - // At this point, SectionTableAddr = &__bss_section_table; - // Zero fill the bss segment - while (SectionTableAddr < &__bss_section_table_end) { - ExeAddr = *SectionTableAddr++; - SectionLen = *SectionTableAddr++; - bss_init(ExeAddr, SectionLen); - } - -#ifdef __USE_CMSIS - SystemInit(); -#endif - -#if defined (__cplusplus) - // - // Call C++ library initialisation - // - __libc_init_array(); -#endif - -#if defined (__REDLIB__) - // Call the Redlib library, which in turn calls main() - __main() ; -#else - main(); -#endif - // - // main() shouldn't return, but if it does, we'll just enter an infinite loop - // - while (1) { - ; - } -} - -//***************************************************************************** -// Default exception handlers. Override the ones here by defining your own -// handler routines in your application code. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void NMI_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void HardFault_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void MemManage_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void BusFault_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void UsageFault_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void SVC_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void DebugMon_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void PendSV_Handler(void) { - while (1) { - } -} -__attribute__ ((section(".after_vectors"))) -void SysTick_Handler(void) { - while (1) { - } -} - -//***************************************************************************** -// -// Processor ends up here if an unexpected interrupt occurs or a handler -// is not present in the application code. -// -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void IntDefaultHandler(void) { - // - // Go into an infinite loop. - // - while (1) { - } -} diff --git a/hw/bsp/lpcxpresso1769/board_lpcxpresso1769.c b/hw/bsp/lpcxpresso1769/board_lpcxpresso1769.c index 4321a3f3c..f19b9b147 100644 --- a/hw/bsp/lpcxpresso1769/board_lpcxpresso1769.c +++ b/hw/bsp/lpcxpresso1769/board_lpcxpresso1769.c @@ -36,59 +36,81 @@ */ /**************************************************************************/ -#include "../board.h" #ifdef BOARD_LPCXPRESSO1769 -#define BOARD_LED_PORT (0) -#define BOARD_LED_PIN (22) +#include "../board.h" +#include "tusb.h" + +#define LED_PORT 0 +#define LED_PIN 22 + +#define BOARD_UART_PORT LPC_UART3 + +/* System oscillator rate and RTC oscillator rate */ +const uint32_t OscRateIn = 12000000; +const uint32_t RTCOscRateIn = 32768; -const static struct { - uint8_t port; - uint8_t pin; -} buttons[] = +/* Pin muxing configuration */ +static const PINMUX_GRP_T pinmuxing[] = { - {2, 3 }, // Joystick up - {0, 15 }, // Joystick down - {2, 4 }, // Joystick left - {0, 16 }, // Joystick right - {0, 17 }, // Joystick press - {0, 4 }, // SW3 -// {1, 31 }, // SW4 (require to remove J28) + {0, 0, IOCON_MODE_INACT | IOCON_FUNC2}, /* TXD3 */ + {0, 1, IOCON_MODE_INACT | IOCON_FUNC2}, /* RXD3 */ + {0, 22, IOCON_MODE_INACT | IOCON_FUNC0}, /* Led 0 */ + + /* Joystick buttons. */ + {2, 3, IOCON_MODE_INACT | IOCON_FUNC0}, /* JOYSTICK_UP */ + {0, 15, IOCON_MODE_INACT | IOCON_FUNC0}, /* JOYSTICK_DOWN */ + {2, 4, IOCON_MODE_INACT | IOCON_FUNC0}, /* JOYSTICK_LEFT */ + {0, 16, IOCON_MODE_INACT | IOCON_FUNC0}, /* JOYSTICK_RIGHT */ + {0, 17, IOCON_MODE_INACT | IOCON_FUNC0}, /* JOYSTICK_PRESS */ +}; + +static const PINMUX_GRP_T pin_usb_mux[] = +{ + {0, 29, IOCON_MODE_INACT | IOCON_FUNC1}, // D+ + {0, 30, IOCON_MODE_INACT | IOCON_FUNC1}, // D- + {2, 9, IOCON_MODE_INACT | IOCON_FUNC1}, // Connect + + {1, 19, IOCON_MODE_INACT | IOCON_FUNC2}, // USB_PPWR + {1, 22, IOCON_MODE_INACT | IOCON_FUNC2}, // USB_PWRD + + /* VBUS is not connected on this board, so leave the pin at default setting. */ + /*Chip_IOCON_PinMux(LPC_IOCON, 1, 30, IOCON_MODE_INACT, IOCON_FUNC2);*/ /* USB VBUS */ }; enum { - BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0]) + BOARD_BUTTON_COUNT = 5 }; -#define BOARD_UART_PORT LPC_UART3 +// Invoked by startup code +void SystemInit(void) +{ + /* Enable IOCON clock */ + Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); + Chip_SetupXtalClocking(); +} void board_init(void) { - SystemInit(); + SystemCoreClockUpdate(); -#if CFG_TUSB_OS == OPT_OS_NONE // TODO may move to main.c - SysTick_Config(SystemCoreClock / BOARD_TICKS_HZ); // 1 msec tick timer +#if CFG_TUSB_OS == OPT_OS_NONE + SysTick_Config(SystemCoreClock / BOARD_TICKS_HZ); +#elif CFG_TUSB_OS == OPT_OS_FREERTOS + // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher ) + NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ); #endif + Chip_GPIO_Init(LPC_GPIO); + //------------- LED -------------// - GPIO_SetDir(BOARD_LED_PORT, BIT_(BOARD_LED_PIN), 1); + Chip_GPIO_SetPinDIROutput(LPC_GPIO, LED_PORT, LED_PIN); //------------- BUTTON -------------// - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIO_SetDir(buttons[i].port, BIT_(buttons[i].pin), 0); - -#if TUSB_OPT_DEVICE_ENABLED - //------------- USB Device -------------// - // VBUS sense is wrongly connected to P0_5 (instead of P1_30). So we need to always pull P1_30 to high - // so that USB device block can work. However, Device Controller (thus tinyusb) cannot able to determine - // if device is disconnected or not - PINSEL_ConfigPin( &(PINSEL_CFG_Type) { - .Portnum = 1, .Pinnum = 30, - .Funcnum = 2, .Pinmode = PINSEL_PINMODE_PULLUP} ); - - //P0_21 instead of P2_9 as USB connect -#endif +// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIO_SetDir(buttons[i].port, TU_BIT(buttons[i].pin), 0); +#if 0 //------------- UART -------------// PINSEL_CFG_Type PinCfg = { @@ -110,35 +132,73 @@ void board_init(void) UART_Init(BOARD_UART_PORT, &UARTConfigStruct); UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit +#endif + + //------------- USB -------------// + Chip_USB_Init(); + + enum { + USBCLK_DEVCIE = 0x12, // AHB + Device + USBCLK_HOST = 0x19, // AHB + Host + OTG +// 0x1B // Host + Device + OTG + AHB + }; + + uint32_t const clk_en = TUSB_OPT_DEVICE_ENABLED ? USBCLK_DEVCIE : USBCLK_HOST; + + LPC_USB->OTGClkCtrl = clk_en; + while ( (LPC_USB->OTGClkSt & clk_en) != clk_en ); + +#if TUSB_OPT_HOST_ENABLED + // set portfunc to host !!! + LPC_USB->StCtrl = 0x3; // should be 1 +#endif + + Chip_IOCON_SetPinMuxing(LPC_IOCON, pin_usb_mux, sizeof(pin_usb_mux) / sizeof(PINMUX_GRP_T)); +} + +/*------------------------------------------------------------------*/ +/* TUSB HAL MILLISECOND + *------------------------------------------------------------------*/ +#if CFG_TUSB_OS == OPT_OS_NONE + +volatile uint32_t system_ticks = 0; + +void SysTick_Handler (void) +{ + system_ticks++; +} + +uint32_t tusb_hal_millis(void) +{ + return board_tick2ms(system_ticks); } +#endif + //--------------------------------------------------------------------+ // LEDS //--------------------------------------------------------------------+ -void board_leds(uint32_t on_mask, uint32_t off_mask) +void board_led_control(bool state) { - if (on_mask & BIT_(0)) - { - GPIO_SetValue(BOARD_LED_PORT, BIT_(BOARD_LED_PIN)); - }else if (off_mask & BIT_(0)) - { - GPIO_ClearValue(BOARD_LED_PORT, BIT_(BOARD_LED_PIN)); - } + Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state); } //--------------------------------------------------------------------+ // BUTTONS //--------------------------------------------------------------------+ +#if 0 static bool button_read(uint8_t id) { - return !BIT_TEST_( GPIO_ReadValue(buttons[id].port), buttons[id].pin ); // button is active low +// return !TU_BIT_TEST( GPIO_ReadValue(buttons[id].port), buttons[id].pin ); // button is active low + return false; } +#endif uint32_t board_buttons(void) { uint32_t result = 0; - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0); +// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? TU_BIT(i) : 0); return result; } @@ -148,12 +208,14 @@ uint32_t board_buttons(void) //--------------------------------------------------------------------+ void board_uart_putchar(uint8_t c) { - UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING); + (void) c; +// UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING); } uint8_t board_uart_getchar(void) { - return UART_ReceiveByte(BOARD_UART_PORT); +// return UART_ReceiveByte(BOARD_UART_PORT); + return 0; } #endif diff --git a/hw/bsp/lpcxpresso1769/board_lpcxpresso1769.h b/hw/bsp/lpcxpresso1769/board_lpcxpresso1769.h index 06520e16b..cf8741590 100644 --- a/hw/bsp/lpcxpresso1769/board_lpcxpresso1769.h +++ b/hw/bsp/lpcxpresso1769/board_lpcxpresso1769.h @@ -39,20 +39,11 @@ #ifndef _TUSB_BOARD_LPCXPRESSO1769_H_ #define _TUSB_BOARD_LPCXPRESSO1769_H_ -#include "LPC17xx.h" - -#include "lpc17xx_clkpwr.h" -#include "lpc17xx_pinsel.h" -#include "lpc17xx_gpio.h" -#include "lpc17xx_uart.h" - #ifdef __cplusplus extern "C" { #endif -#define CFG_PRINTF_TARGET PRINTF_TARGET_UART -//#define CFG_PRINTF_TARGET PRINTF_TARGET_SWO - +#include "chip.h" #ifdef __cplusplus } diff --git a/hw/bsp/lpcxpresso1769/startup/xpresso/cr_startup_lpc176x.c b/hw/bsp/lpcxpresso1769/startup/xpresso/cr_startup_lpc176x.c deleted file mode 100644 index fc6bed580..000000000 --- a/hw/bsp/lpcxpresso1769/startup/xpresso/cr_startup_lpc176x.c +++ /dev/null @@ -1,423 +0,0 @@ -//***************************************************************************** -// +--+ -// | ++----+ -// +-++ | -// | | -// +-+--+ | -// | +--+--+ -// +----+ Copyright (c) 2009-10 Code Red Technologies Ltd. -// -// Microcontroller Startup code for use with Red Suite -// -// Version : 101130 -// -// Software License Agreement -// -// The software is owned by Code Red Technologies and/or its suppliers, and is -// protected under applicable copyright laws. All rights are reserved. Any -// use in violation of the foregoing restrictions may subject the user to criminal -// sanctions under applicable laws, as well as to civil liability for the breach -// of the terms and conditions of this license. -// -// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED -// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. -// USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT -// TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH -// CODE RED TECHNOLOGIES LTD. -// -//***************************************************************************** -#if defined (__cplusplus) -#ifdef __REDLIB__ -#error Redlib does not support C++ -#else -//***************************************************************************** -// -// The entry point for the C++ library startup -// -//***************************************************************************** -extern "C" { - extern void __libc_init_array(void); -} -#endif -#endif - -#define WEAK __attribute__ ((weak)) -#define ALIAS(f) __attribute__ ((weak, alias (#f))) - -#define SVCall_Handler SVC_Handler - -// Code Red - if CMSIS is being used, then SystemInit() routine -// will be called by startup code rather than in application's main() -#if defined (__USE_CMSIS) -#include "system_LPC17xx.h" -#endif - -//***************************************************************************** -#if defined (__cplusplus) -extern "C" { -#endif - -//***************************************************************************** -// -// Forward declaration of the default handlers. These are aliased. -// When the application defines a handler (with the same name), this will -// automatically take precedence over these weak definitions -// -//***************************************************************************** - void ResetISR(void); -WEAK void NMI_Handler(void); -WEAK void HardFault_Handler(void); -WEAK void MemManage_Handler(void); -WEAK void BusFault_Handler(void); -WEAK void UsageFault_Handler(void); -WEAK void SVCall_Handler(void); -WEAK void DebugMon_Handler(void); -WEAK void PendSV_Handler(void); -WEAK void SysTick_Handler(void); -WEAK void IntDefaultHandler(void); - -//***************************************************************************** -// -// Forward declaration of the specific IRQ handlers. These are aliased -// to the IntDefaultHandler, which is a 'forever' loop. When the application -// defines a handler (with the same name), this will automatically take -// precedence over these weak definitions -// -//***************************************************************************** -void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); -void TIMER0_IRQHandler(void) ALIAS(IntDefaultHandler); -void TIMER1_IRQHandler(void) ALIAS(IntDefaultHandler); -void TIMER2_IRQHandler(void) ALIAS(IntDefaultHandler); -void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); -void UART0_IRQHandler(void) ALIAS(IntDefaultHandler); -void UART1_IRQHandler(void) ALIAS(IntDefaultHandler); -void UART2_IRQHandler(void) ALIAS(IntDefaultHandler); -void UART3_IRQHandler(void) ALIAS(IntDefaultHandler); -void PWM1_IRQHandler(void) ALIAS(IntDefaultHandler); -void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler); -void I2C1_IRQHandler(void) ALIAS(IntDefaultHandler); -void I2C2_IRQHandler(void) ALIAS(IntDefaultHandler); -void SPI_IRQHandler(void) ALIAS(IntDefaultHandler); -void SSP0_IRQHandler(void) ALIAS(IntDefaultHandler); -void SSP1_IRQHandler(void) ALIAS(IntDefaultHandler); -void PLL0_IRQHandler(void) ALIAS(IntDefaultHandler); -void RTC_IRQHandler(void) ALIAS(IntDefaultHandler); -void EINT0_IRQHandler(void) ALIAS(IntDefaultHandler); -void EINT1_IRQHandler(void) ALIAS(IntDefaultHandler); -void EINT2_IRQHandler(void) ALIAS(IntDefaultHandler); -void EINT3_IRQHandler(void) ALIAS(IntDefaultHandler); -void ADC_IRQHandler(void) ALIAS(IntDefaultHandler); -void BOD_IRQHandler(void) ALIAS(IntDefaultHandler); -void USB_IRQHandler(void) ALIAS(IntDefaultHandler); -void CAN_IRQHandler(void) ALIAS(IntDefaultHandler); -void DMA_IRQHandler(void) ALIAS(IntDefaultHandler); -void I2S_IRQHandler(void) ALIAS(IntDefaultHandler); -void ENET_IRQHandler(void) ALIAS(IntDefaultHandler); -void RIT_IRQHandler(void) ALIAS(IntDefaultHandler); -void MCPWM_IRQHandler(void) ALIAS(IntDefaultHandler); -void QEI_IRQHandler(void) ALIAS(IntDefaultHandler); -void PLL1_IRQHandler(void) ALIAS(IntDefaultHandler); -void USBActivity_IRQHandler(void) ALIAS(IntDefaultHandler); -void CANActivity_IRQHandler(void) ALIAS(IntDefaultHandler); - -//***************************************************************************** -// -// The entry point for the application. -// __main() is the entry point for Redlib based applications -// main() is the entry point for Newlib based applications -// -//***************************************************************************** -#if defined (__REDLIB__) -extern void __main(void); -#endif -extern int main(void); -//***************************************************************************** -// -// External declaration for the pointer to the stack top from the Linker Script -// -//***************************************************************************** -extern void _vStackTop(void); - -//***************************************************************************** -#if defined (__cplusplus) -} // extern "C" -#endif -//***************************************************************************** -// -// The vector table. -// This relies on the linker script to place at correct location in memory. -// -//***************************************************************************** -extern void (* const g_pfnVectors[])(void); -__attribute__ ((section(".isr_vector"))) -void (* const g_pfnVectors[])(void) = { - // Core Level - CM3 - &_vStackTop, // The initial stack pointer - ResetISR, // The reset handler - NMI_Handler, // The NMI handler - HardFault_Handler, // The hard fault handler - MemManage_Handler, // The MPU fault handler - BusFault_Handler, // The bus fault handler - UsageFault_Handler, // The usage fault handler - 0, // Reserved - 0, // Reserved - 0, // Reserved - 0, // Reserved - SVCall_Handler, // SVCall handler - DebugMon_Handler, // Debug monitor handler - 0, // Reserved - PendSV_Handler, // The PendSV handler - SysTick_Handler, // The SysTick handler - - // Chip Level - LPC17 - WDT_IRQHandler, // 16, 0x40 - WDT - TIMER0_IRQHandler, // 17, 0x44 - TIMER0 - TIMER1_IRQHandler, // 18, 0x48 - TIMER1 - TIMER2_IRQHandler, // 19, 0x4c - TIMER2 - TIMER3_IRQHandler, // 20, 0x50 - TIMER3 - UART0_IRQHandler, // 21, 0x54 - UART0 - UART1_IRQHandler, // 22, 0x58 - UART1 - UART2_IRQHandler, // 23, 0x5c - UART2 - UART3_IRQHandler, // 24, 0x60 - UART3 - PWM1_IRQHandler, // 25, 0x64 - PWM1 - I2C0_IRQHandler, // 26, 0x68 - I2C0 - I2C1_IRQHandler, // 27, 0x6c - I2C1 - I2C2_IRQHandler, // 28, 0x70 - I2C2 - SPI_IRQHandler, // 29, 0x74 - SPI - SSP0_IRQHandler, // 30, 0x78 - SSP0 - SSP1_IRQHandler, // 31, 0x7c - SSP1 - PLL0_IRQHandler, // 32, 0x80 - PLL0 (Main PLL) - RTC_IRQHandler, // 33, 0x84 - RTC - EINT0_IRQHandler, // 34, 0x88 - EINT0 - EINT1_IRQHandler, // 35, 0x8c - EINT1 - EINT2_IRQHandler, // 36, 0x90 - EINT2 - EINT3_IRQHandler, // 37, 0x94 - EINT3 - ADC_IRQHandler, // 38, 0x98 - ADC - BOD_IRQHandler, // 39, 0x9c - BOD - USB_IRQHandler, // 40, 0xA0 - USB - CAN_IRQHandler, // 41, 0xa4 - CAN - DMA_IRQHandler, // 42, 0xa8 - GP DMA - I2S_IRQHandler, // 43, 0xac - I2S - ENET_IRQHandler, // 44, 0xb0 - Ethernet - RIT_IRQHandler, // 45, 0xb4 - RITINT - MCPWM_IRQHandler, // 46, 0xb8 - Motor Control PWM - QEI_IRQHandler, // 47, 0xbc - Quadrature Encoder - PLL1_IRQHandler, // 48, 0xc0 - PLL1 (USB PLL) - USBActivity_IRQHandler, // 49, 0xc4 - USB Activity interrupt to wakeup - CANActivity_IRQHandler, // 50, 0xc8 - CAN Activity interrupt to wakeup -}; - -//***************************************************************************** -// Functions to carry out the initialization of RW and BSS data sections. These -// are written as separate functions rather than being inlined within the -// ResetISR() function in order to cope with MCUs with multiple banks of -// memory. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void data_init(unsigned int romstart, unsigned int start, unsigned int len) { - unsigned int *pulDest = (unsigned int*) start; - unsigned int *pulSrc = (unsigned int*) romstart; - unsigned int loop; - for (loop = 0; loop < len; loop = loop + 4) - *pulDest++ = *pulSrc++; -} - -__attribute__ ((section(".after_vectors"))) -void bss_init(unsigned int start, unsigned int len) { - unsigned int *pulDest = (unsigned int*) start; - unsigned int loop; - for (loop = 0; loop < len; loop = loop + 4) - *pulDest++ = 0; -} - -#ifndef USE_OLD_STYLE_DATA_BSS_INIT -//***************************************************************************** -// The following symbols are constructs generated by the linker, indicating -// the location of various points in the "Global Section Table". This table is -// created by the linker via the Code Red managed linker script mechanism. It -// contains the load address, execution address and length of each RW data -// section and the execution and length of each BSS (zero initialized) section. -//***************************************************************************** -extern unsigned int __data_section_table; -extern unsigned int __data_section_table_end; -extern unsigned int __bss_section_table; -extern unsigned int __bss_section_table_end; -#else -//***************************************************************************** -// The following symbols are constructs generated by the linker, indicating -// the load address, execution address and length of the RW data section and -// the execution and length of the BSS (zero initialized) section. -// Note that these symbols are not normally used by the managed linker script -// mechanism in Red Suite/LPCXpresso 3.6 (Windows) and LPCXpresso 3.8 (Linux). -// They are provide here simply so this startup code can be used with earlier -// versions of Red Suite which do not support the more advanced managed linker -// script mechanism introduced in the above version. To enable their use, -// define "USE_OLD_STYLE_DATA_BSS_INIT". -//***************************************************************************** -extern unsigned int _etext; -extern unsigned int _data; -extern unsigned int _edata; -extern unsigned int _bss; -extern unsigned int _ebss; -#endif - - -//***************************************************************************** -// Reset entry point for your code. -// Sets up a simple runtime environment and initializes the C/C++ -// library. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void -ResetISR(void) { - -#ifndef USE_OLD_STYLE_DATA_BSS_INIT - // - // Copy the data sections from flash to SRAM. - // - unsigned int LoadAddr, ExeAddr, SectionLen; - unsigned int *SectionTableAddr; - - // Load base address of Global Section Table - SectionTableAddr = &__data_section_table; - - // Copy the data sections from flash to SRAM. - while (SectionTableAddr < &__data_section_table_end) { - LoadAddr = *SectionTableAddr++; - ExeAddr = *SectionTableAddr++; - SectionLen = *SectionTableAddr++; - data_init(LoadAddr, ExeAddr, SectionLen); - } - // At this point, SectionTableAddr = &__bss_section_table; - // Zero fill the bss segment - while (SectionTableAddr < &__bss_section_table_end) { - ExeAddr = *SectionTableAddr++; - SectionLen = *SectionTableAddr++; - bss_init(ExeAddr, SectionLen); - } -#else - // Use Old Style Data and BSS section initialization. - // This will only initialize a single RAM bank. - unsigned int * LoadAddr, *ExeAddr, *EndAddr, SectionLen; - - // Copy the data segment from flash to SRAM. - LoadAddr = &_etext; - ExeAddr = &_data; - EndAddr = &_edata; - SectionLen = (void*)EndAddr - (void*)ExeAddr; - data_init((unsigned int)LoadAddr, (unsigned int)ExeAddr, SectionLen); - // Zero fill the bss segment - ExeAddr = &_bss; - EndAddr = &_ebss; - SectionLen = (void*)EndAddr - (void*)ExeAddr; - bss_init ((unsigned int)ExeAddr, SectionLen); -#endif - -#ifdef __USE_CMSIS - SystemInit(); -#endif - -#if defined (__cplusplus) - // - // Call C++ library initialisation - // - __libc_init_array(); -#endif - -#if defined (__REDLIB__) - // Call the Redlib library, which in turn calls main() - __main() ; -#else - main(); -#endif - - // - // main() shouldn't return, but if it does, we'll just enter an infinite loop - // - while (1) { - ; - } -} - -//***************************************************************************** -// Default exception handlers. Override the ones here by defining your own -// handler routines in your application code. -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void NMI_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void HardFault_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void MemManage_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void BusFault_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void UsageFault_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void SVCall_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void DebugMon_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void PendSV_Handler(void) -{ - while(1) - { - } -} -__attribute__ ((section(".after_vectors"))) -void SysTick_Handler(void) -{ - while(1) - { - } -} - -//***************************************************************************** -// -// Processor ends up here if an unexpected interrupt occurs or a specific -// handler is not present in the application code. -// -//***************************************************************************** -__attribute__ ((section(".after_vectors"))) -void IntDefaultHandler(void) -{ - while(1) - { - } -} diff --git a/hw/bsp/mcb1800/board_mcb1800.c b/hw/bsp/mcb1800/board_mcb1800.c new file mode 100644 index 000000000..a321ffe61 --- /dev/null +++ b/hw/bsp/mcb1800/board_mcb1800.c @@ -0,0 +1,245 @@ +/**************************************************************************/ +/*! + @file board_mcb1800.c + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2018, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ + +#ifdef BOARD_MCB1800 + +#include "../board.h" +#include "tusb.h" + +#define LED_PORT 6 +#define LED_PIN 24 + +//--------------------------------------------------------------------+ +// MACRO TYPEDEF CONSTANT ENUM DECLARATION +//--------------------------------------------------------------------+ +/* System configuration variables used by chip driver */ +const uint32_t ExtRateIn = 0; +const uint32_t OscRateIn = 12000000; + +static const PINMUX_GRP_T pinmuxing[] = +{ + /* Board LEDs */ + {0xD, 10, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4)}, + {0xD, 11, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4)}, + {0xD, 12, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4)}, + {0xD, 13, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4)}, + {0xD, 14, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4)}, + {0x9, 0, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC0)}, + {0x9, 1, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC0)}, + {0x9, 2, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC0)}, + + /* I2S */ + {0x3, 0, (SCU_PINIO_FAST | SCU_MODE_FUNC2)}, + {0x6, 0, (SCU_PINIO_FAST | SCU_MODE_FUNC4)}, + {0x7, 2, (SCU_PINIO_FAST | SCU_MODE_FUNC2)}, + {0x6, 2, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, + {0x7, 1, (SCU_PINIO_FAST | SCU_MODE_FUNC2)}, + {0x6, 1, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, +}; + +/* Pin clock mux values, re-used structure, value in first index is meaningless */ +static const PINMUX_GRP_T pinclockmuxing[] = +{ + {0, 0, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)}, + {0, 1, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)}, + {0, 2, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)}, + {0, 3, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)}, +}; + + +/*------------------------------------------------------------------*/ +/* BOARD API + *------------------------------------------------------------------*/ +// Invoked by startup code +void SystemInit(void) +{ + /* Setup system level pin muxing */ + Chip_SCU_SetPinMuxing(pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); + + /* Clock pins only, group field not used */ + for (int i = 0; i < (sizeof(pinclockmuxing) / sizeof(pinclockmuxing[0])); i++) + { + Chip_SCU_ClockPinMuxSet(pinclockmuxing[i].pinnum, pinclockmuxing[i].modefunc); + } + + Chip_SetupXtalClocking(); +} + +void board_init(void) +{ + SystemCoreClockUpdate(); + +#if CFG_TUSB_OS == OPT_OS_NONE + SysTick_Config( SystemCoreClock / BOARD_TICKS_HZ ); +#endif + + Chip_GPIO_Init(LPC_GPIO_PORT); + + //------------- LED -------------// + /* Port and bit mapping for LEDs on GPIOs */ + const uint8_t ledports[] = {6, 6, 6, 6, 6, 4, 4, 4}; + const uint8_t ledbits[] = {24, 25, 26, 27, 28, 12, 13, 14}; + + for (int i = 0; i < (sizeof(ledports) / sizeof(ledports[0])); i++) + { + Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, ledports[i], ledbits[i]); + Chip_GPIO_SetPinState(LPC_GPIO_PORT, LED_PORT, LED_PIN, false); + } + +#if 0 + //------------- BUTTON -------------// + for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) + { + scu_pinmux(buttons[i].mux_port, buttons[i].mux_pin, GPIO_NOPULL, FUNC0); + GPIO_SetDir(buttons[i].gpio_port, TU_BIT(buttons[i].gpio_pin), 0); + } + + //------------- UART -------------// + scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN, FUNC1); + scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN | MD_EZI | MD_ZI, FUNC1); + + UART_CFG_Type UARTConfigStruct; + UART_ConfigStructInit(&UARTConfigStruct); + UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE; + UARTConfigStruct.Clock_Speed = 0; + + UART_Init(BOARD_UART_PORT, &UARTConfigStruct); + UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit +#endif + + //------------- USB -------------// + enum { + USBMODE_DEVICE = 2, + USBMODE_HOST = 3 + }; + + enum { + USBMODE_VBUS_LOW = 0, + USBMODE_VBUS_HIGH = 1 + }; + + // USB0 +#if CFG_TUSB_RHPORT0_MODE + Chip_USB0_Init(); + + // Reset controller + LPC_USB0->USBCMD_D |= 0x02; + while( LPC_USB0->USBCMD_D & 0x02 ) {} + + // Set mode + #if CFG_TUSB_RHPORT0_MODE & OPT_MODE_HOST + LPC_USB0->USBMODE_H = USBMODE_HOST | (USBMODE_VBUS_HIGH << 5); + #else // TODO OTG + LPC_USB0->USBMODE_D = USBMODE_DEVICE; + LPC_USB0->OTGSC = (1<<3) | (1<<0) /*| (1<<16)| (1<<24)| (1<<25)| (1<<26)| (1<<27)| (1<<28)| (1<<29)| (1<<30)*/; + #endif +#endif + + // USB1 +#if CFG_TUSB_RHPORT1_MODE + Chip_USB1_Init(); + + // Reset controller + LPC_USB1->USBCMD_D |= 0x02; + while( LPC_USB1->USBCMD_D & 0x02 ) {} + + // Set mode + #if CFG_TUSB_RHPORT1_MODE & OPT_MODE_HOST + LPC_USB1->USBMODE_H = USBMODE_HOST | (USBMODE_VBUS_HIGH << 5); + #else // TODO OTG + LPC_USB1->USBMODE_D = USBMODE_DEVICE; + #endif + + // USB1 as fullspeed + LPC_USB1->PORTSC1_D |= (1<<24); +#endif +} + +//------------- LED -------------// +void board_led_control(bool state) +{ + Chip_GPIO_SetPinState(LPC_GPIO_PORT, LED_PORT, LED_PIN, state); +} + +//------------- Buttons -------------// +static bool button_read(uint8_t id) +{ +// return !TU_BIT_TEST( GPIO_ReadValue(buttons[id].gpio_port), buttons[id].gpio_pin ); // button is active low +} + +uint32_t board_buttons(void) +{ + uint32_t result = 0; + +// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? TU_BIT(i) : 0); + + return result; +} + + +//------------- UART -------------// +uint8_t board_uart_getchar(void) +{ + //return UART_ReceiveByte(BOARD_UART_PORT); +} +void board_uart_putchar(uint8_t c) +{ + //UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING); +} + +/*------------------------------------------------------------------*/ +/* TUSB HAL MILLISECOND + *------------------------------------------------------------------*/ +#if CFG_TUSB_OS == OPT_OS_NONE + +volatile uint32_t system_ticks = 0; + +void SysTick_Handler (void) +{ + system_ticks++; +} + +uint32_t tusb_hal_millis(void) +{ + return board_tick2ms(system_ticks); +} + +#endif + +#endif + diff --git a/hw/bsp/mcb1800/board_mcb1800.h b/hw/bsp/mcb1800/board_mcb1800.h new file mode 100644 index 000000000..ac8bf124d --- /dev/null +++ b/hw/bsp/mcb1800/board_mcb1800.h @@ -0,0 +1,51 @@ +/**************************************************************************/ +/*! + @file board_mcb1800.h + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2018, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ +#ifndef BOARD_MCB1800_H_ +#define BOARD_MCB1800_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "chip.h" + +#ifdef __cplusplus + } +#endif + +#endif /* BOARD_MCB1800_H_ */ diff --git a/hw/bsp/metro_m0_express/board_metro_m0_express.c b/hw/bsp/metro_m0_express/board_metro_m0_express.c index db3f03a61..2471132e5 100644 --- a/hw/bsp/metro_m0_express/board_metro_m0_express.c +++ b/hw/bsp/metro_m0_express/board_metro_m0_express.c @@ -52,7 +52,7 @@ //--------------------------------------------------------------------+ // MACRO TYPEDEF CONSTANT ENUM DECLARATION //--------------------------------------------------------------------+ -#define LED_STATE_ON 1 +#define LED_PIN 17 /* Referenced GCLKs, should be initialized firstly */ #define _GCLK_INIT_1ST (1 << 0 | 1 << 1) @@ -74,8 +74,8 @@ void board_init(void) _gclk_init_generators_by_fref(_GCLK_INIT_LAST); // Led init - gpio_set_pin_direction(BOARD_LED0, GPIO_DIRECTION_OUT); - gpio_set_pin_level(BOARD_LED0, 1-LED_STATE_ON); + gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT); + gpio_set_pin_level(LED_PIN, 0); #if CFG_TUSB_OS == OPT_OS_NONE // Tick init, samd SystemCoreClock may not correct @@ -110,9 +110,9 @@ void board_init(void) _gclk_enable_channel(TCC0_GCLK_ID, GCLK_CLKCTRL_GEN_GCLK0_Val); } -void board_led_control(uint32_t led_id, bool state) +void board_led_control(bool state) { - gpio_set_pin_level(led_id, state ? LED_STATE_ON : (1-LED_STATE_ON)); + gpio_set_pin_level(LED_PIN, state); } diff --git a/hw/bsp/metro_m0_express/board_metro_m0_express.h b/hw/bsp/metro_m0_express/board_metro_m0_express.h index b727d144c..dc7721fab 100644 --- a/hw/bsp/metro_m0_express/board_metro_m0_express.h +++ b/hw/bsp/metro_m0_express/board_metro_m0_express.h @@ -42,8 +42,7 @@ extern "C" { #endif -#define BOARD_LED_NUM 1 -#define BOARD_LED0 17 +#include "sam.h" #ifdef __cplusplus } diff --git a/hw/bsp/metro_m4_express/board_metro_m4_express.c b/hw/bsp/metro_m4_express/board_metro_m4_express.c index 2bee1b84f..dbc322797 100644 --- a/hw/bsp/metro_m4_express/board_metro_m4_express.c +++ b/hw/bsp/metro_m4_express/board_metro_m4_express.c @@ -49,7 +49,7 @@ //--------------------------------------------------------------------+ // MACRO TYPEDEF CONSTANT ENUM DECLARATION //--------------------------------------------------------------------+ -#define LED_STATE_ON 1 +#define LED_PIN 16 /* Referenced GCLKs, should be initialized firstly */ #define _GCLK_INIT_1ST 0xFFFFFFFF @@ -72,8 +72,8 @@ void board_init(void) _gclk_init_generators_by_fref(_GCLK_INIT_LAST); // Led init - gpio_set_pin_direction(BOARD_LED0, GPIO_DIRECTION_OUT); - gpio_set_pin_level(BOARD_LED0, 1 - LED_STATE_ON); + gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT); + gpio_set_pin_level(LED_PIN, 0); // Systick init #if CFG_TUSB_OS == OPT_OS_NONE @@ -100,9 +100,9 @@ void board_init(void) gpio_set_pin_function(PIN_PA25, PINMUX_PA25H_USB_DP); } -void board_led_control(uint32_t led_id, bool state) +void board_led_control(bool state) { - gpio_set_pin_level(led_id, state ? LED_STATE_ON : (1-LED_STATE_ON)); + gpio_set_pin_level(LED_PIN, state); } diff --git a/hw/bsp/metro_m4_express/board_metro_m4_express.h b/hw/bsp/metro_m4_express/board_metro_m4_express.h index a50d71b16..27ff91937 100644 --- a/hw/bsp/metro_m4_express/board_metro_m4_express.h +++ b/hw/bsp/metro_m4_express/board_metro_m4_express.h @@ -42,8 +42,7 @@ extern "C" { #endif -#define BOARD_LED_NUM 1 -#define BOARD_LED0 16 +#include "sam.h" #ifdef __cplusplus } diff --git a/hw/bsp/ngx/board_ngx4330.c b/hw/bsp/ngx/board_ngx4330.c deleted file mode 100644 index d82decbea..000000000 --- a/hw/bsp/ngx/board_ngx4330.c +++ /dev/null @@ -1,158 +0,0 @@ -/**************************************************************************/ -/*! - @file board_ngx4330.c - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#include "../board.h" - -#ifdef BOARD_NGX4330 - -#define BOARD_UART_PORT LPC_USART0 - -const static struct { - uint8_t mux_port; - uint8_t mux_pin; - - uint8_t gpio_port; - uint8_t gpio_pin; -}leds[] = { {2, 11, 1, 11}, {2, 12, 1,12} }; - -enum { - BOARD_MAX_LEDS = sizeof(leds) / sizeof(leds[0]) -}; - -const static struct { - uint8_t mux_port; - uint8_t mux_pin; - - uint8_t gpio_port; - uint8_t gpio_pin; -}buttons[] = { {0x02, 7, 0, 7 } }; - -enum { - BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0]) -}; - -void board_init(void) -{ - CGU_Init(); - -#if CFG_TUSB_OS == OPT_OS_NONE // TODO may move to main.c - SysTick_Config( CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE)/BOARD_TICKS_HZ ); /* 1 ms Timer */ -#endif - - //------------- USB Bus power HOST ONLY-------------// - scu_pinmux(0x1, 7, MD_PUP | MD_EZI, FUNC4); // P1_7 USB0_PWR_EN, USB0 VBus function Xplorer - - scu_pinmux(0x2, 6, MD_PUP | MD_EZI, FUNC4); // P2_6 is configured as GPIO5[6] for USB1_PWR_EN - GPIO_SetDir (5, BIT_(6), 1); // GPIO5[6] is output - GPIO_SetValue (5, BIT_(6)); // GPIO5[6] output high - - //------------- LED -------------// - for (uint8_t i=0; i<BOARD_MAX_LEDS; i++) - { - scu_pinmux(leds[i].mux_port, leds[i].mux_pin, MD_PUP|MD_EZI|MD_ZI, FUNC0); - GPIO_SetDir(leds[i].gpio_port, BIT_(leds[i].gpio_pin), 1); // output - } - - //------------- BUTTONS -------------// - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) - { - scu_pinmux(buttons[i].mux_port, buttons[i].mux_pin, GPIO_NOPULL, FUNC0); - GPIO_SetDir(buttons[i].gpio_port, BIT_(buttons[i].gpio_pin), 0); - } - - //------------- UART init -------------// - scu_pinmux(0x6 ,4, MD_PDN | MD_EZI, FUNC2); // UART0_TXD - scu_pinmux(0x6 ,5, MD_PDN | MD_EZI, FUNC2); // UART0_RXD - - UART_CFG_Type UARTConfigStruct; - UART_ConfigStructInit(&UARTConfigStruct); // default: baud = 9600, 8 bit data, 1 stop bit, no parity - UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE; // Re-configure baudrate - UARTConfigStruct.Clock_Speed = 0; - - UART_Init(BOARD_UART_PORT, &UARTConfigStruct); - UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART -} - -//--------------------------------------------------------------------+ -// LEDS -//--------------------------------------------------------------------+ -void board_leds(uint32_t on_mask, uint32_t off_mask) -{ - for (uint32_t i=0; i<BOARD_MAX_LEDS; i++) - { - if ( on_mask & BIT_(i)) - { - GPIO_SetValue(leds[i].gpio_port, BIT_(leds[i].gpio_pin)); - }else if ( off_mask & BIT_(i)) // on_mask take precedence over off_mask - { - GPIO_ClearValue(leds[i].gpio_port, BIT_(leds[i].gpio_pin)); - } - } -} - -//--------------------------------------------------------------------+ -// BUTTONS -//--------------------------------------------------------------------+ -static bool button_read(uint8_t id) -{ - return !BIT_TEST_( GPIO_ReadValue(buttons[id].gpio_port), buttons[id].gpio_pin ); // button is active low -} - -uint32_t board_buttons(void) -{ - uint32_t result = 0; - - for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0); - - return result; -} - -//--------------------------------------------------------------------+ -// UART -//--------------------------------------------------------------------+ -uint8_t board_uart_getchar(void) -{ - return UART_ReceiveByte(BOARD_UART_PORT); -} - -void board_uart_putchar(uint8_t c) -{ - UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING); -} - -#endif diff --git a/hw/bsp/ngx/board_ngx4330.h b/hw/bsp/ngx/board_ngx4330.h deleted file mode 100644 index c5e2d0e26..000000000 --- a/hw/bsp/ngx/board_ngx4330.h +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************/ -/*! - @file board_ngx4330.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#ifndef _TUSB_BOARD_NGX4330_H_ -#define _TUSB_BOARD_NGX4330_H_ - -#include "LPC43xx.h" -#include "lpc43xx_scu.h" -#include "lpc43xx_cgu.h" -#include "lpc43xx_gpio.h" -#include "lpc43xx_uart.h" - -#ifdef __cplusplus - extern "C" { -#endif - -#define CFG_PRINTF_TARGET PRINTF_TARGET_UART -//#define CFG_PRINTF_TARGET PRINTF_TARGET_SWO - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_BOARD_NGX4330_H_ */ diff --git a/hw/bsp/pca10056/board_pca10056.c b/hw/bsp/pca10056/board_pca10056.c index e34ed27fa..dc695deda 100644 --- a/hw/bsp/pca10056/board_pca10056.c +++ b/hw/bsp/pca10056/board_pca10056.c @@ -46,6 +46,7 @@ /*------------------------------------------------------------------*/ /* MACRO TYPEDEF CONSTANT ENUM *------------------------------------------------------------------*/ +#define LED_PIN 13 #define LED_STATE_ON 0 uint8_t _button_pins[] = { 11, 12, 24, 25 }; @@ -92,15 +93,8 @@ void board_init(void) NRF_CLOCK->TASKS_LFCLKSTART = 1UL; // LEDs - nrf_gpio_cfg_output(BOARD_LED0); - nrf_gpio_cfg_output(BOARD_LED1); - nrf_gpio_cfg_output(BOARD_LED2); - nrf_gpio_cfg_output(BOARD_LED3); - - board_led_control(BOARD_LED0, false); - board_led_control(BOARD_LED1, false); - board_led_control(BOARD_LED2, false); - board_led_control(BOARD_LED3, false); + nrf_gpio_cfg_output(LED_PIN); + board_led_control(false); // Button for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) nrf_gpio_cfg_input(_button_pins[i], NRF_GPIO_PIN_PULLUP); @@ -223,9 +217,9 @@ void board_init(void) } } -void board_led_control(uint32_t led_id, bool state) +void board_led_control(bool state) { - nrf_gpio_pin_write(led_id, state ? LED_STATE_ON : (1-LED_STATE_ON)); + nrf_gpio_pin_write(LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON)); } uint32_t board_buttons(void) @@ -248,7 +242,7 @@ uint8_t board_uart_getchar(void) void board_uart_putchar(uint8_t c) { - + (void) c; } #endif diff --git a/hw/bsp/pca10056/board_pca10056.h b/hw/bsp/pca10056/board_pca10056.h index b2041f747..6f0dcf33c 100644 --- a/hw/bsp/pca10056/board_pca10056.h +++ b/hw/bsp/pca10056/board_pca10056.h @@ -45,12 +45,6 @@ extern "C" { #endif -#define BOARD_LED_NUM 4 -#define BOARD_LED0 13 -#define BOARD_LED1 14 -#define BOARD_LED2 15 -#define BOARD_LED3 16 - // Flash type used for MSC example #define BOARD_MSC_FLASH_QSPI #define BOARD_MSC_FLASH_SIZE (8*1024*1024) diff --git a/hw/bsp/readme.md b/hw/bsp/readme.md index f6c0f619c..b4105046f 100644 --- a/hw/bsp/readme.md +++ b/hw/bsp/readme.md @@ -2,19 +2,28 @@ ## Supported Boards ## -This code base already had supported for a handful of boards. However due to my limited collection, **only bold ones are (probably) guaranteed to run out of the box**. Other are merely implemented based on their schematics and needed help from you to make it work. +This code base already had supported for a handful of following boards ### NXP MCU ### -- [LPCXpresso 11u14](http://www.embeddedartists.com/products/lpcxpresso/lpc11U14_xpr.php) with base board (for some peripherals to work) -- [<b>LPCXpresso 1347</b>](http://www.embeddedartists.com/products/lpcxpresso/lpc1347_xpr.php) with base board (for some peripherals to work) -- [<b>LPCXpresso 1769</b>](http://www.embeddedartists.com/products/lpcxpresso/lpc1347_xpr.php) with base board (for some peripherals to work) -- [<b>Embedded Artists LPC4357 OEM & Base board</b>](http://www.embeddedartists.com/products/kits/lpc4357_kit.php) -- [<b>NGX LPC4330 Explorer</b>](http://shop.ngxtechnologies.com/product_info.php?products_id=104) -- [Keil MCB4357 Evaluation Board](http://www.keil.com/mcb4300) +- [LPCXpresso 11U68](https://www.nxp.com/support/developer-resources/evaluation-and-development-boards/lpcxpresso-boards/lpcxpresso-board-for-lpc11u68:OM13058) +- [LPCXpresso 1347](https://www.nxp.com/support/developer-resources/evaluation-and-development-boards/lpcxpresso-boards/lpcxpresso-board-for-lpc1347:OM13045) +- [LPCXpresso 1769](https://www.nxp.com/support/developer-resources/evaluation-and-development-boards/lpcxpresso-boards/lpcxpresso-board-for-lpc1769:OM13000) +- [Keil MCB1800 Evaluation Board](http://www.keil.com/mcb1800) +- [Embedded Artists LPC4088 Quick Start board](https://www.embeddedartists.com/products/lpc4088-quickstart-board) +- [Embedded Artists LPC4357 Developer Kit](http://www.embeddedartists.com/products/kits/lpc4357_kit.php) + +### MicroChip SAMD ### + +- [Adafruit Metro M0 Express](https://www.adafruit.com/product/3505) +- [Adafruit Metro M4 Express](https://www.adafruit.com/product/3382) + +### Nordic nRF52840 ### + +- [nRF52840-DK (aka pca10056)](https://www.nordicsemi.com/eng/Products/nRF52840-DK) ## Add your own board ## If you don't possess any of supported board above. Don't worry you can easily implemented your own one by following this guide as long as the mcu is supported. -**Guide to implement a new board is coming soon** ...
\ No newline at end of file +**Guide to implement a new board is coming soon** ... |
