From 11dff6f9789c9765788111d677ec69d1ef1f2ce9 Mon Sep 17 00:00:00 2001 From: hathach Date: Tue, 9 Apr 2013 02:30:33 +0700 Subject: [PATCH] add Lib_OemBaseBoard to bsp/board but current exclude from all builds (added when needed later) --- .../boards/EA4357/Lib_OemBaseBoard/inc/acc.h | 49 ++ .../EA4357/Lib_OemBaseBoard/inc/base_eeprom.h | 31 + .../EA4357/Lib_OemBaseBoard/inc/joystick.h | 37 ++ .../EA4357/Lib_OemBaseBoard/inc/lm75a.h | 29 + .../EA4357/Lib_OemBaseBoard/inc/memreg.h | 30 + .../EA4357/Lib_OemBaseBoard/inc/norflash.h | 56 ++ .../EA4357/Lib_OemBaseBoard/inc/pca9532.h | 94 +++ .../EA4357/Lib_OemBaseBoard/inc/uda1380.h | 93 +++ .../boards/EA4357/Lib_OemBaseBoard/src/acc.c | 251 ++++++++ .../EA4357/Lib_OemBaseBoard/src/base_eeprom.c | 195 +++++++ .../EA4357/Lib_OemBaseBoard/src/joystick.c | 155 +++++ .../EA4357/Lib_OemBaseBoard/src/lm75a.c | 128 +++++ .../EA4357/Lib_OemBaseBoard/src/memreg.c | 170 ++++++ .../EA4357/Lib_OemBaseBoard/src/norflash.c | 543 ++++++++++++++++++ .../EA4357/Lib_OemBaseBoard/src/pca9532.c | 344 +++++++++++ .../EA4357/Lib_OemBaseBoard/src/uda1380.c | 156 +++++ demos/bsp/boards/board_ea4357.c | 20 + demos/host/.cproject | 4 +- 18 files changed, 2383 insertions(+), 2 deletions(-) create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/acc.h create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/base_eeprom.h create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/joystick.h create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/lm75a.h create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/memreg.h create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/norflash.h create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/pca9532.h create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/uda1380.h create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/acc.c create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/base_eeprom.c create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/joystick.c create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/lm75a.c create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/memreg.c create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/norflash.c create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/pca9532.c create mode 100644 demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/uda1380.c diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/acc.h b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/acc.h new file mode 100644 index 000000000..3a739e0b0 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/acc.h @@ -0,0 +1,49 @@ +/***************************************************************************** + * + * 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/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/base_eeprom.h b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/base_eeprom.h new file mode 100644 index 000000000..0d7023093 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/base_eeprom.h @@ -0,0 +1,31 @@ +/***************************************************************************** + * + * 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/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/joystick.h b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/joystick.h new file mode 100644 index 000000000..5c466497a --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/joystick.h @@ -0,0 +1,37 @@ +/***************************************************************************** + * + * 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 __JOYSTICK_H +#define __JOYSTICK_H + + +#define JOYSTICK_CENTER 0x01 +#define JOYSTICK_UP 0x02 +#define JOYSTICK_DOWN 0x04 +#define JOYSTICK_LEFT 0x08 +#define JOYSTICK_RIGHT 0x10 + + +void joystick_init (void); +uint8_t joystick_read(void); + + + +#endif /* end __JOYSTICK_H */ +/**************************************************************************** +** End Of File +*****************************************************************************/ diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/lm75a.h b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/lm75a.h new file mode 100644 index 000000000..0ed6c8dfe --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/lm75a.h @@ -0,0 +1,29 @@ +/***************************************************************************** + * + * 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/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/memreg.h b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/memreg.h new file mode 100644 index 000000000..e9ef85f03 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/memreg.h @@ -0,0 +1,30 @@ +/***************************************************************************** + * + * 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/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/norflash.h b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/norflash.h new file mode 100644 index 000000000..11eb675e6 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/norflash.h @@ -0,0 +1,56 @@ +/***************************************************************************** + * + * 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/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/pca9532.h b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/pca9532.h new file mode 100644 index 000000000..6a55804c8 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/pca9532.h @@ -0,0 +1,94 @@ +/***************************************************************************** + * + * 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 __PCA9532C_H +#define __PCA9532C_H + + +#define PCA9532_I2C_ADDR (0x60) + +#define PCA9532_INPUT0 0x00 +#define PCA9532_INPUT1 0x01 +#define PCA9532_PSC0 0x02 +#define PCA9532_PWM0 0x03 +#define PCA9532_PSC1 0x04 +#define PCA9532_PWM1 0x05 +#define PCA9532_LS0 0x06 +#define PCA9532_LS1 0x07 +#define PCA9532_LS2 0x08 +#define PCA9532_LS3 0x09 + +#define PCA9532_AUTO_INC 0x10 + + +/* + * The Keys on the base board are mapped to LED0 -> LED3 on + * the PCA9532. + */ + +#define KEY1 0x0001 +#define KEY2 0x0002 +#define KEY3 0x0004 +#define KEY4 0x0008 + +#define KEY_MASK 0x000F + +/* + * MMC Card Detect and MMC Write Protect are mapped to LED4 + * and LED5 on the PCA9532. Please note that WP is active low. + */ + +#define MMC_CD 0x0010 +#define MMC_WP 0x0020 + +#define MMC_MASK 0x30 + +/* NOTE: LED6 and LED7 on PCA9532 are not connected to anything */ +#define PCA9532_NOT_USED 0xC0 + +/* + * Below are the LED constants to use when enabling/disabling a LED. + * The LED names are the names printed on the base board and not + * the names from the PCA9532 device. base_LED1 -> LED8 on PCA9532, + * base_LED2 -> LED9, and so on. + */ + +#define LED1 0x0100 +#define LED2 0x0200 +#define LED3 0x0400 +#define LED4 0x0800 +#define LED5 0x1000 +#define LED6 0x2000 +#define LED7 0x4000 +#define LED8 0x8000 + +#define LED_MASK 0xFF00 + +void pca9532_init (void); +uint16_t pca9532_getLedState (uint32_t shadow); +void pca9532_setLeds (uint16_t ledOnMask, uint16_t ledOffMask); +void pca9532_setBlink0Period(uint8_t period); +void pca9532_setBlink0Duty(uint8_t duty); +void pca9532_setBlink0Leds(uint16_t ledMask); +void pca9532_setBlink1Period(uint8_t period); +void pca9532_setBlink1Duty(uint8_t duty); +void pca9532_setBlink1Leds(uint16_t ledMask); + +#endif /* end __PCA9532C_H */ +/**************************************************************************** +** End Of File +*****************************************************************************/ diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/uda1380.h b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/uda1380.h new file mode 100644 index 000000000..b953cf501 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/inc/uda1380.h @@ -0,0 +1,93 @@ +#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/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/acc.c b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/acc.c new file mode 100644 index 000000000..c20fa4def --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/acc.c @@ -0,0 +1,251 @@ +/***************************************************************************** + * + * 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 "lpc_types.h" +#include "lpc43xx_i2c.h" +#include "../inc/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); +} + diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/base_eeprom.c b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/base_eeprom.c new file mode 100644 index 000000000..371e537a9 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/base_eeprom.c @@ -0,0 +1,195 @@ +/***************************************************************************** + * + * 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 +#include +#include "lpc_types.h" +#include "lpc43xx_i2c.h" +#include "../inc/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; +} diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/joystick.c b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/joystick.c new file mode 100644 index 000000000..a88eea0cf --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/joystick.c @@ -0,0 +1,155 @@ +/***************************************************************************** + * + * 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 "lpc_types.h" +#include "lpc43xx_gpio.h" +#include "lpc43xx_scu.h" +#include "../inc/joystick.h" + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ + +#define GPIO_PIN_LEFT (1<<9) +#define GPIO_PIN_RIGHT (1<<12) +#define GPIO_PIN_UP (1<<10) +#define GPIO_PIN_DOWN (1<<13) +#define GPIO_PIN_CENTER (1<<8) + +#define GPIO_PORT 4 + + +/****************************************************************************** + * External global variables + *****************************************************************************/ +// TODO move later +/* Pin mode defines, more in line with the definitions in the LPC1800/4300 user manual */ +/* Defines for SFSPx_y pin configuration registers */ +#define PDN_ENABLE (1 << 3) // Pull-down enable +#define PDN_DISABLE (0 << 3) // Pull-down disable +#define PUP_ENABLE (0 << 4) // Pull-up enable +#define PUP_DISABLE (1 << 4) // Pull-up disable +#define SLEWRATE_SLOW (0 << 5) // Slew rate for low noise with medium speed +#define SLEWRATE_FAST (1 << 5) // Slew rate for medium noise with fast speed +#define INBUF_ENABLE (1 << 6) // Input buffer +#define INBUF_DISABLE (0 << 6) // Input buffer +#define FILTER_ENABLE (0 << 7) // Glitch filter (for signals below 30MHz) +#define FILTER_DISABLE (1 << 7) // No glitch filter (for signals above 30MHz) +#define DRIVE_8MA (1 << 8) // Drive strength of 8mA +#define DRIVE_14MA (1 << 9) // Drive strength of 14mA +#define DRIVE_20MA (3 << 8) // Drive strength of 20mA + + +/* Configuration examples for various I/O pins */ +#define EMC_IO (PUP_ENABLE | PDN_ENABLE | SLEWRATE_FAST | INBUF_ENABLE | FILTER_DISABLE) +#define LCD_PINCONFIG (PUP_DISABLE | PDN_DISABLE | SLEWRATE_FAST | INBUF_ENABLE | FILTER_DISABLE) +#define CLK_IN (PUP_ENABLE | PDN_ENABLE | SLEWRATE_FAST | INBUF_ENABLE | FILTER_DISABLE) +#define CLK_OUT (PUP_ENABLE | PDN_ENABLE | SLEWRATE_FAST | INBUF_ENABLE | FILTER_DISABLE) +#define GPIO_PUP (PUP_ENABLE | PDN_DISABLE | SLEWRATE_SLOW | INBUF_ENABLE | FILTER_ENABLE ) +#define GPIO_PDN (PUP_DISABLE | PDN_ENABLE | SLEWRATE_SLOW | INBUF_ENABLE | FILTER_ENABLE ) +#define GPIO_NOPULL (PUP_DISABLE | PDN_DISABLE | SLEWRATE_SLOW | INBUF_ENABLE | FILTER_ENABLE ) +#define UART_RX_TX (PUP_DISABLE | PDN_ENABLE | SLEWRATE_SLOW | INBUF_ENABLE | FILTER_ENABLE ) +#define SSP_IO (PUP_ENABLE | PDN_ENABLE | SLEWRATE_FAST | INBUF_ENABLE | FILTER_DISABLE) +/****************************************************************************** + * Local variables + *****************************************************************************/ + + +/****************************************************************************** + * Local Functions + *****************************************************************************/ + + +/****************************************************************************** + * Public Functions + *****************************************************************************/ + +/****************************************************************************** + * + * Description: + * Initialize the Joystick Driver + * + *****************************************************************************/ +void joystick_init (void) +{ + /* set to GPIO function for the 5 pins used with the joystick */ + scu_pinmux( 0xa , 1 , GPIO_NOPULL , FUNC0 );//GPIO4[8] + scu_pinmux( 0xa , 2 , GPIO_NOPULL , FUNC0 );//GPIO4[9] + scu_pinmux( 0xa , 3 , GPIO_NOPULL , FUNC0 );//GPIO4[10] + scu_pinmux( 0x9 , 0 , GPIO_NOPULL , FUNC0 );//GPIO4[12] + scu_pinmux( 0x9 , 1 , GPIO_NOPULL , FUNC0 );//GPIO4[13] + + /* set the pins as inputs */ + GPIO_SetDir(GPIO_PORT, GPIO_PIN_LEFT, 0); + GPIO_SetDir(GPIO_PORT, GPIO_PIN_RIGHT, 0); + GPIO_SetDir(GPIO_PORT, GPIO_PIN_UP, 0); + GPIO_SetDir(GPIO_PORT, GPIO_PIN_DOWN, 0); + GPIO_SetDir(GPIO_PORT, GPIO_PIN_CENTER, 0); +} + +/****************************************************************************** + * + * Description: + * Read the joystick status + * + * Returns: + * The joystick status. The returned value is a bit mask. More than one + * direction may be active at any given time (e.g. UP and RIGHT) + * + *****************************************************************************/ +uint8_t joystick_read(void) +{ + uint8_t status = 0; + uint32_t pinVal = 0; + + pinVal = GPIO_ReadValue(GPIO_PORT); + pinVal = pinVal; + + if ((pinVal & GPIO_PIN_DOWN) == 0) { + status |= JOYSTICK_DOWN; + } + + if ((pinVal & GPIO_PIN_RIGHT) == 0) { + status |= JOYSTICK_RIGHT; + } + + if ((pinVal & GPIO_PIN_UP) == 0) { + status |= JOYSTICK_UP; + } + + if ((pinVal & GPIO_PIN_LEFT) == 0) { + status |= JOYSTICK_LEFT; + } + + if ((pinVal & GPIO_PIN_CENTER) == 0) { + status |= JOYSTICK_CENTER; + } + + return status; +} + + + + + diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/lm75a.c b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/lm75a.c new file mode 100644 index 000000000..5c8b90171 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/lm75a.c @@ -0,0 +1,128 @@ +/***************************************************************************** + * + * 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 +#include +#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); + +} + + diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/memreg.c b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/memreg.c new file mode 100644 index 000000000..59293b44c --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/memreg.c @@ -0,0 +1,170 @@ +/***************************************************************************** + * + * 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 "lpc43xx.h" +#include "lpc_types.h" +#include "lpc43xx_scu.h" +#include "../inc/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; +} + + diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/norflash.c b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/norflash.c new file mode 100644 index 000000000..bc1fb17aa --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/norflash.c @@ -0,0 +1,543 @@ +/***************************************************************************** + * + * 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 "lpc_types.h" +#include "lpc43xx_scu.h" +#include "lpc43xx_timer.h" +#include "../inc/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; +} + diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/pca9532.c b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/pca9532.c new file mode 100644 index 000000000..5366c1f58 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/pca9532.c @@ -0,0 +1,344 @@ +/***************************************************************************** + * + * 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 "lpc43xx_i2c.h" +#include "lpc43xx_cgu.h" +#include "lpc_types.h" +#include "../inc/pca9532.h" + +/****************************************************************************** + * Defines and typedefs + *****************************************************************************/ + +#define I2C_PORT (LPC_I2C0) + +#define LS_MODE_ON 0x01 +#define LS_MODE_BLINK0 0x02 +#define LS_MODE_BLINK1 0x03 + +/****************************************************************************** + * External global variables + *****************************************************************************/ + + +/****************************************************************************** + * Local variables + *****************************************************************************/ + +static uint16_t blink0Shadow = 0; +static uint16_t blink1Shadow = 0; +static uint16_t ledStateShadow = 0; + +/****************************************************************************** + * 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); +} + +static void setLsStates(uint16_t states, uint8_t* ls, uint8_t mode) +{ +#define IS_LED_SET(bit, x) ( ( ((x) & (bit)) != 0 ) ? 1 : 0 ) + + int i = 0; + + for (i = 0; i < 4; i++) { + + ls[i] |= ( (IS_LED_SET(0x0001, states)*mode << 0) + | (IS_LED_SET(0x0002, states)*mode << 2) + | (IS_LED_SET(0x0004, states)*mode << 4) + | (IS_LED_SET(0x0008, states)*mode << 6) ); + + states >>= 4; + } +} + +static void setLeds(void) +{ + uint8_t buf[5]; + uint8_t ls[4] = {0,0,0,0}; + uint16_t states = ledStateShadow; + + /* LEDs in On/Off state */ + setLsStates(states, ls, LS_MODE_ON); + + /* set the LEDs that should blink */ + setLsStates(blink0Shadow, ls, LS_MODE_BLINK0); + setLsStates(blink1Shadow, ls, LS_MODE_BLINK1); + + + buf[0] = PCA9532_LS0 | PCA9532_AUTO_INC; + buf[1] = ls[0]; + buf[2] = ls[1]; + buf[3] = ls[2]; + buf[4] = ls[3]; + I2CWrite(PCA9532_I2C_ADDR, buf, 5); +} + +/****************************************************************************** + * Public Functions + *****************************************************************************/ + +/****************************************************************************** + * + * Description: + * Initialize the PCA9532 Device + * + *****************************************************************************/ +void pca9532_init (void) +{ + /* nothing to initialize */ +} + +/****************************************************************************** + * + * Description: + * Get the LED states + * + * Params: + * [in] shadow - TRUE if the states should be retrieved from the shadow + * variables. The shadow variable are updated when any + * of setLeds, setBlink0Leds and/or setBlink1Leds are + * called. + * + * FALSE if the state should be retrieved from the PCA9532 + * device. A blinkin LED may be reported as on or off + * depending on the state when calling the function. + * + * Returns: + * A mask where a 1 indicates that a LED is on (or blinking). + * + *****************************************************************************/ +uint16_t pca9532_getLedState (uint32_t shadow) +{ + uint8_t buf[2]; + uint16_t ret = 0; + + if (shadow) { + /* a blink LED is reported as on*/ + ret = (ledStateShadow | blink0Shadow | blink1Shadow); + } + else { + + /* + * 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); + + I2CRead(PCA9532_I2C_ADDR, buf, 1); + ret = buf[0]; + + + buf[0] = PCA9532_INPUT1; + I2CWrite(PCA9532_I2C_ADDR, buf, 1); + + I2CRead(PCA9532_I2C_ADDR, buf, 1); + ret |= (buf[0] << 8); + + + /* invert since LEDs are active low */ + ret = ((~ret) & 0xFFFF); + } + + return (ret & ~PCA9532_NOT_USED); +} + + +/****************************************************************************** + * + * Description: + * Set LED states (on or off). + * + * Params: + * [in] ledOnMask - The LEDs that should be turned on. This mask has + * priority over ledOffMask + * [in] ledOffMask - The LEDs that should be turned off. + * + *****************************************************************************/ +void pca9532_setLeds (uint16_t ledOnMask, uint16_t ledOffMask) +{ + /* turn off leds */ + ledStateShadow &= (~(ledOffMask) & 0xffff); + + /* ledOnMask has priority over ledOffMask */ + ledStateShadow |= ledOnMask; + + /* turn off blinking */ + blink0Shadow &= (~(ledOffMask) & 0xffff); + blink1Shadow &= (~(ledOffMask) & 0xffff); + + setLeds(); +} + +/****************************************************************************** + * + * Description: + * Set the blink period for PWM0. Valid values are 0 - 255 where 0 + * means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz. + * + * Params: + * [in] period - the period for pwm0 + * + *****************************************************************************/ +void pca9532_setBlink0Period(uint8_t period) +{ + uint8_t buf[2]; + + buf[0] = PCA9532_PSC0; + buf[1] = period; + I2CWrite(PCA9532_I2C_ADDR, buf, 2); +} + +/****************************************************************************** + * + * Description: + * Set the duty cycle for PWM0. Valid values are 0 - 100. 25 means the LED + * is on 25% of the period. + * + * Params: + * [in] duty - duty cycle + * + *****************************************************************************/ +void pca9532_setBlink0Duty(uint8_t duty) +{ + uint8_t buf[2]; + uint32_t tmp = duty; + if (tmp > 100) { + tmp = 100; + } + + tmp = (256 * tmp)/100; + + buf[0] = PCA9532_PWM0; + buf[1] = tmp; + I2CWrite(PCA9532_I2C_ADDR, buf, 2); +} + +/****************************************************************************** + * + * Description: + * Set the LEDs that should blink with rate and duty cycle from PWM0. + * Blinking is turned off with pca9532_setLeds. + * + * Params: + * [in] ledMask - LEDs that should blink. + * + *****************************************************************************/ +void pca9532_setBlink0Leds(uint16_t ledMask) +{ + blink0Shadow |= ledMask; + setLeds(); +} + +/****************************************************************************** + * + * Description: + * Set the blink period for PWM1. Valid values are 0 - 255 where 0 + * means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz. + * + * Params: + * [in] period - The period for PWM1 + * + *****************************************************************************/ +void pca9532_setBlink1Period(uint8_t period) +{ + uint8_t buf[2]; + + buf[0] = PCA9532_PSC1; + buf[1] = period; + I2CWrite(PCA9532_I2C_ADDR, buf, 2); +} + +/****************************************************************************** + * + * Description: + * Set the duty cycle for PWM1. Valid values are 0 - 100. 25 means the LED + * is on 25% of the period. + * + * Params: + * [in] duty - duty cycle. + * + *****************************************************************************/ +void pca9532_setBlink1Duty(uint8_t duty) +{ + uint8_t buf[2]; + + uint32_t tmp = duty; + if (tmp > 100) { + tmp = 100; + } + + tmp = (256 * tmp)/100; + + buf[0] = PCA9532_PWM1; + buf[1] = tmp; + I2CWrite(PCA9532_I2C_ADDR, buf, 2); +} + +/****************************************************************************** + * + * Description: + * Set the LEDs that should blink with rate and duty cycle from PWM1. + * Blinking is turned off with pca9532_setLeds. + * + * Params: + * [in] ledMask - LEDs that should blink. + * + *****************************************************************************/ +void pca9532_setBlink1Leds(uint16_t ledMask) +{ + blink1Shadow |= ledMask; + setLeds(); +} diff --git a/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/uda1380.c b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/uda1380.c new file mode 100644 index 000000000..e50ac69d7 --- /dev/null +++ b/demos/bsp/boards/EA4357/Lib_OemBaseBoard/src/uda1380.c @@ -0,0 +1,156 @@ + +#include "lpc43xx_i2c.h" +#include "lpc43xx_scu.h" +#include "../inc/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; +} + + + diff --git a/demos/bsp/boards/board_ea4357.c b/demos/bsp/boards/board_ea4357.c index 5cc26fc33..b1ce827b6 100644 --- a/demos/bsp/boards/board_ea4357.c +++ b/demos/bsp/boards/board_ea4357.c @@ -183,4 +183,24 @@ uint32_t board_uart_recv(uint8_t *buffer, uint32_t length) } #endif + +/****************************************************************************** + * + * Description: + * Initialize the trim potentiometer, i.e. ADC connected to TrimPot on + * Base Board. + * + *****************************************************************************/ +//void trimpot_init(void) +//{ +// // pinsel for AD0.3 on p7.5 +// scu_pinmux( 7 , 5 , PDN_DISABLE | PUP_DISABLE | INBUF_DISABLE, 0 ); +// LPC_SCU->ENAIO0 |= (1<<3); +// +// ADC_Init(LPC_ADC0, 400000, 10); +// +// ADC_IntConfig(LPC_ADC0, ADC_ADINTEN2, DISABLE); +// ADC_ChannelCmd(LPC_ADC0, ADC_CH_TRIMPOT, ENABLE); +//} + #endif diff --git a/demos/host/.cproject b/demos/host/.cproject index 079ac0add..a27831bba 100644 --- a/demos/host/.cproject +++ b/demos/host/.cproject @@ -84,7 +84,7 @@ - + @@ -175,7 +175,7 @@ - +