On Tue, 20 Jul 2010, Jiří Kubias wrote:
> Nevejde se do pandory takze ti to posilam primo.
Posilam k patchi komentare a zaroven zkousim, jestli ten patch projde
pres rtime (proto nemazu zbytecne casti).
>
> From d523867685a388dcbdff659a6df07f667649b130 Mon Sep 17 00:00:00 2001
> From: Jiri Kubias <jiri.kubias(a)addat.cz>
> Date: Tue, 20 Jul 2010 14:03:43 +0200
> Subject: [PATCH] Added basic ARM & NXP CMSIS support
>
> Added new mach lpc17cmsis, successfully added some libs from CMSIS
Myslim, ze by se sluselo v komentari ke commitu uvest jakou verzi CMSIS
jsi naimportovat a odkud jsi ji stahl a jestli jsi ji nejak menil nebo
jsou to original zdrojaky.
Taky by asi bylo lepsi neposilat to vsechno v jednom obrovskem patchi,
ale rozdelit to na vic patchu a poradne je okomentovat - napriklad co
radka v tomto komentari, to jeden patch.
> Added new board for mbed development kit
Tady by zase bylo dobry vedet o jakou desku se presne jedna.
> Added app for test mbed_led blink
Ta aplikace se jmenuje mbed_blink a ne bled_led.
> Added cmsis-test which send out 0xAA to UART3 and send some dummy message to CAN2 at 125kbit
>
> TODO:
> * exclude board config file from mach
Jakej config file mas na myslis? Ja v patchi zadnej nevidim. A kdyby tam
byl, tak proc ho rovnou neodstranis?
> * add more libs from CMSIS
> * support direct loading app to microprocessor
> ---
> app/arm/cmsis-test/Makefile | 14 +
> app/arm/cmsis-test/Makefile.omk | 20 +
> app/arm/cmsis-test/main.c | 152 ++
> app/arm/mbed_blink/Makefile | 14 +
> app/arm/mbed_blink/Makefile.omk | 19 +
> app/arm/mbed_blink/main.c | 31 +
Zacinam prestavat mit rad adresar app. Vyhledove si myslim, ze by bylo
rozumny davat testovaci aplikace do adresare k desce nebo k mach. Zatim
to ale tady nech. Proberu to s Pavlem P. a pak to kdyztak presuneme
sami.
> arch/arm/mach-lpc17cmsis/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/Makefile.omk | 1 +
> arch/arm/mach-lpc17cmsis/defines/LPC17xx.h | 1039 +++++++++++
> arch/arm/mach-lpc17cmsis/defines/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/defines/Makefile.omk | 4 +
> arch/arm/mach-lpc17cmsis/defines/core_cm3.h | 978 ++++++++++
> arch/arm/mach-lpc17cmsis/defines/lpc17xx.h | 1 +
> arch/arm/mach-lpc17cmsis/defines/lpc_types.h | 197 ++
> arch/arm/mach-lpc17cmsis/libs/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/Makefile.omk | 3 +
> arch/arm/mach-lpc17cmsis/libs/adc/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/adc/Makefile.omk | 8 +
> arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.c | 335 ++++
> arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.h | 299 +++
> arch/arm/mach-lpc17cmsis/libs/boot/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/boot/Makefile.omk | 3 +
> arch/arm/mach-lpc17cmsis/libs/boot/crt0_17xx.c | 241 +++
> arch/arm/mach-lpc17cmsis/libs/boot/initarray.c | 1 +
> arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile.omk | 8 +
> arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.c | 1919 ++++++++++++++++++++
> arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.h | 855 +++++++++
> arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile.omk | 8 +
> .../mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.c | 345 ++++
> .../mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.h | 384 ++++
> arch/arm/mach-lpc17cmsis/libs/core/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/core/Makefile.omk | 5 +
> arch/arm/mach-lpc17cmsis/libs/core/core_cm3.c | 784 ++++++++
> arch/arm/mach-lpc17cmsis/libs/emac/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/emac/Makefile.omk | 11 +
> arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.c | 989 ++++++++++
> arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.h | 582 ++++++
> arch/arm/mach-lpc17cmsis/libs/gpio/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/gpio/Makefile.omk | 8 +
> arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.c | 657 +++++++
> arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.h | 166 ++
Co soubor to adresar a knihovna. Nebylo by lepsi dat to vsechno do jedne
knihovny s nazvem napriklad cmsis? Linker uz se postara, aby nepouzite
funkce nebyly zahrnuty v binarce.
To je zatim vse.
-Michal
> arch/arm/mach-lpc17cmsis/libs/ldscripts/Makefile | 14 +
> .../mach-lpc17cmsis/libs/ldscripts/Makefile.omk | 3 +
> .../libs/ldscripts/lpc1768.ld-flash | 25 +
> .../libs/ldscripts/lpc17xx-flash.ld | 117 ++
> arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile.omk | 8 +
> .../libs/libcfg/lpc17xx_libcfg_default.c | 64 +
> .../libs/libcfg/lpc17xx_libcfg_default.h | 163 ++
> arch/arm/mach-lpc17cmsis/libs/nvic/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/nvic/Makefile.omk | 8 +
> arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.c | 135 ++
> arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.h | 64 +
> arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile.omk | 8 +
> .../mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.c | 308 ++++
> .../mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.h | 210 +++
> arch/arm/mach-lpc17cmsis/libs/ssp/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/ssp/Makefile.omk | 8 +
> arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.c | 831 +++++++++
> arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.h | 457 +++++
> arch/arm/mach-lpc17cmsis/libs/system/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/system/Makefile.omk | 8 +
> .../mach-lpc17cmsis/libs/system/system_LPC17xx.c | 574 ++++++
> .../mach-lpc17cmsis/libs/system/system_LPC17xx.h | 63 +
> arch/arm/mach-lpc17cmsis/libs/uart/Makefile | 14 +
> arch/arm/mach-lpc17cmsis/libs/uart/Makefile.omk | 12 +
> arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.c | 1538 ++++++++++++++++
> arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.h | 633 +++++++
> .../mach-lpc17cmsis/tools/lpcchksum/lpcchksum.sh | 6 +
> board/arm/lpc17cmsis-mbed/Makefile | 14 +
> board/arm/lpc17cmsis-mbed/Makefile.omk | 6 +
> board/arm/lpc17cmsis-mbed/board.ld | 1 +
> board/arm/lpc17cmsis-mbed/config.lpc17xx-mbed | 46 +
> board/arm/lpc17cmsis-mbed/system_def.h | 1 +
> 77 files changed, 15630 insertions(+), 0 deletions(-)
> create mode 100644 app/arm/cmsis-test/Makefile
> create mode 100644 app/arm/cmsis-test/Makefile.omk
> create mode 100644 app/arm/cmsis-test/main.c
> create mode 100644 app/arm/mbed_blink/Makefile
> create mode 100644 app/arm/mbed_blink/Makefile.omk
> create mode 100644 app/arm/mbed_blink/main.c
> create mode 100644 arch/arm/mach-lpc17cmsis/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/defines/LPC17xx.h
> create mode 100644 arch/arm/mach-lpc17cmsis/defines/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/defines/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/defines/core_cm3.h
> create mode 120000 arch/arm/mach-lpc17cmsis/defines/lpc17xx.h
> create mode 100644 arch/arm/mach-lpc17cmsis/defines/lpc_types.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/adc/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/adc/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/boot/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/boot/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/boot/crt0_17xx.c
> create mode 120000 arch/arm/mach-lpc17cmsis/libs/boot/initarray.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/core/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/core/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/core/core_cm3.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/emac/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/emac/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/gpio/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/gpio/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/ldscripts/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/ldscripts/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/ldscripts/lpc1768.ld-flash
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/ldscripts/lpc17xx-flash.ld
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/libcfg/lpc17xx_libcfg_default.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/libcfg/lpc17xx_libcfg_default.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/nvic/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/nvic/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/ssp/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/ssp/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/system/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/system/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/system/system_LPC17xx.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/system/system_LPC17xx.h
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/uart/Makefile
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/uart/Makefile.omk
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.c
> create mode 100644 arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.h
> create mode 100755 arch/arm/mach-lpc17cmsis/tools/lpcchksum/lpcchksum.sh
> create mode 100644 board/arm/lpc17cmsis-mbed/Makefile
> create mode 100644 board/arm/lpc17cmsis-mbed/Makefile.omk
> create mode 100644 board/arm/lpc17cmsis-mbed/board.ld
> create mode 100644 board/arm/lpc17cmsis-mbed/config.lpc17xx-mbed
> create mode 100644 board/arm/lpc17cmsis-mbed/system_def.h
>
> diff --git a/app/arm/cmsis-test/Makefile b/app/arm/cmsis-test/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/app/arm/cmsis-test/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/app/arm/cmsis-test/Makefile.omk b/app/arm/cmsis-test/Makefile.omk
> new file mode 100644
> index 0000000..7605237
> --- /dev/null
> +++ b/app/arm/cmsis-test/Makefile.omk
> @@ -0,0 +1,20 @@
> +# -*- makefile -*-
> +MY_MACH = lpc17cmsis
> +ifeq ($(MACH), $(MY_MACH))
> +
> +
> +# eb_blink je nazev programu, pod timto navzem bude systemem prekladan
> +bin_PROGRAMS = mbed_test
> +
> +
> +# za nazev_programu_SOURCES se davaji vsechny C zdrojaky, ktere se budou kompilovat
> +mbed_test_SOURCES = main.c
> +#lpc17xx_clkpwr.c
> +mbed_test_LIBS = system gpio can-cm uart libcfg clkpwr pinsel
> +
> +
> +else
> +ifeq ($(RELATIVE_DIR),$(INVOCATION_DIR))
> +$(error Not my mach - $(MY_MACH). Not going to compile!)
> +endif
> +endif
> diff --git a/app/arm/cmsis-test/main.c b/app/arm/cmsis-test/main.c
> new file mode 100644
> index 0000000..0f8c436
> --- /dev/null
> +++ b/app/arm/cmsis-test/main.c
> @@ -0,0 +1,152 @@
> +#include <lpc17xx_gpio.h>
> +#include <lpc17xx_emac.h>
> +#include <lpc17xx_uart.h>
> +#include <lpc17xx_pinsel.h>
> +#include <lpc17xx_can.h>
> +
> +#include <system_LPC17xx.h>
> +
> +#include <core_cm3.h>
> +#include <LPC17xx.h>
> +
> +
> +
> +
> +
> +#define LED1 (1<<18)
> +#define LED2 (1<<20)
> +#define LED3 (1<<21)
> +#define LED4 (1<<23)
> +
> +
> +volatile unsigned int ms_time = 0;
> +
> +void delay(void)
> +{
> + volatile unsigned int i = 500000;
> + while(--i);
> +}
> +
> +
> +
> +
> +void SysTick_Handler(void) __attribute__ ((interrupt));
> +void SysTick_Handler(void)
> +{
> + ++ms_time;
> +}
> +
> +
> +
> +#define CAN_PINSEL_RD2_P0_4 {0, 4, 2, \
> + PINSEL_PINMODE_PULLUP, \
> + PINSEL_PINMODE_NORMAL}
> +
> +#define CAN_PINSEL_TD2_P0_5 {0, 5, 2, \
> + PINSEL_PINMODE_PULLUP, \
> + PINSEL_PINMODE_NORMAL}
> +
> +#define CAN_PINSEL_RD2_P2_7 {2, 7, 1, \
> + PINSEL_PINMODE_PULLUP, \
> + PINSEL_PINMODE_NORMAL}
> +
> +#define CAN_PINSEL_TD2_P2_8 {2, 8, 1, \
> + PINSEL_PINMODE_PULLUP, \
> + PINSEL_PINMODE_NORMAL}
> +
> +
> +#define CAN_MAX_RD2_PIN (2)
> +#define CAN_MAX_TD2_PIN (2)
> +
> +const PINSEL_CFG_Type can_rd2_pin[CAN_MAX_RD2_PIN] = {
> + CAN_PINSEL_RD2_P0_4, CAN_PINSEL_RD2_P2_7 };
> +const PINSEL_CFG_Type can_td2_pin[CAN_MAX_TD2_PIN] = {
> + CAN_PINSEL_TD2_P0_5, CAN_PINSEL_TD2_P2_8 };
> +
> +
> + CAN_MSG_Type TXMsg;
> +
> +void init_can(void)
> +{
> + CAN_PinCFG_Type CAN2PinStruct;
> + CAN2PinStruct.RD = CAN_RD2_P0_4;
> + CAN2PinStruct.TD = CAN_TD2_P0_5;
> +
> + PINSEL_ConfigPin((PINSEL_CFG_Type *) (&can_rd2_pin[CAN2PinStruct.RD]));
> + PINSEL_ConfigPin((PINSEL_CFG_Type *) (&can_td2_pin[CAN2PinStruct.TD]));
> +
> + CAN_Init(LPC_CAN2, 125000);
> +
> + TXMsg.id = 0x08;
> + TXMsg.len = 0x08;
> + TXMsg.type = DATA_FRAME;
> + TXMsg.format = STD_ID_FORMAT;
> + TXMsg.dataA[0] = TXMsg.dataA[1] = TXMsg.dataA[2]= TXMsg.dataA[3]= 0x78;
> + TXMsg.dataB[0] = TXMsg.dataB[1] = TXMsg.dataB[2]= TXMsg.dataB[3]= 0x21;
> +
> +
> + CAN_SendMsg(LPC_CAN2, &TXMsg);
> +
> +}
> +
> +
> +
> +
> +
> +
> + PINSEL_CFG_Type PinCfg;
> + UART_CFG_Type UARTConfigStruct;
> +void init_uart(void)
> +{
> + PinCfg.Funcnum = 2;
> + PinCfg.OpenDrain = 0;
> + PinCfg.Pinmode = 0;
> + PinCfg.Pinnum = 0;
> + PinCfg.Portnum = 0;
> + PINSEL_ConfigPin(&PinCfg);
> + PinCfg.Pinnum = 1;
> + PINSEL_ConfigPin(&PinCfg);
> +
> + UART_ConfigStructInit(&UARTConfigStruct);
> + UART_Init(LPC_UART3, &UARTConfigStruct);
> +
> + UART_TxCmd(LPC_UART3, ENABLE);
> +}
> +
> +
> +
> +int main(void)
> +{
> +
> + SystemInit();
> + SystemCoreClockUpdate();
> + SysTick_Config(SystemCoreClock/1000 - 1);
> +
> +
> + init_uart();
> + init_can();
> +
> + int pom = ms_time + 100;
> +
> + GPIO_SetDir(1, LED1, 1);
> + GPIO_SetDir(1, LED2, 1);
> + GPIO_SetDir(1, LED3, 1);
> + GPIO_SetDir(1, LED4, 1);
> +
> +
> + while(1)
> + {
> + if(pom < ms_time)
> + {
> +
> + UART_SendData(LPC_UART3, 0xAA);
> +
> + if(GPIO_ReadValue(1) & LED1)
> + GPIO_ClearValue(1, LED1);
> + else
> + GPIO_SetValue(1, LED1);
> + pom = ms_time + 100;
> + }
> + };
> +
> +}
> \ No newline at end of file
> diff --git a/app/arm/mbed_blink/Makefile b/app/arm/mbed_blink/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/app/arm/mbed_blink/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/app/arm/mbed_blink/Makefile.omk b/app/arm/mbed_blink/Makefile.omk
> new file mode 100644
> index 0000000..bfd461b
> --- /dev/null
> +++ b/app/arm/mbed_blink/Makefile.omk
> @@ -0,0 +1,19 @@
> +# -*- makefile -*-
> +MY_BOARD = lpc17cmsis-mbed
> +ifeq ($(BOARD), $(MY_BOARD))
> +
> +
> +# eb_blink je nazev programu, pod timto navzem bude systemem prekladan
> +bin_PROGRAMS = mbed_blink
> +
> +
> +# za nazev_programu_SOURCES se davaji vsechny C zdrojaky, ktere se budou kompilovat
> +mbed_blink_SOURCES = main.c
> +
> +
> +
> +else
> +ifeq ($(RELATIVE_DIR),$(INVOCATION_DIR))
> +$(error Not my board - $(MY_BOARD). Not going to compile!)
> +endif
> +endif
> diff --git a/app/arm/mbed_blink/main.c b/app/arm/mbed_blink/main.c
> new file mode 100644
> index 0000000..7a9278d
> --- /dev/null
> +++ b/app/arm/mbed_blink/main.c
> @@ -0,0 +1,31 @@
> +#include <LPC17xx.h>
> +
> +#define LED1 (1<<18)
> +#define LED2 (1<<20)
> +#define LED3 (1<<21)
> +#define LED4 (1<<23)
> +
> +
> +void delay(void)
> +{
> + volatile unsigned int i = 50000;
> + while(--i);
> +}
> +
> +int main(void)
> +{
> +
> +
> + LPC_PINCON->PINSEL3 &= ~(3 << 4);
> + LPC_GPIO1->FIODIR |=LED1;
> +
> +
> +while(1)
> + {
> + delay();
> + LPC_GPIO1->FIOSET = (1<<18);
> + delay();
> + LPC_GPIO1->FIOCLR = (1<<18);
> + };
> +
> +}
> \ No newline at end of file
> diff --git a/arch/arm/mach-lpc17cmsis/Makefile b/arch/arm/mach-lpc17cmsis/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/Makefile.omk b/arch/arm/mach-lpc17cmsis/Makefile.omk
> new file mode 100644
> index 0000000..2ebd5c8
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/Makefile.omk
> @@ -0,0 +1 @@
> +SUBDIRS = defines libs
> diff --git a/arch/arm/mach-lpc17cmsis/defines/LPC17xx.h b/arch/arm/mach-lpc17cmsis/defines/LPC17xx.h
> new file mode 100644
> index 0000000..98bc137
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/defines/LPC17xx.h
> @@ -0,0 +1,1039 @@
> +/**************************************************************************//**
> + * @file LPC17xx.h
> + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File for
> + * NXP LPC17xx Device Series
> + * @version V1.07
> + * @date 19. October 2009
> + *
> + * @note
> + * Copyright (C) 2009 ARM Limited. All rights reserved.
> + *
> + * @par
> + * ARM Limited (ARM) is supplying this software for use with Cortex-M
> + * processor based microcontrollers. This file can be freely distributed
> + * within development tools that are supporting such ARM based processors.
> + *
> + * @par
> + * 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.
> + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
> + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
> + *
> + ******************************************************************************/
> +
> +
> +#ifndef __LPC17xx_H__
> +#define __LPC17xx_H__
> +
> +/*
> + * ==========================================================================
> + * ---------- Interrupt Number Definition -----------------------------------
> + * ==========================================================================
> + */
> +
> +typedef enum IRQn
> +{
> +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/
> + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
> + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */
> + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */
> + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */
> + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */
> + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */
> + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */
> + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */
> +
> +/****** LPC17xx Specific Interrupt Numbers *******************************************************/
> + WDT_IRQn = 0, /*!< Watchdog Timer Interrupt */
> + TIMER0_IRQn = 1, /*!< Timer0 Interrupt */
> + TIMER1_IRQn = 2, /*!< Timer1 Interrupt */
> + TIMER2_IRQn = 3, /*!< Timer2 Interrupt */
> + TIMER3_IRQn = 4, /*!< Timer3 Interrupt */
> + UART0_IRQn = 5, /*!< UART0 Interrupt */
> + UART1_IRQn = 6, /*!< UART1 Interrupt */
> + UART2_IRQn = 7, /*!< UART2 Interrupt */
> + UART3_IRQn = 8, /*!< UART3 Interrupt */
> + PWM1_IRQn = 9, /*!< PWM1 Interrupt */
> + I2C0_IRQn = 10, /*!< I2C0 Interrupt */
> + I2C1_IRQn = 11, /*!< I2C1 Interrupt */
> + I2C2_IRQn = 12, /*!< I2C2 Interrupt */
> + SPI_IRQn = 13, /*!< SPI Interrupt */
> + SSP0_IRQn = 14, /*!< SSP0 Interrupt */
> + SSP1_IRQn = 15, /*!< SSP1 Interrupt */
> + PLL0_IRQn = 16, /*!< PLL0 Lock (Main PLL) Interrupt */
> + RTC_IRQn = 17, /*!< Real Time Clock Interrupt */
> + EINT0_IRQn = 18, /*!< External Interrupt 0 Interrupt */
> + EINT1_IRQn = 19, /*!< External Interrupt 1 Interrupt */
> + EINT2_IRQn = 20, /*!< External Interrupt 2 Interrupt */
> + EINT3_IRQn = 21, /*!< External Interrupt 3 Interrupt */
> + ADC_IRQn = 22, /*!< A/D Converter Interrupt */
> + BOD_IRQn = 23, /*!< Brown-Out Detect Interrupt */
> + USB_IRQn = 24, /*!< USB Interrupt */
> + CAN_IRQn = 25, /*!< CAN Interrupt */
> + DMA_IRQn = 26, /*!< General Purpose DMA Interrupt */
> + I2S_IRQn = 27, /*!< I2S Interrupt */
> + ENET_IRQn = 28, /*!< Ethernet Interrupt */
> + RIT_IRQn = 29, /*!< Repetitive Interrupt Timer Interrupt */
> + MCPWM_IRQn = 30, /*!< Motor Control PWM Interrupt */
> + QEI_IRQn = 31, /*!< Quadrature Encoder Interface Interrupt */
> + PLL1_IRQn = 32, /*!< PLL1 Lock (USB PLL) Interrupt */
> + USBActivity_IRQn = 33, /*!< USB Activity Interrupt */
> + CANActivity_IRQn = 34, /*!< CAN Activity Interrupt */
> +} IRQn_Type;
> +
> +
> +/*
> + * ==========================================================================
> + * ----------- Processor and Core Peripheral Section ------------------------
> + * ==========================================================================
> + */
> +
> +/* Configuration of the Cortex-M3 Processor and Core Peripherals */
> +#define __MPU_PRESENT 1 /*!< MPU present or not */
> +#define __NVIC_PRIO_BITS 5 /*!< Number of Bits used for Priority Levels */
> +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
> +
> +
> +#include "core_cm3.h" /* Cortex-M3 processor and core peripherals */
> +#include "system_LPC17xx.h" /* System Header */
> +
> +
> +/******************************************************************************/
> +/* Device Specific Peripheral registers structures */
> +/******************************************************************************/
> +
> +#if defined ( __CC_ARM )
> +#pragma anon_unions
> +#endif
> +
> +/*------------- System Control (SC) ------------------------------------------*/
> +typedef struct
> +{
> + __IO uint32_t FLASHCFG; /* Flash Accelerator Module */
> + uint32_t RESERVED0[31];
> + __IO uint32_t PLL0CON; /* Clocking and Power Control */
> + __IO uint32_t PLL0CFG;
> + __I uint32_t PLL0STAT;
> + __O uint32_t PLL0FEED;
> + uint32_t RESERVED1[4];
> + __IO uint32_t PLL1CON;
> + __IO uint32_t PLL1CFG;
> + __I uint32_t PLL1STAT;
> + __O uint32_t PLL1FEED;
> + uint32_t RESERVED2[4];
> + __IO uint32_t PCON;
> + __IO uint32_t PCONP;
> + uint32_t RESERVED3[15];
> + __IO uint32_t CCLKCFG;
> + __IO uint32_t USBCLKCFG;
> + __IO uint32_t CLKSRCSEL;
> + uint32_t RESERVED4[12];
> + __IO uint32_t EXTINT; /* External Interrupts */
> + uint32_t RESERVED5;
> + __IO uint32_t EXTMODE;
> + __IO uint32_t EXTPOLAR;
> + uint32_t RESERVED6[12];
> + __IO uint32_t RSID; /* Reset */
> + uint32_t RESERVED7[7];
> + __IO uint32_t SCS; /* Syscon Miscellaneous Registers */
> + __IO uint32_t IRCTRIM; /* Clock Dividers */
> + __IO uint32_t PCLKSEL0;
> + __IO uint32_t PCLKSEL1;
> + uint32_t RESERVED8[4];
> + __IO uint32_t USBIntSt; /* USB Device/OTG Interrupt Register */
> + __IO uint32_t DMAREQSEL;
> + __IO uint32_t CLKOUTCFG; /* Clock Output Configuration */
> + } LPC_SC_TypeDef;
> +
> +/*------------- Pin Connect Block (PINCON) -----------------------------------*/
> +typedef struct
> +{
> + __IO uint32_t PINSEL0;
> + __IO uint32_t PINSEL1;
> + __IO uint32_t PINSEL2;
> + __IO uint32_t PINSEL3;
> + __IO uint32_t PINSEL4;
> + __IO uint32_t PINSEL5;
> + __IO uint32_t PINSEL6;
> + __IO uint32_t PINSEL7;
> + __IO uint32_t PINSEL8;
> + __IO uint32_t PINSEL9;
> + __IO uint32_t PINSEL10;
> + uint32_t RESERVED0[5];
> + __IO uint32_t PINMODE0;
> + __IO uint32_t PINMODE1;
> + __IO uint32_t PINMODE2;
> + __IO uint32_t PINMODE3;
> + __IO uint32_t PINMODE4;
> + __IO uint32_t PINMODE5;
> + __IO uint32_t PINMODE6;
> + __IO uint32_t PINMODE7;
> + __IO uint32_t PINMODE8;
> + __IO uint32_t PINMODE9;
> + __IO uint32_t PINMODE_OD0;
> + __IO uint32_t PINMODE_OD1;
> + __IO uint32_t PINMODE_OD2;
> + __IO uint32_t PINMODE_OD3;
> + __IO uint32_t PINMODE_OD4;
> + __IO uint32_t I2CPADCFG;
> +} LPC_PINCON_TypeDef;
> +
> +/*------------- General Purpose Input/Output (GPIO) --------------------------*/
> +typedef struct
> +{
> + union {
> + __IO uint32_t FIODIR;
> + struct {
> + __IO uint16_t FIODIRL;
> + __IO uint16_t FIODIRH;
> + };
> + struct {
> + __IO uint8_t FIODIR0;
> + __IO uint8_t FIODIR1;
> + __IO uint8_t FIODIR2;
> + __IO uint8_t FIODIR3;
> + };
> + };
> + uint32_t RESERVED0[3];
> + union {
> + __IO uint32_t FIOMASK;
> + struct {
> + __IO uint16_t FIOMASKL;
> + __IO uint16_t FIOMASKH;
> + };
> + struct {
> + __IO uint8_t FIOMASK0;
> + __IO uint8_t FIOMASK1;
> + __IO uint8_t FIOMASK2;
> + __IO uint8_t FIOMASK3;
> + };
> + };
> + union {
> + __IO uint32_t FIOPIN;
> + struct {
> + __IO uint16_t FIOPINL;
> + __IO uint16_t FIOPINH;
> + };
> + struct {
> + __IO uint8_t FIOPIN0;
> + __IO uint8_t FIOPIN1;
> + __IO uint8_t FIOPIN2;
> + __IO uint8_t FIOPIN3;
> + };
> + };
> + union {
> + __IO uint32_t FIOSET;
> + struct {
> + __IO uint16_t FIOSETL;
> + __IO uint16_t FIOSETH;
> + };
> + struct {
> + __IO uint8_t FIOSET0;
> + __IO uint8_t FIOSET1;
> + __IO uint8_t FIOSET2;
> + __IO uint8_t FIOSET3;
> + };
> + };
> + union {
> + __O uint32_t FIOCLR;
> + struct {
> + __O uint16_t FIOCLRL;
> + __O uint16_t FIOCLRH;
> + };
> + struct {
> + __O uint8_t FIOCLR0;
> + __O uint8_t FIOCLR1;
> + __O uint8_t FIOCLR2;
> + __O uint8_t FIOCLR3;
> + };
> + };
> +} LPC_GPIO_TypeDef;
> +
> +typedef struct
> +{
> + __I uint32_t IntStatus;
> + __I uint32_t IO0IntStatR;
> + __I uint32_t IO0IntStatF;
> + __O uint32_t IO0IntClr;
> + __IO uint32_t IO0IntEnR;
> + __IO uint32_t IO0IntEnF;
> + uint32_t RESERVED0[3];
> + __I uint32_t IO2IntStatR;
> + __I uint32_t IO2IntStatF;
> + __O uint32_t IO2IntClr;
> + __IO uint32_t IO2IntEnR;
> + __IO uint32_t IO2IntEnF;
> +} LPC_GPIOINT_TypeDef;
> +
> +/*------------- Timer (TIM) --------------------------------------------------*/
> +typedef struct
> +{
> + __IO uint32_t IR;
> + __IO uint32_t TCR;
> + __IO uint32_t TC;
> + __IO uint32_t PR;
> + __IO uint32_t PC;
> + __IO uint32_t MCR;
> + __IO uint32_t MR0;
> + __IO uint32_t MR1;
> + __IO uint32_t MR2;
> + __IO uint32_t MR3;
> + __IO uint32_t CCR;
> + __I uint32_t CR0;
> + __I uint32_t CR1;
> + uint32_t RESERVED0[2];
> + __IO uint32_t EMR;
> + uint32_t RESERVED1[12];
> + __IO uint32_t CTCR;
> +} LPC_TIM_TypeDef;
> +
> +/*------------- Pulse-Width Modulation (PWM) ---------------------------------*/
> +typedef struct
> +{
> + __IO uint32_t IR;
> + __IO uint32_t TCR;
> + __IO uint32_t TC;
> + __IO uint32_t PR;
> + __IO uint32_t PC;
> + __IO uint32_t MCR;
> + __IO uint32_t MR0;
> + __IO uint32_t MR1;
> + __IO uint32_t MR2;
> + __IO uint32_t MR3;
> + __IO uint32_t CCR;
> + __I uint32_t CR0;
> + __I uint32_t CR1;
> + __I uint32_t CR2;
> + __I uint32_t CR3;
> + uint32_t RESERVED0;
> + __IO uint32_t MR4;
> + __IO uint32_t MR5;
> + __IO uint32_t MR6;
> + __IO uint32_t PCR;
> + __IO uint32_t LER;
> + uint32_t RESERVED1[7];
> + __IO uint32_t CTCR;
> +} LPC_PWM_TypeDef;
> +
> +/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/
> +typedef struct
> +{
> + union {
> + __I uint8_t RBR;
> + __O uint8_t THR;
> + __IO uint8_t DLL;
> + uint32_t RESERVED0;
> + };
> + union {
> + __IO uint8_t DLM;
> + __IO uint32_t IER;
> + };
> + union {
> + __I uint32_t IIR;
> + __O uint8_t FCR;
> + };
> + __IO uint8_t LCR;
> + uint8_t RESERVED1[7];
> + __I uint8_t LSR;
> + uint8_t RESERVED2[7];
> + __IO uint8_t SCR;
> + uint8_t RESERVED3[3];
> + __IO uint32_t ACR;
> + __IO uint8_t ICR;
> + uint8_t RESERVED4[3];
> + __IO uint8_t FDR;
> + uint8_t RESERVED5[7];
> + __IO uint8_t TER;
> + uint8_t RESERVED6[39];
> + __I uint8_t FIFOLVL;
> +} LPC_UART_TypeDef;
> +
> +typedef struct
> +{
> + union {
> + __I uint8_t RBR;
> + __O uint8_t THR;
> + __IO uint8_t DLL;
> + uint32_t RESERVED0;
> + };
> + union {
> + __IO uint8_t DLM;
> + __IO uint32_t IER;
> + };
> + union {
> + __I uint32_t IIR;
> + __O uint8_t FCR;
> + };
> + __IO uint8_t LCR;
> + uint8_t RESERVED1[7];
> + __I uint8_t LSR;
> + uint8_t RESERVED2[7];
> + __IO uint8_t SCR;
> + uint8_t RESERVED3[3];
> + __IO uint32_t ACR;
> + __IO uint8_t ICR;
> + uint8_t RESERVED4[3];
> + __IO uint8_t FDR;
> + uint8_t RESERVED5[7];
> + __IO uint8_t TER;
> + uint8_t RESERVED6[39];
> + __I uint8_t FIFOLVL;
> +} LPC_UART0_TypeDef;
> +
> +typedef struct
> +{
> + union {
> + __I uint8_t RBR;
> + __O uint8_t THR;
> + __IO uint8_t DLL;
> + uint32_t RESERVED0;
> + };
> + union {
> + __IO uint8_t DLM;
> + __IO uint32_t IER;
> + };
> + union {
> + __I uint32_t IIR;
> + __O uint8_t FCR;
> + };
> + __IO uint8_t LCR;
> + uint8_t RESERVED1[3];
> + __IO uint8_t MCR;
> + uint8_t RESERVED2[3];
> + __I uint8_t LSR;
> + uint8_t RESERVED3[3];
> + __I uint8_t MSR;
> + uint8_t RESERVED4[3];
> + __IO uint8_t SCR;
> + uint8_t RESERVED5[3];
> + __IO uint32_t ACR;
> + uint32_t RESERVED6;
> + __IO uint32_t FDR;
> + uint32_t RESERVED7;
> + __IO uint8_t TER;
> + uint8_t RESERVED8[27];
> + __IO uint8_t RS485CTRL;
> + uint8_t RESERVED9[3];
> + __IO uint8_t ADRMATCH;
> + uint8_t RESERVED10[3];
> + __IO uint8_t RS485DLY;
> + uint8_t RESERVED11[3];
> + __I uint8_t FIFOLVL;
> +} LPC_UART1_TypeDef;
> +
> +/*------------- Serial Peripheral Interface (SPI) ----------------------------*/
> +typedef struct
> +{
> + __IO uint32_t SPCR;
> + __I uint32_t SPSR;
> + __IO uint32_t SPDR;
> + __IO uint32_t SPCCR;
> + uint32_t RESERVED0[3];
> + __IO uint32_t SPINT;
> +} LPC_SPI_TypeDef;
> +
> +/*------------- Synchronous Serial Communication (SSP) -----------------------*/
> +typedef struct
> +{
> + __IO uint32_t CR0;
> + __IO uint32_t CR1;
> + __IO uint32_t DR;
> + __I uint32_t SR;
> + __IO uint32_t CPSR;
> + __IO uint32_t IMSC;
> + __IO uint32_t RIS;
> + __IO uint32_t MIS;
> + __IO uint32_t ICR;
> + __IO uint32_t DMACR;
> +} LPC_SSP_TypeDef;
> +
> +/*------------- Inter-Integrated Circuit (I2C) -------------------------------*/
> +typedef struct
> +{
> + __IO uint32_t I2CONSET;
> + __I uint32_t I2STAT;
> + __IO uint32_t I2DAT;
> + __IO uint32_t I2ADR0;
> + __IO uint32_t I2SCLH;
> + __IO uint32_t I2SCLL;
> + __O uint32_t I2CONCLR;
> + __IO uint32_t MMCTRL;
> + __IO uint32_t I2ADR1;
> + __IO uint32_t I2ADR2;
> + __IO uint32_t I2ADR3;
> + __I uint32_t I2DATA_BUFFER;
> + __IO uint32_t I2MASK0;
> + __IO uint32_t I2MASK1;
> + __IO uint32_t I2MASK2;
> + __IO uint32_t I2MASK3;
> +} LPC_I2C_TypeDef;
> +
> +/*------------- Inter IC Sound (I2S) -----------------------------------------*/
> +typedef struct
> +{
> + __IO uint32_t I2SDAO;
> + __IO uint32_t I2SDAI;
> + __O uint32_t I2STXFIFO;
> + __I uint32_t I2SRXFIFO;
> + __I uint32_t I2SSTATE;
> + __IO uint32_t I2SDMA1;
> + __IO uint32_t I2SDMA2;
> + __IO uint32_t I2SIRQ;
> + __IO uint32_t I2STXRATE;
> + __IO uint32_t I2SRXRATE;
> + __IO uint32_t I2STXBITRATE;
> + __IO uint32_t I2SRXBITRATE;
> + __IO uint32_t I2STXMODE;
> + __IO uint32_t I2SRXMODE;
> +} LPC_I2S_TypeDef;
> +
> +/*------------- Repetitive Interrupt Timer (RIT) -----------------------------*/
> +typedef struct
> +{
> + __IO uint32_t RICOMPVAL;
> + __IO uint32_t RIMASK;
> + __IO uint8_t RICTRL;
> + uint8_t RESERVED0[3];
> + __IO uint32_t RICOUNTER;
> +} LPC_RIT_TypeDef;
> +
> +/*------------- Real-Time Clock (RTC) ----------------------------------------*/
> +typedef struct
> +{
> + __IO uint8_t ILR;
> + uint8_t RESERVED0[7];
> + __IO uint8_t CCR;
> + uint8_t RESERVED1[3];
> + __IO uint8_t CIIR;
> + uint8_t RESERVED2[3];
> + __IO uint8_t AMR;
> + uint8_t RESERVED3[3];
> + __I uint32_t CTIME0;
> + __I uint32_t CTIME1;
> + __I uint32_t CTIME2;
> + __IO uint8_t SEC;
> + uint8_t RESERVED4[3];
> + __IO uint8_t MIN;
> + uint8_t RESERVED5[3];
> + __IO uint8_t HOUR;
> + uint8_t RESERVED6[3];
> + __IO uint8_t DOM;
> + uint8_t RESERVED7[3];
> + __IO uint8_t DOW;
> + uint8_t RESERVED8[3];
> + __IO uint16_t DOY;
> + uint16_t RESERVED9;
> + __IO uint8_t MONTH;
> + uint8_t RESERVED10[3];
> + __IO uint16_t YEAR;
> + uint16_t RESERVED11;
> + __IO uint32_t CALIBRATION;
> + __IO uint32_t GPREG0;
> + __IO uint32_t GPREG1;
> + __IO uint32_t GPREG2;
> + __IO uint32_t GPREG3;
> + __IO uint32_t GPREG4;
> + __IO uint8_t RTC_AUXEN;
> + uint8_t RESERVED12[3];
> + __IO uint8_t RTC_AUX;
> + uint8_t RESERVED13[3];
> + __IO uint8_t ALSEC;
> + uint8_t RESERVED14[3];
> + __IO uint8_t ALMIN;
> + uint8_t RESERVED15[3];
> + __IO uint8_t ALHOUR;
> + uint8_t RESERVED16[3];
> + __IO uint8_t ALDOM;
> + uint8_t RESERVED17[3];
> + __IO uint8_t ALDOW;
> + uint8_t RESERVED18[3];
> + __IO uint16_t ALDOY;
> + uint16_t RESERVED19;
> + __IO uint8_t ALMON;
> + uint8_t RESERVED20[3];
> + __IO uint16_t ALYEAR;
> + uint16_t RESERVED21;
> +} LPC_RTC_TypeDef;
> +
> +/*------------- Watchdog Timer (WDT) -----------------------------------------*/
> +typedef struct
> +{
> + __IO uint8_t WDMOD;
> + uint8_t RESERVED0[3];
> + __IO uint32_t WDTC;
> + __O uint8_t WDFEED;
> + uint8_t RESERVED1[3];
> + __I uint32_t WDTV;
> + __IO uint32_t WDCLKSEL;
> +} LPC_WDT_TypeDef;
> +
> +/*------------- Analog-to-Digital Converter (ADC) ----------------------------*/
> +typedef struct
> +{
> + __IO uint32_t ADCR;
> + __IO uint32_t ADGDR;
> + uint32_t RESERVED0;
> + __IO uint32_t ADINTEN;
> + __I uint32_t ADDR0;
> + __I uint32_t ADDR1;
> + __I uint32_t ADDR2;
> + __I uint32_t ADDR3;
> + __I uint32_t ADDR4;
> + __I uint32_t ADDR5;
> + __I uint32_t ADDR6;
> + __I uint32_t ADDR7;
> + __I uint32_t ADSTAT;
> + __IO uint32_t ADTRM;
> +} LPC_ADC_TypeDef;
> +
> +/*------------- Digital-to-Analog Converter (DAC) ----------------------------*/
> +typedef struct
> +{
> + __IO uint32_t DACR;
> + __IO uint32_t DACCTRL;
> + __IO uint16_t DACCNTVAL;
> +} LPC_DAC_TypeDef;
> +
> +/*------------- Motor Control Pulse-Width Modulation (MCPWM) -----------------*/
> +typedef struct
> +{
> + __I uint32_t MCCON;
> + __O uint32_t MCCON_SET;
> + __O uint32_t MCCON_CLR;
> + __I uint32_t MCCAPCON;
> + __O uint32_t MCCAPCON_SET;
> + __O uint32_t MCCAPCON_CLR;
> + __IO uint32_t MCTIM0;
> + __IO uint32_t MCTIM1;
> + __IO uint32_t MCTIM2;
> + __IO uint32_t MCPER0;
> + __IO uint32_t MCPER1;
> + __IO uint32_t MCPER2;
> + __IO uint32_t MCPW0;
> + __IO uint32_t MCPW1;
> + __IO uint32_t MCPW2;
> + __IO uint32_t MCDEADTIME;
> + __IO uint32_t MCCCP;
> + __IO uint32_t MCCR0;
> + __IO uint32_t MCCR1;
> + __IO uint32_t MCCR2;
> + __I uint32_t MCINTEN;
> + __O uint32_t MCINTEN_SET;
> + __O uint32_t MCINTEN_CLR;
> + __I uint32_t MCCNTCON;
> + __O uint32_t MCCNTCON_SET;
> + __O uint32_t MCCNTCON_CLR;
> + __I uint32_t MCINTFLAG;
> + __O uint32_t MCINTFLAG_SET;
> + __O uint32_t MCINTFLAG_CLR;
> + __O uint32_t MCCAP_CLR;
> +} LPC_MCPWM_TypeDef;
> +
> +/*------------- Quadrature Encoder Interface (QEI) ---------------------------*/
> +typedef struct
> +{
> + __O uint32_t QEICON;
> + __I uint32_t QEISTAT;
> + __IO uint32_t QEICONF;
> + __I uint32_t QEIPOS;
> + __IO uint32_t QEIMAXPOS;
> + __IO uint32_t CMPOS0;
> + __IO uint32_t CMPOS1;
> + __IO uint32_t CMPOS2;
> + __I uint32_t INXCNT;
> + __IO uint32_t INXCMP;
> + __IO uint32_t QEILOAD;
> + __I uint32_t QEITIME;
> + __I uint32_t QEIVEL;
> + __I uint32_t QEICAP;
> + __IO uint32_t VELCOMP;
> + __IO uint32_t FILTER;
> + uint32_t RESERVED0[998];
> + __O uint32_t QEIIEC;
> + __O uint32_t QEIIES;
> + __I uint32_t QEIINTSTAT;
> + __I uint32_t QEIIE;
> + __O uint32_t QEICLR;
> + __O uint32_t QEISET;
> +} LPC_QEI_TypeDef;
> +
> +/*------------- Controller Area Network (CAN) --------------------------------*/
> +typedef struct
> +{
> + __IO uint32_t mask[512]; /* ID Masks */
> +} LPC_CANAF_RAM_TypeDef;
> +
> +typedef struct /* Acceptance Filter Registers */
> +{
> + __IO uint32_t AFMR;
> + __IO uint32_t SFF_sa;
> + __IO uint32_t SFF_GRP_sa;
> + __IO uint32_t EFF_sa;
> + __IO uint32_t EFF_GRP_sa;
> + __IO uint32_t ENDofTable;
> + __I uint32_t LUTerrAd;
> + __I uint32_t LUTerr;
> + __IO uint32_t FCANIE;
> + __IO uint32_t FCANIC0;
> + __IO uint32_t FCANIC1;
> +} LPC_CANAF_TypeDef;
> +
> +typedef struct /* Central Registers */
> +{
> + __I uint32_t CANTxSR;
> + __I uint32_t CANRxSR;
> + __I uint32_t CANMSR;
> +} LPC_CANCR_TypeDef;
> +
> +typedef struct /* Controller Registers */
> +{
> + __IO uint32_t MOD;
> + __O uint32_t CMR;
> + __IO uint32_t GSR;
> + __I uint32_t ICR;
> + __IO uint32_t IER;
> + __IO uint32_t BTR;
> + __IO uint32_t EWL;
> + __I uint32_t SR;
> + __IO uint32_t RFS;
> + __IO uint32_t RID;
> + __IO uint32_t RDA;
> + __IO uint32_t RDB;
> + __IO uint32_t TFI1;
> + __IO uint32_t TID1;
> + __IO uint32_t TDA1;
> + __IO uint32_t TDB1;
> + __IO uint32_t TFI2;
> + __IO uint32_t TID2;
> + __IO uint32_t TDA2;
> + __IO uint32_t TDB2;
> + __IO uint32_t TFI3;
> + __IO uint32_t TID3;
> + __IO uint32_t TDA3;
> + __IO uint32_t TDB3;
> +} LPC_CAN_TypeDef;
> +
> +/*------------- General Purpose Direct Memory Access (GPDMA) -----------------*/
> +typedef struct /* Common Registers */
> +{
> + __I uint32_t DMACIntStat;
> + __I uint32_t DMACIntTCStat;
> + __O uint32_t DMACIntTCClear;
> + __I uint32_t DMACIntErrStat;
> + __O uint32_t DMACIntErrClr;
> + __I uint32_t DMACRawIntTCStat;
> + __I uint32_t DMACRawIntErrStat;
> + __I uint32_t DMACEnbldChns;
> + __IO uint32_t DMACSoftBReq;
> + __IO uint32_t DMACSoftSReq;
> + __IO uint32_t DMACSoftLBReq;
> + __IO uint32_t DMACSoftLSReq;
> + __IO uint32_t DMACConfig;
> + __IO uint32_t DMACSync;
> +} LPC_GPDMA_TypeDef;
> +
> +typedef struct /* Channel Registers */
> +{
> + __IO uint32_t DMACCSrcAddr;
> + __IO uint32_t DMACCDestAddr;
> + __IO uint32_t DMACCLLI;
> + __IO uint32_t DMACCControl;
> + __IO uint32_t DMACCConfig;
> +} LPC_GPDMACH_TypeDef;
> +
> +/*------------- Universal Serial Bus (USB) -----------------------------------*/
> +typedef struct
> +{
> + __I uint32_t HcRevision; /* USB Host Registers */
> + __IO uint32_t HcControl;
> + __IO uint32_t HcCommandStatus;
> + __IO uint32_t HcInterruptStatus;
> + __IO uint32_t HcInterruptEnable;
> + __IO uint32_t HcInterruptDisable;
> + __IO uint32_t HcHCCA;
> + __I uint32_t HcPeriodCurrentED;
> + __IO uint32_t HcControlHeadED;
> + __IO uint32_t HcControlCurrentED;
> + __IO uint32_t HcBulkHeadED;
> + __IO uint32_t HcBulkCurrentED;
> + __I uint32_t HcDoneHead;
> + __IO uint32_t HcFmInterval;
> + __I uint32_t HcFmRemaining;
> + __I uint32_t HcFmNumber;
> + __IO uint32_t HcPeriodicStart;
> + __IO uint32_t HcLSTreshold;
> + __IO uint32_t HcRhDescriptorA;
> + __IO uint32_t HcRhDescriptorB;
> + __IO uint32_t HcRhStatus;
> + __IO uint32_t HcRhPortStatus1;
> + __IO uint32_t HcRhPortStatus2;
> + uint32_t RESERVED0[40];
> + __I uint32_t Module_ID;
> +
> + __I uint32_t OTGIntSt; /* USB On-The-Go Registers */
> + __IO uint32_t OTGIntEn;
> + __O uint32_t OTGIntSet;
> + __O uint32_t OTGIntClr;
> + __IO uint32_t OTGStCtrl;
> + __IO uint32_t OTGTmr;
> + uint32_t RESERVED1[58];
> +
> + __I uint32_t USBDevIntSt; /* USB Device Interrupt Registers */
> + __IO uint32_t USBDevIntEn;
> + __O uint32_t USBDevIntClr;
> + __O uint32_t USBDevIntSet;
> +
> + __O uint32_t USBCmdCode; /* USB Device SIE Command Registers */
> + __I uint32_t USBCmdData;
> +
> + __I uint32_t USBRxData; /* USB Device Transfer Registers */
> + __O uint32_t USBTxData;
> + __I uint32_t USBRxPLen;
> + __O uint32_t USBTxPLen;
> + __IO uint32_t USBCtrl;
> + __O uint32_t USBDevIntPri;
> +
> + __I uint32_t USBEpIntSt; /* USB Device Endpoint Interrupt Regs */
> + __IO uint32_t USBEpIntEn;
> + __O uint32_t USBEpIntClr;
> + __O uint32_t USBEpIntSet;
> + __O uint32_t USBEpIntPri;
> +
> + __IO uint32_t USBReEp; /* USB Device Endpoint Realization Reg*/
> + __O uint32_t USBEpInd;
> + __IO uint32_t USBMaxPSize;
> +
> + __I uint32_t USBDMARSt; /* USB Device DMA Registers */
> + __O uint32_t USBDMARClr;
> + __O uint32_t USBDMARSet;
> + uint32_t RESERVED2[9];
> + __IO uint32_t USBUDCAH;
> + __I uint32_t USBEpDMASt;
> + __O uint32_t USBEpDMAEn;
> + __O uint32_t USBEpDMADis;
> + __I uint32_t USBDMAIntSt;
> + __IO uint32_t USBDMAIntEn;
> + uint32_t RESERVED3[2];
> + __I uint32_t USBEoTIntSt;
> + __O uint32_t USBEoTIntClr;
> + __O uint32_t USBEoTIntSet;
> + __I uint32_t USBNDDRIntSt;
> + __O uint32_t USBNDDRIntClr;
> + __O uint32_t USBNDDRIntSet;
> + __I uint32_t USBSysErrIntSt;
> + __O uint32_t USBSysErrIntClr;
> + __O uint32_t USBSysErrIntSet;
> + uint32_t RESERVED4[15];
> +
> + __I uint32_t I2C_RX; /* USB OTG I2C Registers */
> + __O uint32_t I2C_WO;
> + __I uint32_t I2C_STS;
> + __IO uint32_t I2C_CTL;
> + __IO uint32_t I2C_CLKHI;
> + __O uint32_t I2C_CLKLO;
> + uint32_t RESERVED5[823];
> +
> + union {
> + __IO uint32_t USBClkCtrl; /* USB Clock Control Registers */
> + __IO uint32_t OTGClkCtrl;
> + };
> + union {
> + __I uint32_t USBClkSt;
> + __I uint32_t OTGClkSt;
> + };
> +} LPC_USB_TypeDef;
> +
> +/*------------- Ethernet Media Access Controller (EMAC) ----------------------*/
> +typedef struct
> +{
> + __IO uint32_t MAC1; /* MAC Registers */
> + __IO uint32_t MAC2;
> + __IO uint32_t IPGT;
> + __IO uint32_t IPGR;
> + __IO uint32_t CLRT;
> + __IO uint32_t MAXF;
> + __IO uint32_t SUPP;
> + __IO uint32_t TEST;
> + __IO uint32_t MCFG;
> + __IO uint32_t MCMD;
> + __IO uint32_t MADR;
> + __O uint32_t MWTD;
> + __I uint32_t MRDD;
> + __I uint32_t MIND;
> + uint32_t RESERVED0[2];
> + __IO uint32_t SA0;
> + __IO uint32_t SA1;
> + __IO uint32_t SA2;
> + uint32_t RESERVED1[45];
> + __IO uint32_t Command; /* Control Registers */
> + __I uint32_t Status;
> + __IO uint32_t RxDescriptor;
> + __IO uint32_t RxStatus;
> + __IO uint32_t RxDescriptorNumber;
> + __I uint32_t RxProduceIndex;
> + __IO uint32_t RxConsumeIndex;
> + __IO uint32_t TxDescriptor;
> + __IO uint32_t TxStatus;
> + __IO uint32_t TxDescriptorNumber;
> + __IO uint32_t TxProduceIndex;
> + __I uint32_t TxConsumeIndex;
> + uint32_t RESERVED2[10];
> + __I uint32_t TSV0;
> + __I uint32_t TSV1;
> + __I uint32_t RSV;
> + uint32_t RESERVED3[3];
> + __IO uint32_t FlowControlCounter;
> + __I uint32_t FlowControlStatus;
> + uint32_t RESERVED4[34];
> + __IO uint32_t RxFilterCtrl; /* Rx Filter Registers */
> + __IO uint32_t RxFilterWoLStatus;
> + __IO uint32_t RxFilterWoLClear;
> + uint32_t RESERVED5;
> + __IO uint32_t HashFilterL;
> + __IO uint32_t HashFilterH;
> + uint32_t RESERVED6[882];
> + __I uint32_t IntStatus; /* Module Control Registers */
> + __IO uint32_t IntEnable;
> + __O uint32_t IntClear;
> + __O uint32_t IntSet;
> + uint32_t RESERVED7;
> + __IO uint32_t PowerDown;
> + uint32_t RESERVED8;
> + __IO uint32_t Module_ID;
> +} LPC_EMAC_TypeDef;
> +
> +#if defined ( __CC_ARM )
> +#pragma no_anon_unions
> +#endif
> +
> +
> +/******************************************************************************/
> +/* Peripheral memory map */
> +/******************************************************************************/
> +/* Base addresses */
> +#define LPC_FLASH_BASE (0x00000000UL)
> +#define LPC_RAM_BASE (0x10000000UL)
> +#ifdef __LPC17XX_REV00
> +#define LPC_AHBRAM0_BASE (0x20000000UL)
> +#define LPC_AHBRAM1_BASE (0x20004000UL)
> +#else
> +#define LPC_AHBRAM0_BASE (0x2007C000UL)
> +#define LPC_AHBRAM1_BASE (0x20080000UL)
> +#endif
> +#define LPC_GPIO_BASE (0x2009C000UL)
> +#define LPC_APB0_BASE (0x40000000UL)
> +#define LPC_APB1_BASE (0x40080000UL)
> +#define LPC_AHB_BASE (0x50000000UL)
> +#define LPC_CM3_BASE (0xE0000000UL)
> +
> +/* APB0 peripherals */
> +#define LPC_WDT_BASE (LPC_APB0_BASE + 0x00000)
> +#define LPC_TIM0_BASE (LPC_APB0_BASE + 0x04000)
> +#define LPC_TIM1_BASE (LPC_APB0_BASE + 0x08000)
> +#define LPC_UART0_BASE (LPC_APB0_BASE + 0x0C000)
> +#define LPC_UART1_BASE (LPC_APB0_BASE + 0x10000)
> +#define LPC_PWM1_BASE (LPC_APB0_BASE + 0x18000)
> +#define LPC_I2C0_BASE (LPC_APB0_BASE + 0x1C000)
> +#define LPC_SPI_BASE (LPC_APB0_BASE + 0x20000)
> +#define LPC_RTC_BASE (LPC_APB0_BASE + 0x24000)
> +#define LPC_GPIOINT_BASE (LPC_APB0_BASE + 0x28080)
> +#define LPC_PINCON_BASE (LPC_APB0_BASE + 0x2C000)
> +#define LPC_SSP1_BASE (LPC_APB0_BASE + 0x30000)
> +#define LPC_ADC_BASE (LPC_APB0_BASE + 0x34000)
> +#define LPC_CANAF_RAM_BASE (LPC_APB0_BASE + 0x38000)
> +#define LPC_CANAF_BASE (LPC_APB0_BASE + 0x3C000)
> +#define LPC_CANCR_BASE (LPC_APB0_BASE + 0x40000)
> +#define LPC_CAN1_BASE (LPC_APB0_BASE + 0x44000)
> +#define LPC_CAN2_BASE (LPC_APB0_BASE + 0x48000)
> +#define LPC_I2C1_BASE (LPC_APB0_BASE + 0x5C000)
> +
> +/* APB1 peripherals */
> +#define LPC_SSP0_BASE (LPC_APB1_BASE + 0x08000)
> +#define LPC_DAC_BASE (LPC_APB1_BASE + 0x0C000)
> +#define LPC_TIM2_BASE (LPC_APB1_BASE + 0x10000)
> +#define LPC_TIM3_BASE (LPC_APB1_BASE + 0x14000)
> +#define LPC_UART2_BASE (LPC_APB1_BASE + 0x18000)
> +#define LPC_UART3_BASE (LPC_APB1_BASE + 0x1C000)
> +#define LPC_I2C2_BASE (LPC_APB1_BASE + 0x20000)
> +#define LPC_I2S_BASE (LPC_APB1_BASE + 0x28000)
> +#define LPC_RIT_BASE (LPC_APB1_BASE + 0x30000)
> +#define LPC_MCPWM_BASE (LPC_APB1_BASE + 0x38000)
> +#define LPC_QEI_BASE (LPC_APB1_BASE + 0x3C000)
> +#define LPC_SC_BASE (LPC_APB1_BASE + 0x7C000)
> +
> +/* AHB peripherals */
> +#define LPC_EMAC_BASE (LPC_AHB_BASE + 0x00000)
> +#define LPC_GPDMA_BASE (LPC_AHB_BASE + 0x04000)
> +#define LPC_GPDMACH0_BASE (LPC_AHB_BASE + 0x04100)
> +#define LPC_GPDMACH1_BASE (LPC_AHB_BASE + 0x04120)
> +#define LPC_GPDMACH2_BASE (LPC_AHB_BASE + 0x04140)
> +#define LPC_GPDMACH3_BASE (LPC_AHB_BASE + 0x04160)
> +#define LPC_GPDMACH4_BASE (LPC_AHB_BASE + 0x04180)
> +#define LPC_GPDMACH5_BASE (LPC_AHB_BASE + 0x041A0)
> +#define LPC_GPDMACH6_BASE (LPC_AHB_BASE + 0x041C0)
> +#define LPC_GPDMACH7_BASE (LPC_AHB_BASE + 0x041E0)
> +#define LPC_USB_BASE (LPC_AHB_BASE + 0x0C000)
> +
> +/* GPIOs */
> +#define LPC_GPIO0_BASE (LPC_GPIO_BASE + 0x00000)
> +#define LPC_GPIO1_BASE (LPC_GPIO_BASE + 0x00020)
> +#define LPC_GPIO2_BASE (LPC_GPIO_BASE + 0x00040)
> +#define LPC_GPIO3_BASE (LPC_GPIO_BASE + 0x00060)
> +#define LPC_GPIO4_BASE (LPC_GPIO_BASE + 0x00080)
> +
> +
> +/******************************************************************************/
> +/* Peripheral declaration */
> +/******************************************************************************/
> +#define LPC_SC ((LPC_SC_TypeDef *) LPC_SC_BASE )
> +#define LPC_GPIO0 ((LPC_GPIO_TypeDef *) LPC_GPIO0_BASE )
> +#define LPC_GPIO1 ((LPC_GPIO_TypeDef *) LPC_GPIO1_BASE )
> +#define LPC_GPIO2 ((LPC_GPIO_TypeDef *) LPC_GPIO2_BASE )
> +#define LPC_GPIO3 ((LPC_GPIO_TypeDef *) LPC_GPIO3_BASE )
> +#define LPC_GPIO4 ((LPC_GPIO_TypeDef *) LPC_GPIO4_BASE )
> +#define LPC_WDT ((LPC_WDT_TypeDef *) LPC_WDT_BASE )
> +#define LPC_TIM0 ((LPC_TIM_TypeDef *) LPC_TIM0_BASE )
> +#define LPC_TIM1 ((LPC_TIM_TypeDef *) LPC_TIM1_BASE )
> +#define LPC_TIM2 ((LPC_TIM_TypeDef *) LPC_TIM2_BASE )
> +#define LPC_TIM3 ((LPC_TIM_TypeDef *) LPC_TIM3_BASE )
> +#define LPC_RIT ((LPC_RIT_TypeDef *) LPC_RIT_BASE )
> +#define LPC_UART0 ((LPC_UART_TypeDef *) LPC_UART0_BASE )
> +#define LPC_UART1 ((LPC_UART1_TypeDef *) LPC_UART1_BASE )
> +#define LPC_UART2 ((LPC_UART_TypeDef *) LPC_UART2_BASE )
> +#define LPC_UART3 ((LPC_UART_TypeDef *) LPC_UART3_BASE )
> +#define LPC_PWM1 ((LPC_PWM_TypeDef *) LPC_PWM1_BASE )
> +#define LPC_I2C0 ((LPC_I2C_TypeDef *) LPC_I2C0_BASE )
> +#define LPC_I2C1 ((LPC_I2C_TypeDef *) LPC_I2C1_BASE )
> +#define LPC_I2C2 ((LPC_I2C_TypeDef *) LPC_I2C2_BASE )
> +#define LPC_I2S ((LPC_I2S_TypeDef *) LPC_I2S_BASE )
> +#define LPC_SPI ((LPC_SPI_TypeDef *) LPC_SPI_BASE )
> +#define LPC_RTC ((LPC_RTC_TypeDef *) LPC_RTC_BASE )
> +#define LPC_GPIOINT ((LPC_GPIOINT_TypeDef *) LPC_GPIOINT_BASE )
> +#define LPC_PINCON ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE )
> +#define LPC_SSP0 ((LPC_SSP_TypeDef *) LPC_SSP0_BASE )
> +#define LPC_SSP1 ((LPC_SSP_TypeDef *) LPC_SSP1_BASE )
> +#define LPC_ADC ((LPC_ADC_TypeDef *) LPC_ADC_BASE )
> +#define LPC_DAC ((LPC_DAC_TypeDef *) LPC_DAC_BASE )
> +#define LPC_CANAF_RAM ((LPC_CANAF_RAM_TypeDef *) LPC_CANAF_RAM_BASE)
> +#define LPC_CANAF ((LPC_CANAF_TypeDef *) LPC_CANAF_BASE )
> +#define LPC_CANCR ((LPC_CANCR_TypeDef *) LPC_CANCR_BASE )
> +#define LPC_CAN1 ((LPC_CAN_TypeDef *) LPC_CAN1_BASE )
> +#define LPC_CAN2 ((LPC_CAN_TypeDef *) LPC_CAN2_BASE )
> +#define LPC_MCPWM ((LPC_MCPWM_TypeDef *) LPC_MCPWM_BASE )
> +#define LPC_QEI ((LPC_QEI_TypeDef *) LPC_QEI_BASE )
> +#define LPC_EMAC ((LPC_EMAC_TypeDef *) LPC_EMAC_BASE )
> +#define LPC_GPDMA ((LPC_GPDMA_TypeDef *) LPC_GPDMA_BASE )
> +#define DMAREQSEL (*(__IO uint32_t *) ( 0x4000C1C4))
> +#define MEMMAP (*(__IO uint32_t *) ( 0x400FC040))
> +#define LPC_GPDMACH0 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH0_BASE )
> +#define LPC_GPDMACH1 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH1_BASE )
> +#define LPC_GPDMACH2 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH2_BASE )
> +#define LPC_GPDMACH3 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH3_BASE )
> +#define LPC_GPDMACH4 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH4_BASE )
> +#define LPC_GPDMACH5 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH5_BASE )
> +#define LPC_GPDMACH6 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH6_BASE )
> +#define LPC_GPDMACH7 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH7_BASE )
> +#define LPC_USB ((LPC_USB_TypeDef *) LPC_USB_BASE )
> +
> +#endif // __LPC17xx_H__
> diff --git a/arch/arm/mach-lpc17cmsis/defines/Makefile b/arch/arm/mach-lpc17cmsis/defines/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/defines/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/defines/Makefile.omk b/arch/arm/mach-lpc17cmsis/defines/Makefile.omk
> new file mode 100644
> index 0000000..56ef973
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/defines/Makefile.omk
> @@ -0,0 +1,4 @@
> +# -*- makefile -*-
> +
> +include_HEADERS = core_cm3.h LPC17xx.h lpc_types.h lpc17xx.h
> +
> diff --git a/arch/arm/mach-lpc17cmsis/defines/core_cm3.h b/arch/arm/mach-lpc17cmsis/defines/core_cm3.h
> new file mode 100644
> index 0000000..b294e3d
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/defines/core_cm3.h
> @@ -0,0 +1,978 @@
> +/****************************************************************************//**
> + * @file : core_cm3.h
> + * @brief : CMSIS Cortex-M3 Core Peripheral Access Layer Header File
> + * @version : V1.20 simplified for GCC only
> + * @date : 31. March 2010
> + *----------------------------------------------------------------------------
> + *
> + * Copyright (C) 2009 ARM Limited. All rights reserved.
> + *
> + * ARM Limited (ARM) is supplying this software for use with Cortex-Mx
> + * processor based microcontrollers. This file can be freely distributed
> + * within development tools that are supporting such ARM based processors.
> + *
> + * 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.
> + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
> + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
> + *
> + ******************************************************************************/
> +
> +#ifndef __CM3_CORE_H__
> +#define __CM3_CORE_H__
> +
> +#ifdef __cplusplus
> + extern "C" {
> +#endif
> +
> +#define __CM3_CMSIS_VERSION_MAIN (0x01) /*!< [31:16] CMSIS HAL main version */
> +#define __CM3_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */
> +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */
> +
> +#define __CORTEX_M (0x03) /*!< Cortex core */
> +
> +/**
> + * Lint configuration \n
> + * ----------------------- \n
> + *
> + * The following Lint messages will be suppressed and not shown: \n
> + * \n
> + * --- Error 10: --- \n
> + * register uint32_t __regBasePri __asm("basepri"); \n
> + * Error 10: Expecting ';' \n
> + * \n
> + * --- Error 530: --- \n
> + * return(__regBasePri); \n
> + * Warning 530: Symbol '__regBasePri' (line 264) not initialized \n
> + * \n
> + * --- Error 550: --- \n
> + * __regBasePri = (basePri & 0x1ff); \n
> + * } \n
> + * Warning 550: Symbol '__regBasePri' (line 271) not accessed \n
> + * \n
> + * --- Error 754: --- \n
> + * uint32_t RESERVED0[24]; \n
> + * Info 754: local structure member '<some, not used in the HAL>' (line 109, file ./cm3_core.h) not referenced \n
> + * \n
> + * --- Error 750: --- \n
> + * #define __CM3_CORE_H__ \n
> + * Info 750: local macro '__CM3_CORE_H__' (line 43, file./cm3_core.h) not referenced \n
> + * \n
> + * --- Error 528: --- \n
> + * static __INLINE void NVIC_DisableIRQ(uint32_t IRQn) \n
> + * Warning 528: Symbol 'NVIC_DisableIRQ(unsigned int)' (line 419, file ./cm3_core.h) not referenced \n
> + * \n
> + * --- Error 751: --- \n
> + * } InterruptType_Type; \n
> + * Info 751: local typedef 'InterruptType_Type' (line 170, file ./cm3_core.h) not referenced \n
> + * \n
> + * \n
> + * Note: To re-enable a Message, insert a space before 'lint' * \n
> + *
> + */
> +
> +/*lint -save */
> +/*lint -e10 */
> +/*lint -e530 */
> +/*lint -e550 */
> +/*lint -e754 */
> +/*lint -e750 */
> +/*lint -e528 */
> +/*lint -e751 */
> +
> +
> +#include <stdint.h> /* Include standard types */
> +
> +#ifndef __NVIC_PRIO_BITS
> + #define __NVIC_PRIO_BITS 4 /*!< standard definition for NVIC Priority Bits */
> +#endif
> +
> +
> +
> +
> +/**
> + * IO definitions
> + *
> + * define access restrictions to peripheral registers
> + */
> +
> +#ifdef __cplusplus
> +#define __I volatile /*!< defines 'read only' permissions */
> +#else
> +#define __I volatile const /*!< defines 'read only' permissions */
> +#endif
> +#define __O volatile /*!< defines 'write only' permissions */
> +#define __IO volatile /*!< defines 'read / write' permissions */
> +
> +
> +
> +/*******************************************************************************
> + * Register Abstraction
> + ******************************************************************************/
> +
> +
> +/* System Reset */
> +#define NVIC_VECTRESET 0 /*!< Vector Reset Bit */
> +#define NVIC_SYSRESETREQ 2 /*!< System Reset Request */
> +#define NVIC_AIRCR_VECTKEY (0x5FA << 16) /*!< AIRCR Key for write access */
> +#define NVIC_AIRCR_ENDIANESS 15 /*!< Endianess */
> +
> +/* Core Debug */
> +#define CoreDebug_DEMCR_TRCENA (1 << 24) /*!< DEMCR TRCENA enable */
> +#define ITM_TCR_ITMENA 1 /*!< ITM enable */
> +
> +
> +
> +
> +/* memory mapping struct for Nested Vectored Interrupt Controller (NVIC) */
> +typedef struct
> +{
> + __IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register */
> + uint32_t RESERVED0[24];
> + __IO uint32_t ICER[8]; /*!< Interrupt Clear Enable Register */
> + uint32_t RSERVED1[24];
> + __IO uint32_t ISPR[8]; /*!< Interrupt Set Pending Register */
> + uint32_t RESERVED2[24];
> + __IO uint32_t ICPR[8]; /*!< Interrupt Clear Pending Register */
> + uint32_t RESERVED3[24];
> + __IO uint32_t IABR[8]; /*!< Interrupt Active bit Register */
> + uint32_t RESERVED4[56];
> + __IO uint8_t IP[240]; /*!< Interrupt Priority Register, 8Bit wide */
> + uint32_t RESERVED5[644];
> + __O uint32_t STIR; /*!< Software Trigger Interrupt Register */
> +} NVIC_Type;
> +
> +
> +/* memory mapping struct for System Control Block */
> +typedef struct
> +{
> + __I uint32_t CPUID; /*!< CPU ID Base Register */
> + __IO uint32_t ICSR; /*!< Interrupt Control State Register */
> + __IO uint32_t VTOR; /*!< Vector Table Offset Register */
> + __IO uint32_t AIRCR; /*!< Application Interrupt / Reset Control Register */
> + __IO uint32_t SCR; /*!< System Control Register */
> + __IO uint32_t CCR; /*!< Configuration Control Register */
> + __IO uint8_t SHP[12]; /*!< System Handlers Priority Registers (4-7, 8-11, 12-15) */
> + __IO uint32_t SHCSR; /*!< System Handler Control and State Register */
> + __IO uint32_t CFSR; /*!< Configurable Fault Status Register */
> + __IO uint32_t HFSR; /*!< Hard Fault Status Register */
> + __IO uint32_t DFSR; /*!< Debug Fault Status Register */
> + __IO uint32_t MMFAR; /*!< Mem Manage Address Register */
> + __IO uint32_t BFAR; /*!< Bus Fault Address Register */
> + __IO uint32_t AFSR; /*!< Auxiliary Fault Status Register */
> + __I uint32_t PFR[2]; /*!< Processor Feature Register */
> + __I uint32_t DFR; /*!< Debug Feature Register */
> + __I uint32_t ADR; /*!< Auxiliary Feature Register */
> + __I uint32_t MMFR[4]; /*!< Memory Model Feature Register */
> + __I uint32_t ISAR[5]; /*!< ISA Feature Register */
> +} SCB_Type;
> +
> +
> +/* memory mapping struct for SysTick */
> +typedef struct
> +{
> + __IO uint32_t CTRL; /*!< SysTick Control and Status Register */
> + __IO uint32_t LOAD; /*!< SysTick Reload Value Register */
> + __IO uint32_t VAL; /*!< SysTick Current Value Register */
> + __I uint32_t CALIB; /*!< SysTick Calibration Register */
> +} SysTick_Type;
> +
> +
> +/* memory mapping structur for ITM */
> +typedef struct
> +{
> + __O union
> + {
> + __O uint8_t u8; /*!< ITM Stimulus Port 8-bit */
> + __O uint16_t u16; /*!< ITM Stimulus Port 16-bit */
> + __O uint32_t u32; /*!< ITM Stimulus Port 32-bit */
> + } PORT [32]; /*!< ITM Stimulus Port Registers */
> + uint32_t RESERVED0[864];
> + __IO uint32_t TER; /*!< ITM Trace Enable Register */
> + uint32_t RESERVED1[15];
> + __IO uint32_t TPR; /*!< ITM Trace Privilege Register */
> + uint32_t RESERVED2[15];
> + __IO uint32_t TCR; /*!< ITM Trace Control Register */
> + uint32_t RESERVED3[29];
> + __IO uint32_t IWR; /*!< ITM Integration Write Register */
> + __IO uint32_t IRR; /*!< ITM Integration Read Register */
> + __IO uint32_t IMCR; /*!< ITM Integration Mode Control Register */
> + uint32_t RESERVED4[43];
> + __IO uint32_t LAR; /*!< ITM Lock Access Register */
> + __IO uint32_t LSR; /*!< ITM Lock Status Register */
> + uint32_t RESERVED5[6];
> + __I uint32_t PID4; /*!< ITM Product ID Registers */
> + __I uint32_t PID5;
> + __I uint32_t PID6;
> + __I uint32_t PID7;
> + __I uint32_t PID0;
> + __I uint32_t PID1;
> + __I uint32_t PID2;
> + __I uint32_t PID3;
> + __I uint32_t CID0;
> + __I uint32_t CID1;
> + __I uint32_t CID2;
> + __I uint32_t CID3;
> +} ITM_Type;
> +
> +
> +/* memory mapped struct for Interrupt Type */
> +typedef struct
> +{
> + uint32_t RESERVED0;
> + __I uint32_t ICTR; /*!< Interrupt Control Type Register */
> +#if ((defined __CM3_REV) && (__CM3_REV >= 0x200))
> + __IO uint32_t ACTLR; /*!< Auxiliary Control Register */
> +#else
> + uint32_t RESERVED1;
> +#endif
> +} InterruptType_Type;
> +
> +
> +/* Memory Protection Unit */
> +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1)
> +typedef struct
> +{
> + __I uint32_t TYPE; /*!< MPU Type Register */
> + __IO uint32_t CTRL; /*!< MPU Control Register */
> + __IO uint32_t RNR; /*!< MPU Region RNRber Register */
> + __IO uint32_t RBAR; /*!< MPU Region Base Address Register */
> + __IO uint32_t RASR; /*!< MPU Region Attribute and Size Register */
> + __IO uint32_t RBAR_A1; /*!< MPU Alias 1 Region Base Address Register */
> + __IO uint32_t RASR_A1; /*!< MPU Alias 1 Region Attribute and Size Register */
> + __IO uint32_t RBAR_A2; /*!< MPU Alias 2 Region Base Address Register */
> + __IO uint32_t RASR_A2; /*!< MPU Alias 2 Region Attribute and Size Register */
> + __IO uint32_t RBAR_A3; /*!< MPU Alias 3 Region Base Address Register */
> + __IO uint32_t RASR_A3; /*!< MPU Alias 3 Region Attribute and Size Register */
> +} MPU_Type;
> +#endif
> +
> +
> +/* Core Debug Register */
> +typedef struct
> +{
> + __IO uint32_t DHCSR; /*!< Debug Halting Control and Status Register */
> + __O uint32_t DCRSR; /*!< Debug Core Register Selector Register */
> + __IO uint32_t DCRDR; /*!< Debug Core Register Data Register */
> + __IO uint32_t DEMCR; /*!< Debug Exception and Monitor Control Register */
> +} CoreDebug_Type;
> +
> +
> +/* Memory mapping of Cortex-M3 Hardware */
> +#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */
> +#define ITM_BASE (0xE0000000) /*!< ITM Base Address */
> +#define CoreDebug_BASE (0xE000EDF0) /*!< Core Debug Base Address */
> +#define SysTick_BASE (SCS_BASE + 0x0010) /*!< SysTick Base Address */
> +#define NVIC_BASE (SCS_BASE + 0x0100) /*!< NVIC Base Address */
> +#define SCB_BASE (SCS_BASE + 0x0D00) /*!< System Control Block Base Address */
> +
> +#define InterruptType ((InterruptType_Type *) SCS_BASE) /*!< Interrupt Type Register */
> +#define SCB ((SCB_Type *) SCB_BASE) /*!< SCB configuration struct */
> +#define SysTick ((SysTick_Type *) SysTick_BASE) /*!< SysTick configuration struct */
> +#define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC configuration struct */
> +#define ITM ((ITM_Type *) ITM_BASE) /*!< ITM configuration struct */
> +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */
> +
> +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1)
> + #define MPU_BASE (SCS_BASE + 0x0D90) /*!< Memory Protection Unit */
> + #define MPU ((MPU_Type*) MPU_BASE) /*!< Memory Protection Unit */
> +#endif
> +
> +
> +
> +/*******************************************************************************
> + * Hardware Abstraction Layer
> + ******************************************************************************/
> +
> +
> + #define __ASM __asm /*!< asm keyword for GNU Compiler */
> + #define __INLINE inline /*!< inline keyword for GNU Compiler */
> +
> +/* ################### Compiler specific Intrinsics ########################### */
> +
> +/* GNU gcc specific functions */
> +
> +static __INLINE void __enable_irq() { __ASM volatile ("cpsie i"); }
> +static __INLINE void __disable_irq() { __ASM volatile ("cpsid i"); }
> +
> +static __INLINE void __enable_fault_irq() { __ASM volatile ("cpsie f"); }
> +static __INLINE void __disable_fault_irq() { __ASM volatile ("cpsid f"); }
> +
> +static __INLINE void __NOP() { __ASM volatile ("nop"); }
> +static __INLINE void __WFI() { __ASM volatile ("wfi"); }
> +static __INLINE void __WFE() { __ASM volatile ("wfe"); }
> +static __INLINE void __SEV() { __ASM volatile ("sev"); }
> +static __INLINE void __ISB() { __ASM volatile ("isb"); }
> +static __INLINE void __DSB() { __ASM volatile ("dsb"); }
> +static __INLINE void __DMB() { __ASM volatile ("dmb"); }
> +static __INLINE void __CLREX() { __ASM volatile ("clrex"); }
> +
> +
> +/**
> + * @brief Return the Process Stack Pointer
> + *
> + * @param none
> + * @return uint32_t ProcessStackPointer
> + *
> + * Return the actual process stack pointer
> + */
> +static __INLINE uint32_t __get_PSP(void)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("MRS %0, psp" : "=r" (result) );
> + return(result);
> +}
> +
> +/**
> + * @brief Set the Process Stack Pointer
> + *
> + * @param uint32_t Process Stack Pointer
> + * @return none
> + *
> + * Assign the value ProcessStackPointer to the MSP
> + * (process stack pointer) Cortex processor register
> + */
> +static __INLINE void __set_PSP(uint32_t topOfProcStack)
> +{
> + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) );
> +}
> +
> +/**
> + * @brief Return the Main Stack Pointer
> + *
> + * @param none
> + * @return uint32_t Main Stack Pointer
> + *
> + * Return the current value of the MSP (main stack pointer)
> + * Cortex processor register
> + */
> +static __INLINE uint32_t __get_MSP(void)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("MRS %0, msp" : "=r" (result) );
> + return(result);
> +}
> +
> +/**
> + * @brief Set the Main Stack Pointer
> + *
> + * @param uint32_t Main Stack Pointer
> + * @return none
> + *
> + * Assign the value mainStackPointer to the MSP
> + * (main stack pointer) Cortex processor register
> + */
> +static __INLINE void __set_MSP(uint32_t topOfMainStack)
> +{
> + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) );
> +}
> +
> +/**
> + * @brief Return the Base Priority value
> + *
> + * @param none
> + * @return uint32_t BasePriority
> + *
> + * Return the content of the base priority register
> + */
> +static __INLINE uint32_t __get_BASEPRI(void)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
> + return(result);
> +}
> +
> +
> +/**
> + * @brief Set the Base Priority value
> + *
> + * @param uint32_t BasePriority
> + * @return none
> + *
> + * Set the base priority register
> + */
> +static __INLINE void __set_BASEPRI(uint32_t value)
> +{
> + __ASM volatile ("MSR basepri, %0" : : "r" (value) );
> +}
> +
> +/**
> + * @brief Return the Priority Mask value
> + *
> + * @param none
> + * @return uint32_t PriMask
> + *
> + * Return the state of the priority mask bit from the priority mask
> + * register
> + */
> +static __INLINE uint32_t __get_PRIMASK(void)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("MRS %0, primask" : "=r" (result) );
> + return(result);
> +}
> +
> +
> +/**
> + * @brief Set the Priority Mask value
> + *
> + * @param uint32_t PriMask
> + * @return none
> + *
> + * Set the priority mask bit in the priority mask register
> + */
> +static __INLINE void __set_PRIMASK(uint32_t priMask)
> +{
> + __ASM volatile ("MSR primask, %0" : : "r" (priMask) );
> +}
> +
> +
> +/**
> + * @brief Return the Fault Mask value
> + *
> + * @param none
> + * @return uint32_t FaultMask
> + *
> + * Return the content of the fault mask register
> + */
> +static __INLINE uint32_t __get_FAULTMASK(void)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
> + return(result);
> +}
> +
> +
> +/**
> + * @brief Set the Fault Mask value
> + *
> + * @param uint32_t faultMask value
> + * @return none
> + *
> + * Set the fault mask register
> + */
> +static __INLINE void __set_FAULTMASK(uint32_t faultMask)
> +{
> + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
> +}
> +
> +/**
> + * @brief Return the Control Register value
> +*
> +* @param none
> +* @return uint32_t Control value
> + *
> + * Return the content of the control register
> + */
> +static __INLINE uint32_t __get_CONTROL(void)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("MRS %0, control" : "=r" (result) );
> + return(result);
> +}
> +
> +/**
> + * @brief Set the Control Register value
> + *
> + * @param uint32_t Control value
> + * @return none
> + *
> + * Set the control register
> + */
> +static __INLINE void __set_CONTROL(uint32_t control)
> +{
> + __ASM volatile ("MSR control, %0" : : "r" (control) );
> +}
> +
> +/**
> + * @brief Reverse byte order in integer value
> + *
> + * @param uint32_t value to reverse
> + * @return uint32_t reversed value
> + *
> + * Reverse byte order in integer value
> + */
> +static __INLINE uint32_t __REV(uint32_t value)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
> + return(result);
> +}
> +
> +/**
> + * @brief Reverse byte order in unsigned short value
> + *
> + * @param uint16_t value to reverse
> + * @return uint32_t reversed value
> + *
> + * Reverse byte order in unsigned short value
> + */
> +static __INLINE uint32_t __REV16(uint16_t value)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
> + return(result);
> +}
> +
> +/**
> + * Reverse byte order in signed short value with sign extension to integer
> + *
> + * @param int16_t value to reverse
> + * @return int32_t reversed value
> + *
> + * @brief Reverse byte order in signed short value with sign extension to integer
> + */
> +static __INLINE int32_t __REVSH(int16_t value)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
> + return(result);
> +}
> +
> +/**
> + * @brief Reverse bit order of value
> + *
> + * @param uint32_t value to reverse
> + * @return uint32_t reversed value
> + *
> + * Reverse bit order of value
> + */
> +static __INLINE uint32_t __RBIT(uint32_t value)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
> + return(result);
> +}
> +
> +/**
> + * @brief LDR Exclusive
> + *
> + * @param uint8_t* address
> + * @return uint8_t value of (*address)
> + *
> + * Exclusive LDR command
> + */
> +static __INLINE uint8_t __LDREXB(uint8_t *addr)
> +{
> + uint8_t result=0;
> +
> + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
> + return(result);
> +}
> +
> +/**
> + * @brief LDR Exclusive
> + *
> + * @param uint16_t* address
> + * @return uint16_t value of (*address)
> + *
> + * Exclusive LDR command
> + */
> +static __INLINE uint16_t __LDREXH(uint16_t *addr)
> +{
> + uint16_t result=0;
> +
> + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
> + return(result);
> +}
> +
> +/**
> + * @brief LDR Exclusive
> + *
> + * @param uint32_t* address
> + * @return uint32_t value of (*address)
> + *
> + * Exclusive LDR command
> + */
> +static __INLINE uint32_t __LDREXW(uint32_t *addr)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
> + return(result);
> +}
> +
> +/**
> + * @brief STR Exclusive
> + *
> + * @param uint8_t *address
> + * @param uint8_t value to store
> + * @return uint32_t successful / failed
> + *
> + * Exclusive STR command
> + */
> +static __INLINE uint32_t __STREXB(uint8_t value, uint8_t *addr)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
> + return(result);
> +}
> +
> +/**
> + * @brief STR Exclusive
> + *
> + * @param uint16_t *address
> + * @param uint16_t value to store
> + * @return uint32_t successful / failed
> + *
> + * Exclusive STR command
> + */
> +static __INLINE uint32_t __STREXH(uint16_t value, uint16_t *addr)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
> + return(result);
> +}
> +
> +/**
> + * @brief STR Exclusive
> + *
> + * @param uint32_t *address
> + * @param uint32_t value to store
> + * @return uint32_t successful / failed
> + *
> + * Exclusive STR command
> + */
> +static __INLINE uint32_t __STREXW(uint32_t value, uint32_t *addr)
> +{
> + uint32_t result=0;
> +
> + __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
> + return(result);
> +}
> +
> +
> +/* ########################## NVIC functions #################################### */
> +
> +
> +/**
> + * @brief Set the Priority Grouping in NVIC Interrupt Controller
> + *
> + * @param uint32_t priority_grouping is priority grouping field
> + * @return none
> + *
> + * Set the priority grouping field using the required unlock sequence.
> + * The parameter priority_grouping is assigned to the field
> + * SCB->AIRCR [10:8] PRIGROUP field. Only values from 0..7 are used.
> + * In case of a conflict between priority grouping and available
> + * priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.
> + */
> +static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
> +{
> + uint32_t reg_value;
> + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */
> +
> + reg_value = SCB->AIRCR; /* read old register configuration */
> + reg_value &= ~((0xFFFFU << 16) | (0x0F << 8)); /* clear bits to change */
> + reg_value = ((reg_value | NVIC_AIRCR_VECTKEY | (PriorityGroupTmp << 8))); /* Insert write key and priorty group */
> + SCB->AIRCR = reg_value;
> +}
> +
> +/**
> + * @brief Get the Priority Grouping from NVIC Interrupt Controller
> + *
> + * @param none
> + * @return uint32_t priority grouping field
> + *
> + * Get the priority grouping from NVIC Interrupt Controller.
> + * priority grouping is SCB->AIRCR [10:8] PRIGROUP field.
> + */
> +static __INLINE uint32_t NVIC_GetPriorityGrouping(void)
> +{
> + return ((SCB->AIRCR >> 8) & 0x07); /* read priority grouping field */
> +}
> +
> +/**
> + * @brief Enable Interrupt in NVIC Interrupt Controller
> + *
> + * @param IRQn_Type IRQn specifies the interrupt number
> + * @return none
> + *
> + * Enable a device specific interupt in the NVIC interrupt controller.
> + * The interrupt number cannot be a negative value.
> + */
> +static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
> +{
> + NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
> +}
> +
> +/**
> + * @brief Disable the interrupt line for external interrupt specified
> + *
> + * @param IRQn_Type IRQn is the positive number of the external interrupt
> + * @return none
> + *
> + * Disable a device specific interupt in the NVIC interrupt controller.
> + * The interrupt number cannot be a negative value.
> + */
> +static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
> +{
> + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */
> +}
> +
> +/**
> + * @brief Read the interrupt pending bit for a device specific interrupt source
> + *
> + * @param IRQn_Type IRQn is the number of the device specifc interrupt
> + * @return uint32_t 1 if pending interrupt else 0
> + *
> + * Read the pending register in NVIC and return 1 if its status is pending,
> + * otherwise it returns 0
> + */
> +static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
> +{
> + return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */
> +}
> +
> +/**
> + * @brief Set the pending bit for an external interrupt
> + *
> + * @param IRQn_Type IRQn is the Number of the interrupt
> + * @return none
> + *
> + * Set the pending bit for the specified interrupt.
> + * The interrupt number cannot be a negative value.
> + */
> +static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
> +{
> + NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */
> +}
> +
> +/**
> + * @brief Clear the pending bit for an external interrupt
> + *
> + * @param IRQn_Type IRQn is the Number of the interrupt
> + * @return none
> + *
> + * Clear the pending bit for the specified interrupt.
> + * The interrupt number cannot be a negative value.
> + */
> +static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
> +{
> + NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */
> +}
> +
> +/**
> + * @brief Read the active bit for an external interrupt
> + *
> + * @param IRQn_Type IRQn is the Number of the interrupt
> + * @return uint32_t 1 if active else 0
> + *
> + * Read the active register in NVIC and returns 1 if its status is active,
> + * otherwise it returns 0.
> + */
> +static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)
> +{
> + return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */
> +}
> +
> +/**
> + * @brief Set the priority for an interrupt
> + *
> + * @param IRQn_Type IRQn is the Number of the interrupt
> + * @param priority is the priority for the interrupt
> + * @return none
> + *
> + * Set the priority for the specified interrupt. The interrupt
> + * number can be positive to specify an external (device specific)
> + * interrupt, or negative to specify an internal (core) interrupt. \n
> + *
> + * Note: The priority cannot be set for every core interrupt.
> + */
> +static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
> +{
> + if(IRQn < 0) {
> + SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
> + else {
> + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
> +}
> +
> +/**
> + * @brief Read the priority for an interrupt
> + *
> + * @param IRQn_Type IRQn is the Number of the interrupt
> + * @return uint32_t priority is the priority for the interrupt
> + *
> + * Read the priority for the specified interrupt. The interrupt
> + * number can be positive to specify an external (device specific)
> + * interrupt, or negative to specify an internal (core) interrupt.
> + *
> + * The returned priority value is automatically aligned to the implemented
> + * priority bits of the microcontroller.
> + *
> + * Note: The priority cannot be set for every core interrupt.
> + */
> +static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
> +{
> +
> + if(IRQn < 0) {
> + return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M3 system interrupts */
> + else {
> + return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */
> +}
> +
> +
> +/**
> + * @brief Encode the priority for an interrupt
> + *
> + * @param uint32_t PriorityGroup is the used priority group
> + * @param uint32_t PreemptPriority is the preemptive priority value (starting from 0)
> + * @param uint32_t SubPriority is the sub priority value (starting from 0)
> + * @return uint32_t the priority for the interrupt
> + *
> + * Encode the priority for an interrupt with the given priority group,
> + * preemptive priority value and sub priority value.
> + * In case of a conflict between priority grouping and available
> + * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set.
> + *
> + * The returned priority value can be used for NVIC_SetPriority(...) function
> + */
> +static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
> +{
> + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */
> + uint32_t PreemptPriorityBits;
> + uint32_t SubPriorityBits;
> +
> + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
> + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
> +
> + return (
> + ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) |
> + ((SubPriority & ((1 << (SubPriorityBits )) - 1)))
> + );
> +}
> +
> +
> +/**
> + * @brief Decode the priority of an interrupt
> + *
> + * @param uint32_t Priority the priority for the interrupt
> + * @param uint32_t PrioGroup is the used priority group
> + * @param uint32_t* pPreemptPrio is the preemptive priority value (starting from 0)
> + * @param uint32_t* pSubPrio is the sub priority value (starting from 0)
> + * @return none
> + *
> + * Decode an interrupt priority value with the given priority group to
> + * preemptive priority value and sub priority value.
> + * In case of a conflict between priority grouping and available
> + * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set.
> + *
> + * The priority value can be retrieved with NVIC_GetPriority(...) function
> + */
> +static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority)
> +{
> + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */
> + uint32_t PreemptPriorityBits;
> + uint32_t SubPriorityBits;
> +
> + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;
> + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;
> +
> + *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1);
> + *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1);
> +}
> +
> +
> +
> +/* ################################## SysTick function ############################################ */
> +
> +#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0)
> +
> +/* SysTick constants */
> +#define SYSTICK_ENABLE 0 /* Config-Bit to start or stop the SysTick Timer */
> +#define SYSTICK_TICKINT 1 /* Config-Bit to enable or disable the SysTick interrupt */
> +#define SYSTICK_CLKSOURCE 2 /* Clocksource has the offset 2 in SysTick Control and Status Register */
> +#define SYSTICK_MAXCOUNT ((1<<24) -1) /* SysTick MaxCount */
> +
> +/**
> + * @brief Initialize and start the SysTick counter and its interrupt.
> + *
> + * @param uint32_t ticks is the number of ticks between two interrupts
> + * @return none
> + *
> + * Initialise the system tick timer and its interrupt and start the
> + * system tick timer / counter in free running mode to generate
> + * periodical interrupts.
> + */
> +static __INLINE uint32_t SysTick_Config(uint32_t ticks)
> +{
> + if (ticks > SYSTICK_MAXCOUNT) return (1); /* Reload value impossible */
> +
> + SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1; /* set reload register */
> + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
> + SysTick->VAL = (0x00); /* Load the SysTick Counter Value */
> + SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT); /* Enable SysTick IRQ and SysTick Timer */
> + return (0); /* Function successful */
> +}
> +
> +#endif
> +
> +
> +
> +
> +
> +/* ################################## Reset function ############################################ */
> +
> +/**
> + * @brief Initiate a system reset request.
> + *
> + * @param none
> + * @return none
> + *
> + * Initialize a system reset request to reset the MCU
> + */
> +static __INLINE void NVIC_SystemReset(void)
> +{
> + SCB->AIRCR = (NVIC_AIRCR_VECTKEY | (SCB->AIRCR & (0x700)) | (1<<NVIC_SYSRESETREQ)); /* Keep priority group unchanged */
> + __DSB(); /* Ensure completion of memory access */
> + while(1); /* wait until reset */
> +}
> +
> +
> +/* ################################## Debug Output function ############################################ */
> +
> +
> +/**
> + * @brief Outputs a character via the ITM channel 0
> + *
> + * @param uint32_t character to output
> + * @return uint32_t input character
> + *
> + * The function outputs a character via the ITM channel 0.
> + * The function returns when no debugger is connected that has booked the output.
> + * It is blocking when a debugger is connected, but the previous character send is not transmitted.
> + */
> +static __INLINE uint32_t ITM_SendChar (uint32_t ch)
> +{
> + if (ch == '\n') ITM_SendChar('\r');
> +
> + if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA) &&
> + (ITM->TCR & ITM_TCR_ITMENA) &&
> + (ITM->TER & (1UL << 0)) )
> + {
> + while (ITM->PORT[0].u32 == 0);
> + ITM->PORT[0].u8 = (uint8_t) ch;
> + }
> + return (ch);
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* __CM3_CORE_H__ */
> +
> +/*lint -restore */
> diff --git a/arch/arm/mach-lpc17cmsis/defines/lpc17xx.h b/arch/arm/mach-lpc17cmsis/defines/lpc17xx.h
> new file mode 120000
> index 0000000..6c93089
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/defines/lpc17xx.h
> @@ -0,0 +1 @@
> +LPC17xx.h
> \ No newline at end of file
> diff --git a/arch/arm/mach-lpc17cmsis/defines/lpc_types.h b/arch/arm/mach-lpc17cmsis/defines/lpc_types.h
> new file mode 100644
> index 0000000..89659f3
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/defines/lpc_types.h
> @@ -0,0 +1,197 @@
> +/***********************************************************************//**.
> + * @file : lpc_types.h.
> + * @brief :.
> + * Contains the NXP ABL typedefs for C standard types..
> + * It is intended to be used in ISO C conforming development.
> + * environments and checks for this insofar as it is possible.
> + * to do so..
> + * @version : 1.0.
> + * @date : 27 Jul. 2008.
> + * @author : wellsk.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Type group ----------------------------------------------------------- */.
> +/** @defgroup LPC_Types.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC_TYPES_H.
> +#define LPC_TYPES_H.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include <stdint.h>.
> +.
> +.
> +/* Public Types --------------------------------------------------------------- */.
> +/** @defgroup LPC_Types_Public_Types.
> + * @{.
> + */.
> +.
> +/**.
> + * @brief Boolean Type definition.
> + */.
> +typedef enum {FALSE = 0, TRUE = !FALSE} Bool;.
> +.
> +/**.
> + * @brief Flag Status and Interrupt Flag Status type definition.
> + */.
> +typedef enum {RESET = 0, SET = !RESET} FlagStatus, IntStatus, SetState;.
> +#define PARAM_SETSTATE(State) ((State==RESET) || (State==SET)).
> +.
> +/**.
> + * @brief Functional State Definition.
> + */.
> +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;.
> +#define PARAM_FUNCTIONALSTATE(State) ((State==DISABLE) || (State==ENABLE)).
> +.
> +/**.
> + * @ Status type definition.
> + */.
> +typedef enum {ERROR = 0, SUCCESS = !ERROR} Status;.
> +.
> +.
> +/**.
> + * Read/Write transfer type mode (Block or non-block).
> + */.
> +typedef enum.
> +{.
> + NONE_BLOCKING = 0, /**< None Blocking type */.
> + BLOCKING, /**< Blocking type */.
> +} TRANSFER_BLOCK_Type;.
> +.
> +.
> +/** Pointer to Function returning Void (any number of parameters) */.
> +typedef void (*PFV)();.
> +.
> +/** Pointer to Function returning int32_t (any number of parameters) */.
> +typedef int32_t(*PFI)();.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Macros -------------------------------------------------------------- */.
> +/** @defgroup LPC_Types_Public_Macros.
> + * @{.
> + */.
> +.
> +/* _BIT(n) sets the bit at position "n".
> + * _BIT(n) is intended to be used in "OR" and "AND" expressions:.
> + * e.g., "(_BIT(3) | _BIT(7))"..
> + */.
> +#undef _BIT.
> +/* Set bit macro */.
> +#define _BIT(n) (1<<n).
> +.
> +/* _SBF(f,v) sets the bit field starting at position "f" to value "v"..
> + * _SBF(f,v) is intended to be used in "OR" and "AND" expressions:.
> + * e.g., "((_SBF(5,7) | _SBF(12,0xF)) & 0xFFFF)".
> + */.
> +#undef _SBF.
> +/* Set bit field macro */.
> +#define _SBF(f,v) (v<<f).
> +.
> +/* _BITMASK constructs a symbol with 'field_width' least significant.
> + * bits set..
> + * e.g., _BITMASK(5) constructs '0x1F', _BITMASK(16) == 0xFFFF.
> + * The symbol is intended to be used to limit the bit field width.
> + * thusly:.
> + * <a_register> = (any_expression) & _BITMASK(x), where 0 < x <= 32..
> + * If "any_expression" results in a value that is larger than can be.
> + * contained in 'x' bits, the bits above 'x - 1' are masked off. When.
> + * used with the _SBF example above, the example would be written:.
> + * a_reg = ((_SBF(5,7) | _SBF(12,0xF)) & _BITMASK(16)).
> + * This ensures that the value written to a_reg is no wider than.
> + * 16 bits, and makes the code easier to read and understand..
> + */.
> +#undef _BITMASK.
> +/* Bitmask creation macro */.
> +#define _BITMASK(field_width) ( _BIT(field_width) - 1).
> +.
> +/* NULL pointer */.
> +#ifndef NULL.
> +#define NULL ((void*) 0).
> +#endif.
> +.
> +/* Number of elements in an array */.
> +#define NELEMENTS(array) (sizeof (array) / sizeof (array[0])).
> +.
> +/* Static data/function define */.
> +#define STATIC static.
> +/* External data/function define */.
> +#define EXTERN extern.
> +.
> +#define MAX(a, b) (((a) > (b)) ? (a) : (b)).
> +#define MIN(a, b) (((a) < (b)) ? (a) : (b)).
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Old Type Definition compatibility ------------------------------------------ */.
> +/** @addtogroup LPC_Types_Public_Types.
> + * @{.
> + */.
> +.
> +/** SMA type for character type */.
> +typedef char CHAR;.
> +.
> +/** SMA type for 8 bit unsigned value */.
> +typedef uint8_t UNS_8;.
> +.
> +/** SMA type for 8 bit signed value */.
> +typedef int8_t INT_8;.
> +.
> +/** SMA type for 16 bit unsigned value */.
> +typedef uint16_t UNS_16;.
> +.
> +/** SMA type for 16 bit signed value */.
> +typedef int16_t INT_16;.
> +.
> +/** SMA type for 32 bit unsigned value */.
> +typedef uint32_t UNS_32;.
> +.
> +/** SMA type for 32 bit signed value */.
> +typedef int32_t INT_32;.
> +.
> +/** SMA type for 64 bit signed value */.
> +typedef int64_t INT_64;.
> +.
> +/** SMA type for 64 bit unsigned value */.
> +typedef uint64_t UNS_64;.
> +.
> +/** 32 bit boolean type */.
> +typedef Bool BOOL_32;.
> +.
> +/** 16 bit boolean type */.
> +typedef Bool BOOL_16;.
> +.
> +/** 8 bit boolean type */.
> +typedef Bool BOOL_8;.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +#endif /* LPC_TYPES_H */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/Makefile b/arch/arm/mach-lpc17cmsis/libs/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/Makefile.omk
> new file mode 100644
> index 0000000..5baf5ed
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/Makefile.omk
> @@ -0,0 +1,3 @@
> +# -*- makefile -*-
> +
> +SUBDIRS = $(ALL_OMK_SUBDIRS)
> diff --git a/arch/arm/mach-lpc17cmsis/libs/adc/Makefile b/arch/arm/mach-lpc17cmsis/libs/adc/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/adc/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/adc/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/adc/Makefile.omk
> new file mode 100644
> index 0000000..7744b01
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/adc/Makefile.omk
> @@ -0,0 +1,8 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = adc
> +
> +adc_SOURCES = lpc17xx_adc.c
> +include_HEADERS = lpc17xx_adc.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.c b/arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.c
> new file mode 100644
> index 0000000..b17f0d9
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.c
> @@ -0,0 +1,335 @@
> +/**.
> + * @file : lpc17xx_adc.c.
> + * @brief : Contains all functions support for ADC firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 3. April. 2009.
> + * @author : NgaDinh.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **********************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @addtogroup ADC.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_adc.h".
> +#include "lpc17xx_clkpwr.h".
> +.
> +/* If this source file built with example, the LPC17xx FW library configuration.
> + * file in each example directory ("lpc17xx_libcfg.h") must be included,.
> + * otherwise the default FW library configuration file must be included instead.
> + */.
> +#ifdef __BUILD_WITH_EXAMPLE__.
> +#include "lpc17xx_libcfg.h".
> +#else.
> +#include "lpc17xx_libcfg_default.h".
> +#endif /* __BUILD_WITH_EXAMPLE__ */.
> +.
> +.
> +#ifdef _ADC.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup ADC_Public_Functions.
> + * @{.
> + */.
> +.
> +/*********************************************************************//**.
> + * @brief Initial for ADC.
> + * - Set bit PCADC.
> + * - Set clock for ADC.
> + * - Set Clock Frequency.
> + *.
> + * @param[in] ADCx pointer to LPC_ADC_TypeDef.
> + * @param[in] ConvFreq Clock frequency.
> + * @return None.
> + **********************************************************************/.
> +void ADC_Init(LPC_ADC_TypeDef *ADCx, uint32_t ConvFreq).
> +.
> +{.
> + uint32_t temp, tmp;.
> +.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> + CHECK_PARAM(PARAM_ADC_FREQUENCY(ConvFreq));.
> +.
> + // Turn on power and clock.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCAD, ENABLE);.
> + // Set clock divider for ADC to 4 from CCLK as default.
> + // CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_ADC,CLKPWR_PCLKSEL_CCLK_DIV_4);.
> +.
> + ADCx->ADCR = 0;.
> +.
> + //Enable PDN bit.
> + tmp = ADC_CR_PDN;.
> + // Set clock frequency.
> + temp = CLKPWR_GetPCLK(CLKPWR_PCLKSEL_ADC) ;.
> + temp = (temp /ConvFreq) - 1;.
> + tmp |= ADC_CR_CLKDIV(temp);.
> +.
> + ADCx->ADCR = tmp;.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> +* @brief Close ADC.
> +* @param[in] ADCx pointer to ADC.
> +* @return None.
> +**********************************************************************/.
> +void ADC_DeInit(LPC_ADC_TypeDef *ADCx).
> +{.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> +.
> + // Clear PDN bit.
> + ADCx->ADCR &= ~ADC_CR_PDN;.
> + // Turn on power and clock.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCAD, DISABLE);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> +* @brief Get Result conversion from A/D data register.
> +* @param[in] channel number which want to read back the result.
> +* @return Result of conversion.
> +*********************************************************************/.
> +uint32_t ADC_GetData(uint32_t channel).
> +{.
> + uint32_t adc_value;.
> +.
> + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel));.
> +.
> + adc_value = *(uint32_t *)((&LPC_ADC->ADDR0) + channel);.
> + return ADC_GDR_RESULT(adc_value);.
> +}.
> +.
> +/*********************************************************************//**.
> +* @brief Set start mode for ADC.
> +* @param[in] ADCx pointer to LPC_ADC_TypeDef.
> +* @param[in] start_mode Start mode choose one of modes in.
> +* 'ADC_START_OPT' enumeration type definition.
> +* @return None.
> +*********************************************************************/.
> +void ADC_StartCmd(LPC_ADC_TypeDef *ADCx, uint8_t start_mode).
> +{.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> + CHECK_PARAM(PARAM_ADC_START_OPT(start_mode));.
> +.
> + ADCx->ADCR &= ~ADC_CR_START_MASK;.
> + ADCx->ADCR |=ADC_CR_START_MODE_SEL((uint32_t)start_mode);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> +* @brief ADC Burst mode setting.
> +*.
> +* @param[in] ADCx pointer to ADC.
> +* @param[in] NewState.
> +* - 1: Set Burst mode.
> +* - 0: reset Burst mode.
> +* @return None.
> +**********************************************************************/.
> +void ADC_BurstCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> +.
> + ADCx->ADCR &= ~ADC_CR_BURST;.
> + if (NewState){.
> + ADCx->ADCR |= ADC_CR_BURST;.
> + }.
> +.
> +}.
> +.
> +/*********************************************************************//**.
> +* @brief Set AD conversion in power mode.
> +*.
> +* @param[in] ADCx pointer to ADC.
> +* @param[in] NewState.
> +* - 1: AD converter is optional.
> +* - 0: AD Converter is in power down mode.
> +* @return None.
> +**********************************************************************/.
> +void ADC_PowerdownCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> +.
> + ADCx->ADCR &= ~ADC_CR_PDN;.
> + if (NewState){.
> + ADCx->ADCR |= ADC_CR_PDN;.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> +* @brief Set Edge start configuration.
> +*.
> +* @param[in] ADCx pointer to ADC.
> +* @param[in] EdgeOption is ADC_START_ON_RISING and ADC_START_ON_FALLING.
> +* 0:ADC_START_ON_RISING.
> +* 1:ADC_START_ON_FALLING.
> +*.
> +* @return None.
> +**********************************************************************/.
> +void ADC_EdgeStartConfig(LPC_ADC_TypeDef *ADCx, uint8_t EdgeOption).
> +{.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> + CHECK_PARAM(PARAM_ADC_START_ON_EDGE_OPT(EdgeOption));.
> +.
> + ADCx->ADCR &= ~ADC_CR_EDGE;.
> + if (EdgeOption){.
> + ADCx->ADCR |= ADC_CR_EDGE;.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> +* @brief ADC interrupt configuration.
> +* @param[in] ADCx pointer to ADC.
> +* @param[in] IntType.
> +* @param[in] NewState:.
> +* - SET : enable ADC interrupt.
> +* - RESET: disable ADC interrupt.
> +*.
> +* @return None.
> +**********************************************************************/.
> +void ADC_IntConfig (LPC_ADC_TypeDef *ADCx, ADC_TYPE_INT_OPT IntType, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> + CHECK_PARAM(PARAM_ADC_TYPE_INT_OPT(IntType));.
> +.
> + ADCx->ADINTEN &= ~ADC_INTEN_CH(IntType);.
> + if (NewState){.
> + ADCx->ADINTEN |= ADC_INTEN_CH(IntType);.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> +* @brief Enable/Disable ADC channel number.
> +* @param[in] ADCx pointer to ADC.
> +* @param[in] Channel channel number.
> +* @param[in] NewState Enable or Disable.
> +*.
> +* @return None.
> +**********************************************************************/.
> +void ADC_ChannelCmd (LPC_ADC_TypeDef *ADCx, uint8_t Channel, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(Channel));.
> +.
> + if (NewState == ENABLE) {.
> + ADCx->ADCR |= ADC_CR_CH_SEL(Channel);.
> + } else {.
> + ADCx->ADCR &= ~ADC_CR_CH_SEL(Channel);.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> +* @brief Get ADC result.
> +* @param[in] ADCx pointer to ADC.
> +* @param[in] channel channel number.
> +* @return Data conversion.
> +**********************************************************************/.
> +uint16_t ADC_ChannelGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel).
> +{.
> + uint32_t adc_value;.
> +.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel));.
> +.
> + adc_value = *(uint32_t *) ((&ADCx->ADDR0) + channel);.
> + return ADC_DR_RESULT(adc_value);.
> +}.
> +.
> +/*********************************************************************//**.
> +* @brief Get ADC Chanel status from ADC data register.
> +* @param[in] ADCx pointer to ADC.
> +* @param[in] channel channel number.
> +* @param[in] StatusType.
> +* 0:Burst status.
> +* 1:Done status.
> +* @return SET / RESET.
> +**********************************************************************/.
> +FlagStatus ADC_ChannelGetStatus(LPC_ADC_TypeDef *ADCx, uint8_t channel, uint32_t StatusType).
> +{.
> + uint32_t temp;.
> +.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel));.
> + CHECK_PARAM(PARAM_ADC_DATA_STATUS(StatusType));.
> +.
> + temp = *(uint32_t *) ((&ADCx->ADDR0) + channel);.
> + if (StatusType) {.
> + temp &= ADC_DR_DONE_FLAG;.
> + }else{.
> + temp &= ADC_DR_OVERRUN_FLAG;.
> + }.
> + if (temp) {.
> + return SET;.
> + } else {.
> + return RESET;.
> + }.
> +.
> +}.
> +.
> +/*********************************************************************//**.
> +* @brief Get ADC Data from AD Global register.
> +* @param[in] ADCx pointer to ADC.
> +* @param[in] channel channel number.
> +* @return Result of conversion.
> +**********************************************************************/.
> +uint16_t ADC_GlobalGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel).
> +{.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel));.
> +.
> + //ADCx->ADGDR &= ~ADC_GDR_CH_MASK;.
> + //ADCx->ADGDR |= ADC_GDR_CH(channel);.
> + return (uint16_t)(ADC_GDR_RESULT(ADCx->ADGDR));.
> +}.
> +.
> +/*********************************************************************//**.
> +* @brief Get ADC Chanel status from AD global data register.
> +* @param[in] ADCx pointer to ADC.
> +* @param[in] StatusType.
> +* 0:Burst status.
> +* 1:Done status.
> +* @return SET / RESET.
> +**********************************************************************/.
> +FlagStatus ADC_GlobalGetStatus(LPC_ADC_TypeDef *ADCx, uint32_t StatusType).
> +{.
> + uint32_t temp;.
> +.
> + CHECK_PARAM(PARAM_ADCx(ADCx));.
> + CHECK_PARAM(PARAM_ADC_DATA_STATUS(StatusType));.
> +.
> + temp = ADCx->ADGDR;.
> + if (StatusType){.
> + temp &= ADC_DR_DONE_FLAG;.
> + }else{.
> + temp &= ADC_DR_OVERRUN_FLAG;.
> + }.
> + if (temp){.
> + return SET;.
> + }else{.
> + return RESET;.
> + }.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +#endif /* _ADC */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> +.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.h b/arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.h
> new file mode 100644
> index 0000000..3f8e8bc
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/adc/lpc17xx_adc.h
> @@ -0,0 +1,299 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_adc.h.
> + * @brief : Contains all macro definitions and function prototypes.
> + * support for ADC firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 3. April. 2009.
> + * @author : NgaDinh.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @defgroup ADC.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC17XX_ADC_H_.
> +#define LPC17XX_ADC_H_.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "LPC17xx.h".
> +#include "lpc_types.h".
> +.
> +.
> +#ifdef __cplusplus.
> +extern "C".
> +{.
> +#endif.
> +.
> +.
> +/* Private Macros ------------------------------------------------------------- */.
> +/** @defgroup ADC_Private_Macros ADC_Private_Macros.
> + * @{.
> + */.
> +.
> +.
> +/** @defgroup group3 ADC_REGISTER_BIT_DEFINITIONS.
> + * @{.
> + */.
> +.
> +/*********************************************************************//**.
> + * Macro defines for ADC control register.
> + **********************************************************************/.
> +/** Selects which of the AD0.0:7 pins is (are) to be sampled and converted */.
> +#define ADC_CR_CH_SEL(n) ((1UL << n)).
> +/** The APB clock (PCLK) is divided by (this value plus one).
> +* to produce the clock for the A/D */.
> +#define ADC_CR_CLKDIV(n) ((n<<8)).
> +/** Repeated conversions A/D enable bit */.
> +#define ADC_CR_BURST ((1UL<<16)).
> +/** ADC convert in power down mode */.
> +#define ADC_CR_PDN ((1UL<<21)).
> +/** Start mask bits */.
> +#define ADC_CR_START_MASK ((7UL<<24)).
> +/** Select Start Mode */.
> +#define ADC_CR_START_MODE_SEL(SEL) ((SEL<<24)).
> +/** Start conversion now */.
> +#define ADC_CR_START_NOW ((1UL<<24)).
> +/** Start conversion when the edge selected by bit 27 occurs on P2.10/EINT0 */.
> +#define ADC_CR_START_EINT0 ((2UL<<24)).
> +/** Start conversion when the edge selected by bit 27 occurs on P1.27/CAP0.1 */.
> +#define ADC_CR_START_CAP01 ((3UL<<24)).
> +/** Start conversion when the edge selected by bit 27 occurs on MAT0.1 */.
> +#define ADC_CR_START_MAT01 ((4UL<<24)).
> +/** Start conversion when the edge selected by bit 27 occurs on MAT0.3 */.
> +#define ADC_CR_START_MAT03 ((5UL<<24)).
> +/** Start conversion when the edge selected by bit 27 occurs on MAT1.0 */.
> +#define ADC_CR_START_MAT10 ((6UL<<24)).
> +/** Start conversion when the edge selected by bit 27 occurs on MAT1.1 */.
> +#define ADC_CR_START_MAT11 ((7UL<<24)).
> +/** Start conversion on a falling edge on the selected CAP/MAT signal */.
> +#define ADC_CR_EDGE ((1UL<<27)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for ADC Global Data register.
> + **********************************************************************/.
> +/** When DONE is 1, this field contains result value of ADC conversion */.
> +#define ADC_GDR_RESULT(n) (((n>>4)&0xFFF)).
> +/** These bits contain the channel from which the LS bits were converted */.
> +#define ADC_GDR_CH(n) (((n>>24)&0x7)).
> +/** This bit is 1 in burst mode if the results of one or.
> + * more conversions was (were) lost */.
> +#define ADC_GDR_OVERRUN_FLAG ((1UL<<30)).
> +/** This bit is set to 1 when an A/D conversion completes */.
> +#define ADC_GDR_DONE_FLAG ((1UL<<31)).
> +.
> +/** This bits is used to mask for Channel */.
> +#define ADC_GDR_CH_MASK ((7UL<<24)).
> +/*********************************************************************//**.
> + * Macro defines for ADC Interrupt register.
> + **********************************************************************/.
> +/** These bits allow control over which A/D channels generate.
> + * interrupts for conversion completion */.
> +#define ADC_INTEN_CH(n) ((1UL<<n)).
> +/** When 1, enables the global DONE flag in ADDR to generate an interrupt */.
> +#define ADC_INTEN_GLOBAL ((1UL<<8)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for ADC Data register.
> + **********************************************************************/.
> +/** When DONE is 1, this field contains result value of ADC conversion */.
> +#define ADC_DR_RESULT(n) (((n>>4)&0xFFF)).
> +/** These bits mirror the OVERRRUN status flags that appear in the.
> + * result register for each A/D channel */.
> +#define ADC_DR_OVERRUN_FLAG ((1UL<<30)).
> +/** This bit is set to 1 when an A/D conversion completes. It is cleared.
> + * when this register is read */.
> +#define ADC_DR_DONE_FLAG ((1UL<<31)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for ADC Status register.
> +**********************************************************************/.
> +/** These bits mirror the DONE status flags that appear in the result.
> + * register for each A/D channel */.
> +#define ADC_STAT_CH_DONE_FLAG(n) ((n&0xFF)).
> +/** These bits mirror the OVERRRUN status flags that appear in the.
> + * result register for each A/D channel */.
> +#define ADC_STAT_CH_OVERRUN_FLAG(n) (((n>>8)&0xFF)).
> +/** This bit is the A/D interrupt flag */.
> +#define ADC_STAT_INT_FLAG ((1UL<<16)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for ADC Trim register.
> +**********************************************************************/.
> +/** Offset trim bits for ADC operation */.
> +#define ADC_ADCOFFS(n) (((n&0xF)<<4)).
> +/** Written to boot code*/.
> +#define ADC_TRIM(n) (((n&0xF)<<8)).
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Types --------------------------------------------------------------- */.
> +/** @defgroup ADC_Public_Types.
> + * @{.
> + */.
> +.
> +/*********************************************************************//**.
> + * @brief ADC enumeration.
> + **********************************************************************/.
> +/** @brief Channel Selection */.
> +typedef enum.
> +{.
> + ADC_CHANNEL_0 = 0, /*!< Channel 0 */.
> + ADC_CHANNEL_1, /*!< Channel 1 */.
> + ADC_CHANNEL_2, /*!< Channel 2 */.
> + ADC_CHANNEL_3, /*!< Channel 3 */.
> + ADC_CHANNEL_4, /*!< Channel 4 */.
> + ADC_CHANNEL_5, /*!< Channel 5 */.
> + ADC_CHANNEL_6, /*!< Channel 6 */.
> + ADC_CHANNEL_7 /*!< Channel 7 */.
> +}ADC_CHANNEL_SELECTION;.
> +.
> +.
> +.
> +/** @brief Type of start option */.
> +.
> +/** @brief Type of start option */.
> +.
> +typedef enum.
> +{.
> + ADC_START_CONTINUOUS =0, /*!< Continuous mode */.
> + ADC_START_NOW, /*!< Start conversion now */.
> + ADC_START_ON_EINT0, /*!< Start conversion when the edge selected.
> + * by bit 27 occurs on P2.10/EINT0 */.
> + ADC_START_ON_CAP01, /*!< Start conversion when the edge selected.
> + * by bit 27 occurs on P1.27/CAP0.1 */.
> + ADC_START_ON_MAT01, /*!< Start conversion when the edge selected.
> + * by bit 27 occurs on MAT0.1 */.
> + ADC_START_ON_MAT03, /*!< Start conversion when the edge selected.
> + * by bit 27 occurs on MAT0.3 */.
> + ADC_START_ON_MAT10, /*!< Start conversion when the edge selected.
> + * by bit 27 occurs on MAT1.0 */.
> + ADC_START_ON_MAT11 /*!< Start conversion when the edge selected.
> + * by bit 27 occurs on MAT1.1 */.
> +} ADC_START_OPT;.
> +.
> +.
> +/** @brief Type of edge when start conversion on the selected CAP/MAT signal */.
> +.
> +typedef enum.
> +{.
> + ADC_START_ON_RISING = 0, /*!< Start conversion on a rising edge.
> + *on the selected CAP/MAT signal */.
> + ADC_START_ON_FALLING /*!< Start conversion on a falling edge.
> + *on the selected CAP/MAT signal */.
> +} ADC_START_ON_EDGE_OPT;.
> +.
> +/** @brief* ADC type interrupt enum */.
> +typedef enum.
> +{.
> + ADC_ADINTEN0 = 0, /*!< Interrupt channel 0 */.
> + ADC_ADINTEN1, /*!< Interrupt channel 1 */.
> + ADC_ADINTEN2, /*!< Interrupt channel 2 */.
> + ADC_ADINTEN3, /*!< Interrupt channel 3 */.
> + ADC_ADINTEN4, /*!< Interrupt channel 4 */.
> + ADC_ADINTEN5, /*!< Interrupt channel 5 */.
> + ADC_ADINTEN6, /*!< Interrupt channel 6 */.
> + ADC_ADINTEN7, /*!< Interrupt channel 7 */.
> + ADC_ADGINTEN /*!< Individual channel/global flag done generate an interrupt */.
> +}ADC_TYPE_INT_OPT;.
> +.
> +/** Macro to determine if it is valid interrupt type */.
> +#define PARAM_ADC_TYPE_INT_OPT(OPT) ((OPT == ADC_ADINTEN0)||(OPT == ADC_ADINTEN1)\.
> +||(OPT == ADC_ADINTEN2)||(OPT == ADC_ADINTEN3)\.
> +||(OPT == ADC_ADINTEN4)||(OPT == ADC_ADINTEN5)\.
> +||(OPT == ADC_ADINTEN6)||(OPT == ADC_ADINTEN7)\.
> +||(OPT == ADC_ADGINTEN)).
> +.
> +.
> +/** @brief ADC Data status */.
> +typedef enum.
> +{.
> + ADC_DATA_BURST = 0, /*Burst bit*/.
> + ADC_DATA_DONE /*Done bit*/.
> +}ADC_DATA_STATUS;.
> +.
> +.
> +#define PARAM_ADC_START_ON_EDGE_OPT(OPT) ((OPT == ADC_START_ON_RISING)||(OPT == ADC_START_ON_FALLING)).
> +.
> +#define PARAM_ADC_DATA_STATUS(OPT) ((OPT== ADC_DATA_BURST)||(OPT== ADC_DATA_DONE)).
> +.
> +#define PARAM_ADC_FREQUENCY(FRE) (FRE <= 13000000 ).
> +.
> +#define PARAM_ADC_CHANNEL_SELECTION(SEL) ((SEL == ADC_CHANNEL_0)||(ADC_CHANNEL_1)\.
> +||(SEL == ADC_CHANNEL_2)|(ADC_CHANNEL_3)\.
> +||(SEL == ADC_CHANNEL_4)||(ADC_CHANNEL_5)\.
> +||(SEL == ADC_CHANNEL_6)||(ADC_CHANNEL_7)).
> +.
> +#define PARAM_ADC_START_OPT(OPT) ((OPT == ADC_START_CONTINUOUS)||(OPT == ADC_START_NOW)\.
> +||(OPT == ADC_START_ON_EINT0)||(OPT == ADC_START_ON_CAP01)\.
> +||(OPT == ADC_START_ON_MAT01)||(OPT == ADC_START_ON_MAT03)\.
> +||(OPT == ADC_START_ON_MAT10)||(OPT == ADC_START_ON_MAT11)).
> +.
> +#define PARAM_ADC_TYPE_INT_OPT(OPT) ((OPT == ADC_ADINTEN0)||(OPT == ADC_ADINTEN1)\.
> +||(OPT == ADC_ADINTEN2)||(OPT == ADC_ADINTEN3)\.
> +||(OPT == ADC_ADINTEN4)||(OPT == ADC_ADINTEN5)\.
> +||(OPT == ADC_ADINTEN6)||(OPT == ADC_ADINTEN7)\.
> +||(OPT == ADC_ADGINTEN)).
> +.
> +#define PARAM_ADCx(n) (((uint32_t *)n)==((uint32_t *)LPC_ADC)).
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup ADC_Public_Functions.
> + * @{.
> + */.
> +.
> +void ADC_Init(LPC_ADC_TypeDef *ADCx, uint32_t ConvFreq);.
> +void ADC_DeInit(LPC_ADC_TypeDef *ADCx);.
> +void ADC_BurstCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState);.
> +void ADC_PowerdownCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState);.
> +void ADC_StartCmd(LPC_ADC_TypeDef *ADCx, uint8_t start_mode);.
> +void ADC_EdgeStartConfig(LPC_ADC_TypeDef *ADCx, uint8_t EdgeOption);.
> +void ADC_IntConfig (LPC_ADC_TypeDef *ADCx, ADC_TYPE_INT_OPT IntType, FunctionalState NewState);.
> +void ADC_ChannelCmd (LPC_ADC_TypeDef *ADCx, uint8_t Channel, FunctionalState NewState);.
> +uint16_t ADC_ChannelGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel);.
> +FlagStatus ADC_ChannelGetStatus(LPC_ADC_TypeDef *ADCx, uint8_t channel, uint32_t StatusType);.
> +uint16_t ADC_GlobalGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel);.
> +FlagStatus ADC_GlobalGetStatus(LPC_ADC_TypeDef *ADCx, uint32_t StatusType);.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +#ifdef __cplusplus.
> +}.
> +#endif.
> +.
> +.
> +#endif /* LPC17XX_ADC_H_ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/boot/Makefile b/arch/arm/mach-lpc17cmsis/libs/boot/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/boot/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/boot/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/boot/Makefile.omk
> new file mode 100644
> index 0000000..5db3c68
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/boot/Makefile.omk
> @@ -0,0 +1,3 @@
> +# -*- makefile -*-
> +
> +lib_obj_SOURCES = crt0_17xx.c initarray.c
> diff --git a/arch/arm/mach-lpc17cmsis/libs/boot/crt0_17xx.c b/arch/arm/mach-lpc17cmsis/libs/boot/crt0_17xx.c
> new file mode 100644
> index 0000000..6b859d0
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/boot/crt0_17xx.c
> @@ -0,0 +1,241 @@
> +/**
> + * crt0.c
> + * LPC17xx (ARM Cortex M3) family startup code
> + *
> + * adapted from startup_LPC17xx.c
> + * by Marek Peca <mp(a)duch.cz> 2010/06
> + * modified by Jiri Kubias <jiri.kubias(a)addat.cz>
> + *
> + * ( file : startup_LPC17xx.c )
> + * ( brief : CMSIS Cortex-M3 Core Device Startup File )
> + * ( version : V1.01 )
> + * ( date : 4. Feb. 2009 )
> + * ( Copyright (C) 2009 ARM Limited. All rights reserved. )
> + *
> + * ( ARM Limited (ARM) is supplying this software for use with Cortex-Mx )
> + * ( processor based microcontrollers. This file can be freely distributed )
> + * ( within development tools that are supporting such ARM based processors. )
> + */
> +
> +#include <sys/types.h>
> +#include <LPC17xx.h>
> +
> +#define WEAK __attribute__((weak))
> +
> +/* System exception vector handler */
> +void WEAK Reset_Handler(); /* Reset Handler */
> +void WEAK NMI_Handler(); /* NMI Handler */
> +void WEAK HardFault_Handler(); /* Hard Fault Handler */
> +void WEAK MemManage_Handler(); /* MPU Fault Handler */
> +void WEAK BusFault_Handler(); /* Bus Fault Handler */
> +void WEAK UsageFault_Handler(); /* Usage Fault Handler */
> +void WEAK SVC_Handler(); /* SVCall Handler */
> +void WEAK DebugMon_Handler(); /* Debug Monitor Handler */
> +void WEAK PendSV_Handler(); /* PendSV Handler */
> +void WEAK SysTick_Handler(); /* SysTick Handler */
> +
> +/* External interrupt vector handler */
> +void WEAK WAKEUP_IRQHandler();
> +void WEAK I2C_IRQHandler();
> +void WEAK TIMER16_0_IRQHandler();
> +void WEAK TIMER16_1_IRQHandler();
> +void WEAK TIMER32_0_IRQHandler();
> +void WEAK TIMER32_1_IRQHandler();
> +void WEAK SSP_IRQHandler();
> +void WEAK UART_IRQHandler();
> +void WEAK USB_IRQHandler();
> +void WEAK USB_FIQHandler();
> +void WEAK ADC_IRQHandler();
> +void WEAK WDT_IRQHandler();
> +void WEAK BOD_IRQHandler();
> +void WEAK FMC_IRQHandler();
> +void WEAK PIOINT3_IRQHandler();
> +void WEAK PIOINT2_IRQHandler();
> +void WEAK PIOINT1_IRQHandler();
> +void WEAK PIOINT0_IRQHandler();
> +
> +/** memory map pointers (defined in ldscript) **/
> +extern uint32_t _data, _edata, _datainit;
> +extern uint32_t __bss_start, __bss_end__;
> +extern uint32_t _stack;
> +
> +/** function prototypes **/
> +extern void WEAK _memory_init();
> +extern void WEAK __libc_init_array();
> +////void _start() __attribute__((__interrupt__));
> +void _start();
> +extern int main();
> +
> +/*
> + * The minimal vector table for a Cortex M3. Note that the proper constructs
> + * must be placed on this to ensure that it ends up at physical address
> + * 0x00000000.
> + */
> +__attribute__((section(".ivec")))
> + void (* const _vectors[])() =
> +{
> + /* Cortex M3 common */
> + (void (*)())&_stack, /* The initial stack pointer */
> + _start, /* Reset Handler */
> + NMI_Handler, /* NMI Handler */
> + HardFault_Handler, /* Hard Fault Handler */
> + MemManage_Handler, /* MPU Fault Handler */
> + BusFault_Handler, /* Bus Fault Handler */
> + UsageFault_Handler, /* Usage Fault Handler */
> + 0, /* Reserved */
> + 0, /* Reserved */
> + 0, /* Reserved */
> + 0, /* Reserved */
> + SVC_Handler, /* SVCall Handler */
> + DebugMon_Handler, /* Debug Monitor Handler */
> + 0, /* Reserved */
> + PendSV_Handler, /* PendSV Handler */
> + SysTick_Handler, /* SysTick Handler */
> +
> + /* LPC13xx specific interrupts */
> + WAKEUP_IRQHandler, /* 16 0 Wake-up on pin PIO0_0 */
> + WAKEUP_IRQHandler, /* 17 1 Wake-up on pin PIO0_1 */
> + WAKEUP_IRQHandler, /* 18 2 Wake-up on pin PIO0_2 */
> + WAKEUP_IRQHandler, /* 19 3 Wake-up on pin PIO0_3 */
> + WAKEUP_IRQHandler, /* 20 4 Wake-up on pin PIO0_4 */
> + WAKEUP_IRQHandler, /* 21 5 Wake-up on pin PIO0_5 */
> + WAKEUP_IRQHandler, /* 22 6 Wake-up on pin PIO0_6 */
> + WAKEUP_IRQHandler, /* 23 7 Wake-up on pin PIO0_7 */
> + WAKEUP_IRQHandler, /* 24 8 Wake-up on pin PIO0_8 */
> + WAKEUP_IRQHandler, /* 25 9 Wake-up on pin PIO0_9 */
> + WAKEUP_IRQHandler, /* 26 10 Wake-up on pin PIO0_10 */
> + WAKEUP_IRQHandler, /* 27 11 Wake-up on pin PIO0_11 */
> + WAKEUP_IRQHandler, /* 28 12 Wake-up on pin PIO1_0 */
> + WAKEUP_IRQHandler, /* 29 13 Wake-up on pin PIO1_1 */
> + WAKEUP_IRQHandler, /* 30 14 Wake-up on pin PIO1_2 */
> + WAKEUP_IRQHandler, /* 31 15 Wake-up on pin PIO1_3 */
> + WAKEUP_IRQHandler, /* 32 16 Wake-up on pin PIO1_4 */
> + WAKEUP_IRQHandler, /* 33 17 Wake-up on pin PIO1_5 */
> + WAKEUP_IRQHandler, /* 34 18 Wake-up on pin PIO1_6 */
> + WAKEUP_IRQHandler, /* 35 19 Wake-up on pin PIO1_7 */
> + WAKEUP_IRQHandler, /* 36 20 Wake-up on pin PIO1_8 */
> + WAKEUP_IRQHandler, /* 37 21 Wake-up on pin PIO1_9 */
> + WAKEUP_IRQHandler, /* 38 22 Wake-up on pin PIO1_10 */
> + WAKEUP_IRQHandler, /* 39 23 Wake-up on pin PIO1_11 */
> + WAKEUP_IRQHandler, /* 40 24 Wake-up on pin PIO2_0 */
> + WAKEUP_IRQHandler, /* 41 25 Wake-up on pin PIO2_1 */
> + WAKEUP_IRQHandler, /* 42 26 Wake-up on pin PIO2_2 */
> + WAKEUP_IRQHandler, /* 43 27 Wake-up on pin PIO2_3 */
> + WAKEUP_IRQHandler, /* 44 28 Wake-up on pin PIO2_4 */
> + WAKEUP_IRQHandler, /* 45 29 Wake-up on pin PIO2_5 */
> + WAKEUP_IRQHandler, /* 46 30 Wake-up on pin PIO2_6 */
> + WAKEUP_IRQHandler, /* 47 31 Wake-up on pin PIO2_7 */
> + WAKEUP_IRQHandler, /* 48 32 Wake-up on pin PIO2_8 */
> + WAKEUP_IRQHandler, /* 49 33 Wake-up on pin PIO2_9 */
> + WAKEUP_IRQHandler, /* 50 34 Wake-up on pin PIO2_10 */
> + WAKEUP_IRQHandler, /* 51 35 Wake-up on pin PIO2_11 */
> + WAKEUP_IRQHandler, /* 52 36 Wake-up on pin PIO3_0 */
> + WAKEUP_IRQHandler, /* 53 37 Wake-up on pin PIO3_1 */
> + WAKEUP_IRQHandler, /* 54 38 Wake-up on pin PIO3_2 */
> + WAKEUP_IRQHandler, /* 55 39 Wake-up on pin PIO3_3 */
> + I2C_IRQHandler, /* 56 40 I2C0 SI (state change) */
> + TIMER16_0_IRQHandler, /* 57 41 CT16B0 16 bit timer 0 */
> + TIMER16_1_IRQHandler, /* 58 42 CT16B1 16 bit timer 1 */
> + TIMER32_0_IRQHandler, /* 59 43 CT32B0 32 bit timer 0 */
> + TIMER32_1_IRQHandler, /* 60 44 CT32B1 32 bit timer 1 */
> + SSP_IRQHandler, /* 61 45 SSP */
> + UART_IRQHandler, /* 62 46 UART */
> + USB_IRQHandler, /* 63 47 USB IRQ low priority */
> + USB_FIQHandler, /* 64 48 USB FIQ high priority */
> + ADC_IRQHandler, /* 65 49 ADC end of conversion */
> + WDT_IRQHandler, /* 66 50 Watchdog interrupt (WDINT) */
> + BOD_IRQHandler, /* 67 51 BOD Brown-out detect */
> + FMC_IRQHandler, /* 68 52 Reserved also marked as IP2111 Flash Memory */
> + PIOINT3_IRQHandler, /* 69 53 PIO_3 GPIO interrupt status of port 3 */
> + PIOINT2_IRQHandler, /* 70 54 PIO_2 GPIO interrupt status of port 2 */
> + PIOINT1_IRQHandler, /* 71 55 PIO_1 GPIO interrupt status of port 1 */
> + PIOINT0_IRQHandler, /* 72 56 PIO_0 GPIO interrupt status of port 0 */
> +};
> +
> +/*
> + * startup code (Reset Handler)
> + */
> +void _start() {
> + uint32_t *src, *dst;
> +
> + /*
> + * External memory initialization (only if _memory_init linked)
> + * (can not be called from init_array, must precede data initialization)
> + */
> + if (_memory_init)
> + _memory_init();
> +
> + /* Copy initialized data to its execution address in RAM */
> + if (&_datainit != &_data) { /* _datainit == _data indicates RAM, ie. no need of copying */
> + for (src = &_datainit, dst = &_data; dst < &_edata; src++, dst++)
> + *dst = *src;
> + }
> +
> + /* clear .bss */
> + for (dst = &__bss_start; dst < &__bss_end__; dst++)
> + *dst = 0;
> +
> + /*
> + * remap IRQ vector or not, depending on their RAM/ROM location
> + */
> + /*
> +* set IRQ vectors location
> +*/
> +//SYSMEMREMAP = 2; /* do NOT use NXP LPC fashioned vectors remapping.. */
> +SCB->VTOR = (uint32_t)&_vectors; /* ..follow Cortex M3's way instead */
> +
> + /* Call init functions in .init_array section (only if __libc_init_array exists) */
> + if (__libc_init_array)
> + __libc_init_array();
> +
> + /* set irq table */
> + //SCB->VTOR=0x10000000;
> +
> + /* Call the application's entry point. */
> + main();
> +
> + /* Requiescat In Pacem */
> + for (;;);
> +}
> +
> +/*
> + * This is the code that gets called when the processor receives an unexpected
> + * interrupt. This simply enters an infinite loop, preserving the system state
> + * for examination by a debugger.
> + */
> +void Default_Handler() {
> + for (;;);
> +}
> +
> +/*
> + * Provide weak aliases for each Exception handler to the Default_Handler.
> + * As they are weak aliases, any function with the same name will override
> + * this definition.
> + */
> +#pragma weak MemManage_Handler = Default_Handler /* MPU Fault Handler */
> +#pragma weak BusFault_Handler = Default_Handler /* Bus Fault Handler */
> +#pragma weak UsageFault_Handler = Default_Handler /* Usage Fault Handler */
> +#pragma weak SVC_Handler = Default_Handler /* SVCall Handler */
> +#pragma weak DebugMon_Handler = Default_Handler /* Debug Monitor Handler */
> +#pragma weak PendSV_Handler = Default_Handler /* PendSV Handler */
> +#pragma weak SysTick_Handler = Default_Handler /* SysTick Handler */
> +
> +/* External interrupt vector handler */
> +#pragma weak WAKEUP_IRQHandler = Default_Handler
> +#pragma weak I2C_IRQHandler = Default_Handler
> +#pragma weak TIMER16_0_IRQHandler = Default_Handler
> +#pragma weak TIMER16_1_IRQHandler = Default_Handler
> +#pragma weak TIMER32_0_IRQHandler = Default_Handler
> +#pragma weak TIMER32_1_IRQHandler = Default_Handler
> +#pragma weak SSP_IRQHandler = Default_Handler
> +#pragma weak UART_IRQHandler = Default_Handler
> +#pragma weak USB_IRQHandler = Default_Handler
> +#pragma weak USB_FIQHandler = Default_Handler
> +#pragma weak ADC_IRQHandler = Default_Handler
> +#pragma weak WDT_IRQHandler = Default_Handler
> +#pragma weak BOD_IRQHandler = Default_Handler
> +#pragma weak FMC_IRQHandler = Default_Handler
> +#pragma weak PIOINT3_IRQHandler = Default_Handler
> +#pragma weak PIOINT2_IRQHandler = Default_Handler
> +#pragma weak PIOINT1_IRQHandler = Default_Handler
> +#pragma weak PIOINT0_IRQHandler = Default_Handler
> diff --git a/arch/arm/mach-lpc17cmsis/libs/boot/initarray.c b/arch/arm/mach-lpc17cmsis/libs/boot/initarray.c
> new file mode 120000
> index 0000000..fd113a0
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/boot/initarray.c
> @@ -0,0 +1 @@
> +../../../mach-lpc23xx/libs/boot/initarray.c
> \ No newline at end of file
> diff --git a/arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile b/arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile.omk
> new file mode 100644
> index 0000000..07f0c6c
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/can-cm/Makefile.omk
> @@ -0,0 +1,8 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = can-cm
> +
> +can-cm_SOURCES = lpc17xx_can.c
> +include_HEADERS = lpc17xx_can.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.c b/arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.c
> new file mode 100644
> index 0000000..2373aaa
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.c
> @@ -0,0 +1,1919 @@
> +/**.
> + * @file : lpc17xx_can.c.
> + * @brief : Contains all functions support for CAN firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 1.June.2009.
> + * @author : NguyenCao.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **********************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @addtogroup CAN.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_can.h".
> +#include "lpc17xx_clkpwr.h".
> +.
> +/* If this source file built with example, the LPC17xx FW library configuration.
> + * file in each example directory ("lpc17xx_libcfg.h") must be included,.
> + * otherwise the default FW library configuration file must be included instead.
> + */.
> +#ifdef __BUILD_WITH_EXAMPLE__.
> +#include "lpc17xx_libcfg.h".
> +#else.
> +#include "lpc17xx_libcfg_default.h".
> +#endif /* __BUILD_WITH_EXAMPLE__ */.
> +.
> +.
> +#ifdef _CAN.
> +.
> +/* Private Variables ---------------------------------------------------------- */.
> +/** @defgroup CAN_Private_Variables.
> + * @{.
> + */.
> +.
> +FunctionalState FULLCAN_ENABLE;.
> +.
> +//use for debugging.
> +LPC_CAN_TypeDef *CAN1x = LPC_CAN1;.
> +LPC_CAN_TypeDef *CAN2x = LPC_CAN2;.
> +LPC_CANAF_RAM_TypeDef *CANAFRAMx = LPC_CANAF_RAM;.
> +LPC_CANAF_TypeDef *CANAFx = LPC_CANAF;.
> +.
> +/* Values of bit time register for different baudrates.
> + NT = Nominal bit time = TSEG1 + TSEG2 + 3.
> + SP = Sample point = ((TSEG2 +1) / (TSEG1 + TSEG2 + 3)) * 100%.
> + SAM, SJW, TSEG1, TSEG2, NT, SP */.
> +const uint32_t CAN_BIT_TIME[] ={0, /* not used */.
> +0, /* not used */.
> +0, /* not used */.
> +0, /* not used */.
> +0x0001C000, /* 0+1, 3+1, 1+1, 0+1, 4, 75% */.
> +0, /* not used */.
> +0x0012C000, /* 0+1, 3+1, 2+1, 1+1, 6, 67% */.
> +0, /* not used */.
> +0x0023C000, /* 0+1, 3+1, 3+1, 2+1, 8, 63% */.
> +0, /* not used */.
> +0x0025C000, /* 0+1, 3+1, 5+1, 2+1, 10, 70% */.
> +0, /* not used */.
> +0x0036C000, /* 0+1, 3+1, 6+1, 3+1, 12, 67% */.
> +0, /* not used */.
> +0, /* not used */.
> +0x0048C000, /* 0+1, 3+1, 8+1, 4+1, 15, 67% */.
> +0x0049C000, /* 0+1, 3+1, 9+1, 4+1, 16, 69% */.
> +};.
> +.
> +/* Counts number of filters (CAN message objects) used */.
> +uint16_t CANAF_FullCAN_cnt = 0;.
> +uint16_t CANAF_std_cnt = 0;.
> +uint16_t CANAF_gstd_cnt = 0;.
> +uint16_t CANAF_ext_cnt = 0;.
> +uint16_t CANAF_gext_cnt = 0;.
> +.
> +static fnCANCbs_Type* _apfnCANCbs[12]={.
> + NULL, //CAN Recieve Call-back funtion pointer.
> + NULL, //CAN Transmit1 Call-back funtion pointer.
> + NULL, //CAN Error Warning Call-back function pointer.
> + NULL, //CAN Data Overrun Call-back function pointer.
> + NULL, //CAN Wake-up Call-back funtion pointer.
> + NULL, //CAN Error Passive Call-back function pointer.
> + NULL, //CAN Arbitration Lost Call-back function pointer.
> + NULL, //CAN Bus Error Call-back function pointer.
> + NULL, //CAN ID Ready Call-back function pointer.
> + NULL, //CAN Transmit2 Call-back function pointer.
> + NULL, //CAN Transmit3 Call-back function pointer.
> + NULL //FullCAN Receive Call-back function pointer.
> +};.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup CAN_Public_Functions.
> + * @{.
> + */.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Setting CAN baud rate (bps).
> + * @param[in] CANx point to LPC_CAN_TypeDef object, should be:.
> + * - CAN1.
> + * - CAN2.
> + * @param[in] baudrate is the baud rate value will be set.
> + * @return None.
> + ***********************************************************************/.
> +void CAN_SetBaudRate (LPC_CAN_TypeDef *CANx, uint32_t baudrate).
> +{.
> + uint32_t nominal_time;.
> + uint32_t result = 0;.
> + uint32_t CANPclk = 0;.
> +.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> +.
> + if (CANx == LPC_CAN1).
> + {.
> + CANPclk = CLKPWR_GetPCLK (CLKPWR_PCONP_PCAN1);.
> + }.
> + else.
> + {.
> + CANPclk = CLKPWR_GetPCLK (CLKPWR_PCONP_PCAN2);.
> + }.
> + /* Determine which nominal time to use for PCLK and baudrate */.
> + if (baudrate <= 500000).
> + {.
> + nominal_time = 12;.
> + }.
> + else if (((CANPclk / 1000000) % 15) == 0).
> + {.
> + nominal_time = 15;.
> + }.
> + else if (((CANPclk / 1000000) % 16) == 0).
> + {.
> + nominal_time = 16;.
> + }.
> + else.
> + {.
> + nominal_time = 10;.
> + }.
> +.
> + /* Prepare value appropriate for bit time register */.
> + result = (CANPclk / nominal_time) / baudrate - 1;.
> + result &= 0x000003FF;.
> + result |= CAN_BIT_TIME[nominal_time];.
> +.
> + /* Enter reset mode */.
> + CANx->MOD = 0x01;.
> + /* Set bit timing */.
> + CANx->BTR = result;.
> +.
> + /* Return to normal operating */.
> + CANx->MOD = 0;.
> +}.
> +.
> +/********************************************************************//**.
> + * @brief Initialize CAN peripheral with given baudrate.
> + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @param[in] baudrate: the value of CAN baudrate will be set (bps).
> + * @return void.
> + *********************************************************************/.
> +void CAN_Init(LPC_CAN_TypeDef *CANx, uint32_t baudrate).
> +{.
> + uint32_t temp;.
> + uint16_t i;.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> +.
> + if(CANx == LPC_CAN1).
> + {.
> + /* Turn on power and clock for CAN1 */.
> + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN1, ENABLE);.
> + /* Set clock divide for CAN1 */.
> + CLKPWR_SetPCLKDiv (CLKPWR_PCONP_PCAN1, CLKPWR_PCLKSEL_CCLK_DIV_4);.
> + }.
> + else.
> + {.
> + /* Turn on power and clock for CAN1 */.
> + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN2, ENABLE);.
> + /* Set clock divide for CAN2 */.
> + CLKPWR_SetPCLKDiv (CLKPWR_PCONP_PCAN2, CLKPWR_PCLKSEL_CCLK_DIV_4);.
> + }.
> +.
> + CANx->MOD = 1; // Enter Reset Mode.
> + CANx->IER = 0; // Disable All CAN Interrupts.
> + CANx->GSR = 0;.
> + /* Request command to release Rx, Tx buffer and clear data overrun */.
> + //CANx->CMR = CAN_CMR_AT | CAN_CMR_RRB | CAN_CMR_CDO;.
> + CANx->CMR = (1<<1)|(1<<2)|(1<<3);.
> + /* Read to clear interrupt pending in interrupt capture register */.
> + temp = CANx->ICR;.
> + CANx->MOD = 0;// Return Normal operating.
> +.
> + //Reset CANAF value.
> + LPC_CANAF->AFMR = 0x01;.
> +.
> + //clear ALUT RAM.
> + for (i = 0; i < 512; i++) {.
> + LPC_CANAF_RAM->mask[i] = 0x00;.
> + }.
> +.
> + LPC_CANAF->SFF_sa = 0x00;.
> + LPC_CANAF->SFF_GRP_sa = 0x00;.
> + LPC_CANAF->EFF_sa = 0x00;.
> + LPC_CANAF->EFF_GRP_sa = 0x00;.
> + LPC_CANAF->ENDofTable = 0x00;.
> +.
> + LPC_CANAF->AFMR = 0x00;.
> + /* Set baudrate */.
> + CAN_SetBaudRate (CANx, baudrate);.
> +}.
> +/********************************************************************//**.
> + * @brief CAN deInit.
> + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @return void.
> + *********************************************************************/.
> +void CAN_DeInit(LPC_CAN_TypeDef *CANx).
> +{.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> +.
> + if(CANx == LPC_CAN1).
> + {.
> + /* Turn on power and clock for CAN1 */.
> + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN1, DISABLE);.
> + }.
> + else.
> + {.
> + /* Turn on power and clock for CAN1 */.
> + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN2, DISABLE);.
> + }.
> +}.
> +/********************************************************************//**.
> + * @brief Setup Acceptance Filter Look-Up Table.
> + * @param[in] CANAFx pointer to LPC_CANAF_TypeDef, should be: CANAF.
> + * @param[in] AFSection the pointer to AF_SectionDef struct.
> + * It contain information about 5 sections will be install in AFLUT.
> + * @return CAN Error could be:.
> + * - CAN_OBJECTS_FULL_ERROR: No more rx or tx objects available.
> + * - CAN_AF_ENTRY_ERROR: table error-violation of ascending numerical order.
> + * - CAN_OK: ID is added into table successfully.
> + *********************************************************************/.
> +CAN_ERROR CAN_SetupAFLUT(LPC_CANAF_TypeDef* CANAFx, AF_SectionDef* AFSection).
> +{.
> + uint8_t ctrl1,ctrl2;.
> + uint8_t dis1, dis2;.
> + uint16_t SID, SID_temp,i, count = 0;.
> + uint32_t EID, EID_temp, entry, buf;.
> + uint16_t lowerSID, upperSID;.
> + uint32_t lowerEID, upperEID;.
> +.
> + CHECK_PARAM(PARAM_CANAFx(CANAFx));.
> + CANAFx->AFMR = 0x01;.
> +.
> +/***** setup FullCAN Table *****/.
> + if(AFSection->FullCAN_Sec == NULL).
> + {.
> + FULLCAN_ENABLE = DISABLE;.
> + }.
> + else.
> + {.
> + FULLCAN_ENABLE = ENABLE;.
> + for(i=0;i<(AFSection->FC_NumEntry);i++).
> + {.
> + if(count + 1 > 64).
> + {.
> + return CAN_OBJECTS_FULL_ERROR;.
> + }.
> + ctrl1 = AFSection->FullCAN_Sec->controller;.
> + SID = AFSection->FullCAN_Sec->id_11;.
> + dis1 = AFSection->FullCAN_Sec->disable;.
> +.
> + CHECK_PARAM(PARAM_CTRL(ctrl1));.
> + CHECK_PARAM(PARAM_ID_11(SID));.
> + CHECK_PARAM(PARAM_MSG_DISABLE(dis1));.
> + entry = 0x00; //reset entry value.
> + if((CANAF_FullCAN_cnt & 0x00000001)==0).
> + {.
> + if(count!=0x00).
> + {.
> + buf = LPC_CANAF_RAM->mask[count-1];.
> + SID_temp = (buf & 0x000003FF);.
> + if(SID_temp > SID).
> + {.
> + return CAN_AF_ENTRY_ERROR;.
> + }.
> + }.
> + entry = (ctrl1<<29)|(dis1<<28)|(SID<<16)|(1<<27);.
> + LPC_CANAF_RAM->mask[count] &= 0x0000FFFF;.
> + LPC_CANAF_RAM->mask[count] |= entry;.
> + CANAF_FullCAN_cnt++;.
> + }.
> + else.
> + {.
> + buf = LPC_CANAF_RAM->mask[count];.
> + SID_temp = (buf & 0x03FF0000)>>16;.
> + if(SID_temp > SID).
> + {.
> + return CAN_AF_ENTRY_ERROR;.
> + }.
> + entry = (ctrl1<<13)|(dis1<<12)|(SID<<0)|(1<<11);.
> + LPC_CANAF_RAM->mask[count] &= 0xFFFF0000;.
> + LPC_CANAF_RAM->mask[count]|= entry;.
> + count++;.
> + CANAF_FullCAN_cnt++;.
> + }.
> + AFSection->FullCAN_Sec = (FullCAN_Entry *)((uint32_t)(AFSection->FullCAN_Sec)+ sizeof(FullCAN_Entry));.
> + }.
> + }.
> +.
> +/***** Setup Explicit Standard Frame Format Section *****/.
> + if(AFSection->SFF_Sec != NULL).
> + {.
> + for(i=0;i<(AFSection->SFF_NumEntry);i++).
> + {.
> + if(count + 1 > 512).
> + {.
> + return CAN_OBJECTS_FULL_ERROR;.
> + }.
> + ctrl1 = AFSection->SFF_Sec->controller;.
> + SID = AFSection->SFF_Sec->id_11;.
> + dis1 = AFSection->SFF_Sec->disable;.
> +.
> + //check parameter.
> + CHECK_PARAM(PARAM_CTRL(ctrl1));.
> + CHECK_PARAM(PARAM_ID_11(SID));.
> + CHECK_PARAM(PARAM_MSG_DISABLE(dis1));.
> +.
> + entry = 0x00; //reset entry value.
> + if((CANAF_std_cnt & 0x00000001)==0).
> + {.
> + if(CANAF_std_cnt !=0 ).
> + {.
> + buf = LPC_CANAF_RAM->mask[count-1];.
> + SID_temp = (buf & 0x00000FFF);.
> + if(SID_temp > SID).
> + {.
> + return CAN_AF_ENTRY_ERROR;.
> + }.
> + }.
> + entry = (ctrl1<<29)|(dis1<<28)|(SID<<16);.
> + LPC_CANAF_RAM->mask[count] &= 0x0000FFFF;.
> + LPC_CANAF_RAM->mask[count] |= entry;.
> + CANAF_std_cnt++;.
> + }.
> + else.
> + {.
> + buf = LPC_CANAF_RAM->mask[count];.
> + SID_temp = (buf & 0x0FFF0000)>>16;.
> + if(SID_temp > SID).
> + {.
> + return CAN_AF_ENTRY_ERROR;.
> + }.
> + entry = (ctrl1<<13)|(dis1<<12)|(SID<<0);.
> + LPC_CANAF_RAM->mask[count] &= 0xFFFF0000;.
> + LPC_CANAF_RAM->mask[count] |= entry;.
> + count++;.
> + CANAF_std_cnt++;.
> + }.
> + AFSection->SFF_Sec = (SFF_Entry *)((uint32_t)(AFSection->SFF_Sec)+ sizeof(SFF_Entry));.
> + }.
> + }.
> +.
> +/***** Setup Group of Standard Frame Format Identifier Section *****/.
> + if(AFSection->SFF_GPR_Sec != NULL).
> + {.
> + for(i=0;i<(AFSection->SFF_GPR_NumEntry);i++).
> + {.
> + if(count + 1 > 512).
> + {.
> + return CAN_OBJECTS_FULL_ERROR;.
> + }.
> + ctrl1 = AFSection->SFF_GPR_Sec->controller1;.
> + ctrl2 = AFSection->SFF_GPR_Sec->controller2;.
> + dis1 = AFSection->SFF_GPR_Sec->disable1;.
> + dis2 = AFSection->SFF_GPR_Sec->disable2;.
> + lowerSID = AFSection->SFF_GPR_Sec->lowerID;.
> + upperSID = AFSection->SFF_GPR_Sec->upperID;.
> +.
> + /* check parameter */.
> + CHECK_PARAM(PARAM_CTRL(ctrl1));.
> + CHECK_PARAM(PARAM_CTRL(ctrl2));.
> + CHECK_PARAM(PARAM_MSG_DISABLE(dis1));.
> + CHECK_PARAM(PARAM_MSG_DISABLE(dis2));.
> + CHECK_PARAM(PARAM_ID_11(lowerSID));.
> + CHECK_PARAM(PARAM_ID_11(upperSID));.
> +.
> + entry = 0x00;.
> + if(CANAF_gstd_cnt!=0).
> + {.
> + buf = LPC_CANAF_RAM->mask[count-1];.
> + SID_temp = buf & 0x00000FFF;.
> + if(SID_temp > lowerSID).
> + {.
> + return CAN_AF_ENTRY_ERROR;.
> + }.
> + }.
> + entry = (ctrl1 << 29)|(dis1 << 28)|(lowerSID << 16)| \.
> + (ctrl2 << 13)|(dis2 << 12)|(upperSID << 0);.
> + LPC_CANAF_RAM->mask[count] = entry;.
> + CANAF_gstd_cnt++;.
> + count++;.
> + AFSection->SFF_GPR_Sec = (SFF_GPR_Entry *)((uint32_t)(AFSection->SFF_GPR_Sec)+ sizeof(SFF_GPR_Entry));.
> + }.
> + }.
> +.
> +/***** Setup Explicit Extend Frame Format Identifier Section *****/.
> + if(AFSection->EFF_Sec != NULL).
> + {.
> + for(i=0;i<(AFSection->EFF_NumEntry);i++).
> + {.
> + if(count + 1 > 512).
> + {.
> + return CAN_OBJECTS_FULL_ERROR;.
> + }.
> + EID = AFSection->EFF_Sec->ID_29;.
> + ctrl1 = AFSection->EFF_Sec->controller;.
> +.
> + // check parameter.
> + CHECK_PARAM(PARAM_ID_29(EID));.
> + CHECK_PARAM(PARAM_CTRL(ctrl1));.
> +.
> + entry = 0x00; //reset entry value.
> + if(CANAF_ext_cnt != 0).
> + {.
> + buf = LPC_CANAF_RAM->mask[count-1];.
> + EID_temp = buf & 0x0FFFFFFF;.
> + if(EID_temp > EID).
> + {.
> + return CAN_AF_ENTRY_ERROR;.
> + }.
> + }.
> + entry = (ctrl1 << 29)|(EID << 0);.
> + LPC_CANAF_RAM->mask[count] = entry;.
> + CANAF_ext_cnt ++;.
> + count++;.
> + AFSection->EFF_Sec = (EFF_Entry *)((uint32_t)(AFSection->EFF_Sec)+ sizeof(EFF_Entry));.
> + }.
> + }.
> +.
> +/***** Setup Group of Extended Frame Format Identifier Section *****/.
> + if(AFSection->EFF_GPR_Sec != NULL).
> + {.
> + for(i=0;i<(AFSection->EFF_GPR_NumEntry);i++).
> + {.
> + if(count + 2 > 512).
> + {.
> + return CAN_OBJECTS_FULL_ERROR;.
> + }.
> + ctrl1 = AFSection->EFF_GPR_Sec->controller1;.
> + ctrl2 = AFSection->EFF_GPR_Sec->controller2;.
> + lowerEID = AFSection->EFF_GPR_Sec->lowerEID;.
> + upperEID = AFSection->EFF_GPR_Sec->upperEID;.
> +.
> + //check parameter.
> + CHECK_PARAM(PARAM_CTRL(ctrl1));.
> + CHECK_PARAM(PARAM_CTRL(ctrl2));.
> + CHECK_PARAM(PARAM_ID_29(lowerEID));.
> + CHECK_PARAM(PARAM_ID_29(upperEID));.
> +.
> + entry = 0x00;.
> + if(CANAF_gext_cnt != 0).
> + {.
> + buf = LPC_CANAF_RAM->mask[count-1];.
> + EID_temp = buf & 0x0FFFFFFF;.
> + if(EID_temp > lowerEID).
> + {.
> + return CAN_AF_ENTRY_ERROR;.
> + }.
> + }.
> + entry = (ctrl1 << 29)|(lowerEID << 0);.
> + LPC_CANAF_RAM->mask[count++] = entry;.
> + entry = (ctrl2 << 29)|(upperEID << 0);.
> + LPC_CANAF_RAM->mask[count++] = entry;.
> + CANAF_gext_cnt++;.
> + AFSection->EFF_GPR_Sec = (EFF_GPR_Entry *)((uint32_t)(AFSection->EFF_GPR_Sec)+ sizeof(EFF_GPR_Entry));.
> + }.
> + }.
> + //update address values.
> + LPC_CANAF->SFF_sa = ((CANAF_FullCAN_cnt + 1)>>1)<<2;.
> + LPC_CANAF->SFF_GRP_sa = LPC_CANAF->SFF_sa + (((CANAF_std_cnt+1)>>1)<< 2);.
> + LPC_CANAF->EFF_sa = LPC_CANAF->SFF_GRP_sa + (CANAF_gstd_cnt << 2);.
> + LPC_CANAF->EFF_GRP_sa = LPC_CANAF->EFF_sa + (CANAF_ext_cnt << 2);.
> + LPC_CANAF->ENDofTable = LPC_CANAF->EFF_GRP_sa + (CANAF_gext_cnt << 3);.
> +.
> + if(FULLCAN_ENABLE == DISABLE).
> + {.
> + LPC_CANAF->AFMR = 0x00; // Normal mode.
> + }.
> + else.
> + {.
> + LPC_CANAF->AFMR = 0x04;.
> + }.
> + return CAN_OK;.
> +}.
> +/********************************************************************//**.
> + * @brief Add Explicit ID into AF Look-Up Table dynamically..
> + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @param[in] id: The ID of entry will be added.
> + * @param[in] format: is the type of ID Frame Format, should be:.
> + * - STD_ID_FORMAT: 11-bit ID value.
> + * - EXT_ID_FORMAT: 29-bit ID value.
> + * @return CAN Error, could be:.
> + * - CAN_OBJECTS_FULL_ERROR: No more rx or tx objects available.
> + * - CAN_ID_EXIT_ERROR: ID exited in table.
> + * - CAN_OK: ID is added into table successfully.
> + *********************************************************************/.
> +CAN_ERROR CAN_LoadExplicitEntry(LPC_CAN_TypeDef* CANx, uint32_t id, CAN_ID_FORMAT_Type format).
> +{.
> + uint32_t tmp0 = 0;.
> + uint32_t buf0=0, buf1=0;.
> + int16_t cnt1=0, cnt2=0, bound1=0, total=0;.
> +.
> +.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> + CHECK_PARAM(PARAM_ID_FORMAT(format));.
> +.
> + if (CANx == LPC_CAN1).
> + {.
> + tmp0 = 0;.
> + }.
> + else if (CANx == LPC_CAN2).
> + {.
> + tmp0 = 1;.
> + }.
> +.
> + /* Acceptance Filter Memory full - return */.
> + total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \.
> + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1);.
> + if (total >= 512){ //don't have enough space.
> + return CAN_OBJECTS_FULL_ERROR;.
> + }.
> +.
> + /* Setup Acceptance Filter Configuration.
> + Acceptance Filter Mode Register = Off */.
> + LPC_CANAF->AFMR = 0x00000001;.
> +.
> +/*********** Add Explicit Standard Identifier Frame Format entry *********/.
> + if(format == STD_ID_FORMAT).
> + {.
> + id &= 0x07FF;.
> + id |= (tmp0 << 13); /* Add controller number */.
> + /* Move all remaining sections one place up.
> + if new entry will increase FullCAN list */.
> + if ((CANAF_std_cnt & 0x0001) == 0).
> + {.
> + cnt1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1);.
> + bound1 = total - cnt1;.
> + buf0 = LPC_CANAF_RAM->mask[cnt1];.
> + while(bound1--).
> + {.
> + cnt1++;.
> + buf1 = LPC_CANAF_RAM->mask[cnt1];.
> + LPC_CANAF_RAM->mask[cnt1] = buf0;.
> + buf0 = buf1;.
> + }.
> + }.
> + if (CANAF_std_cnt == 0).
> + {.
> + cnt2 = (CANAF_FullCAN_cnt + 1)>>1;.
> + /* For entering first ID */.
> + LPC_CANAF_RAM->mask[cnt2] = 0x0000FFFF | (id << 16);.
> + }.
> + else if (CANAF_std_cnt == 1).
> + {.
> + cnt2 = (CANAF_FullCAN_cnt + 1)>>1;.
> + /* For entering second ID */.
> + if ((LPC_CANAF_RAM->mask[cnt2] >> 16) > id).
> + {.
> + LPC_CANAF_RAM->mask[cnt2] = (LPC_CANAF_RAM->mask[cnt2] >> 16) | (id << 16);.
> + }.
> + else.
> + {.
> + LPC_CANAF_RAM->mask[cnt2] = (LPC_CANAF_RAM->mask[cnt2] & 0xFFFF0000) | id;.
> + }.
> + }.
> + else.
> + {.
> + /* Find where to insert new ID */.
> + cnt1 = (CANAF_FullCAN_cnt+1)>>1;.
> + cnt2 = CANAF_std_cnt;.
> + bound1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1);.
> + while (cnt1 < bound1).
> + {.
> + /* Loop through standard existing IDs */.
> + if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id).
> + {.
> + cnt2 = cnt1 * 2;.
> + break;.
> + }.
> +.
> + if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id).
> + {.
> + cnt2 = cnt1 * 2 + 1;.
> + break;.
> + }.
> +.
> + cnt1++;.
> + }.
> + /* cnt1 = U32 where to insert new ID */.
> + /* cnt2 = U16 where to insert new ID */.
> +.
> + if (cnt1 == bound1).
> + {.
> + /* Adding ID as last entry */.
> + /* Even number of IDs exists */.
> + if ((CANAF_std_cnt & 0x0001) == 0).
> + {.
> + LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16);.
> + }.
> + /* Odd number of IDs exists */.
> + else.
> + {.
> + LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id;.
> + }.
> + }.
> + else.
> + {.
> + buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */.
> + if ((cnt2 & 0x0001) == 0).
> + {.
> + /* Insert new mask to even address*/.
> + buf1 = (id << 16) | (buf0 >> 16);.
> + }.
> + else.
> + {.
> + /* Insert new mask to odd address */.
> + buf1 = (buf0 & 0xFFFF0000) | id;.
> + }.
> + LPC_CANAF_RAM->mask[cnt1] = buf1;/* Insert mask */.
> + bound1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1)-1;.
> + /* Move all remaining standard mask entries one place up */.
> + while (cnt1 < bound1).
> + {.
> + cnt1++;.
> + buf1 = LPC_CANAF_RAM->mask[cnt1];.
> + LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16);.
> + buf0 = buf1;.
> + }.
> +.
> + if ((CANAF_std_cnt & 0x0001) == 0).
> + {.
> + /* Even number of IDs exists */.
> + LPC_CANAF_RAM->mask[cnt1+1] = (buf0 <<16) |(0x0000FFFF);.
> + }.
> + }.
> + }.
> + CANAF_std_cnt++;.
> + //update address values.
> + LPC_CANAF->SFF_GRP_sa +=0x04 ;.
> + LPC_CANAF->EFF_sa +=0x04 ;.
> + LPC_CANAF->EFF_GRP_sa +=0x04;.
> + LPC_CANAF->ENDofTable +=0x04;.
> + }.
> +.
> +/*********** Add Explicit Extended Identifier Frame Format entry *********/.
> + else.
> + {.
> + /* Add controller number */.
> + id |= (tmp0) << 29;.
> +.
> + cnt1 = ((CANAF_FullCAN_cnt+1)>>1)+(((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt);.
> + cnt2 = 0;.
> + while (cnt2 < CANAF_ext_cnt).
> + {.
> + /* Loop through extended existing masks*/.
> + if (LPC_CANAF_RAM->mask[cnt1] > id).
> + {.
> + break;.
> + }.
> + cnt1++;/* cnt1 = U32 where to insert new mask */.
> + cnt2++;.
> + }.
> +.
> + buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */.
> + LPC_CANAF_RAM->mask[cnt1] = id; /* Insert mask */.
> +.
> + CANAF_ext_cnt++;.
> +.
> + bound1 = total;.
> + /* Move all remaining extended mask entries one place up*/.
> + while (cnt2 < bound1).
> + {.
> + cnt1++;.
> + cnt2++;.
> + buf1 = LPC_CANAF_RAM->mask[cnt1];.
> + LPC_CANAF_RAM->mask[cnt1] = buf0;.
> + buf0 = buf1;.
> + }.
> + /* update address values */.
> + LPC_CANAF->EFF_GRP_sa += 4;.
> + LPC_CANAF->ENDofTable += 4;.
> + }.
> + if(CANAF_FullCAN_cnt == 0) //not use FullCAN mode.
> + {.
> + LPC_CANAF->AFMR = 0x00;//not use FullCAN mode.
> + }.
> + else.
> + {.
> + LPC_CANAF->AFMR = 0x04;.
> + }.
> +.
> + return CAN_OK;.
> +}.
> +.
> +/********************************************************************//**.
> + * @brief Load FullCAN entry into AFLUT.
> + * @param[in] CANx: CAN peripheral selected, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @param[in] id: identifier of entry that will be added.
> + * @return CAN_ERROR, could be:.
> + * - CAN_OK: loading is successful.
> + * - CAN_ID_EXIT_ERROR: ID exited in FullCAN Section.
> + * - CAN_OBJECTS_FULL_ERROR: no more space available.
> + *********************************************************************/.
> +CAN_ERROR CAN_LoadFullCANEntry (LPC_CAN_TypeDef* CANx, uint16_t id).
> +{.
> + uint32_t ctrl0 = 0;.
> + uint32_t buf0=0, buf1=0, buf2=0;.
> + uint32_t tmp0=0, tmp1=0, tmp2=0;.
> + int16_t cnt1=0, cnt2=0, bound1=0, total=0;.
> +.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> +.
> + if (CANx == LPC_CAN1).
> + {.
> + ctrl0 = 0;.
> + }.
> + else if (CANx == LPC_CAN2).
> + {.
> + ctrl0 = 1;.
> + }.
> +.
> + /* Acceptance Filter Memory full - return */.
> + total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \.
> + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1);.
> + //don't have enough space for this fullCAN Entry and its Object(3*32 bytes).
> + if ((total >=508)||(CANAF_FullCAN_cnt>=64)){.
> + return CAN_OBJECTS_FULL_ERROR;.
> + }.
> + /* Setup Acceptance Filter Configuration.
> + Acceptance Filter Mode Register = Off */.
> + LPC_CANAF->AFMR = 0x00000001;.
> +.
> + /* Add mask for standard identifiers */.
> + id &= 0x07FF;.
> + id |= (ctrl0 << 13) | (1 << 11); /* Add controller number */.
> +// total = ((CANAF_std_cnt + 1) >> 1)+ CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1);.
> + /* Move all remaining sections one place up.
> + if new entry will increase FullCAN list */.
> + if (((CANAF_FullCAN_cnt & 0x0001) == 0)&&(total!=0)).
> + {.
> + //then remove remaining section.
> + cnt1 = (CANAF_FullCAN_cnt >> 1);.
> + bound1 = total;.
> + buf0 = LPC_CANAF_RAM->mask[cnt1];.
> +.
> + while (bound1--).
> + {.
> + cnt1++;.
> + buf1 = LPC_CANAF_RAM->mask[cnt1];.
> + LPC_CANAF_RAM->mask[cnt1] = buf0;.
> + buf0 = buf1;.
> + }.
> + }.
> + if (CANAF_FullCAN_cnt == 0).
> + {.
> + /* For entering first ID */.
> + LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16);.
> + }.
> + else if (CANAF_FullCAN_cnt == 1).
> + {.
> + /* For entering second ID */.
> + if ((LPC_CANAF_RAM->mask[0] >> 16) > id).
> + {.
> + LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16);.
> + }.
> + else.
> + {.
> + LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id;.
> + }.
> + }.
> + else.
> + {.
> + /* Find where to insert new ID */.
> + cnt1 = 0;.
> + cnt2 = CANAF_FullCAN_cnt;.
> + bound1 = (CANAF_FullCAN_cnt - 1) >> 1;.
> + while (cnt1 <= bound1).
> + {.
> + /* Loop through standard existing IDs */.
> + if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id).
> + {.
> + cnt2 = cnt1 * 2;.
> + break;.
> + }.
> +.
> + if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id).
> + {.
> + cnt2 = cnt1 * 2 + 1;.
> + break;.
> + }.
> +.
> + cnt1++;.
> + }.
> + /* cnt1 = U32 where to insert new ID */.
> + /* cnt2 = U16 where to insert new ID */.
> +.
> + if (cnt1 > bound1).
> + {.
> + /* Adding ID as last entry */.
> + /* Even number of IDs exists */.
> + if ((CANAF_FullCAN_cnt & 0x0001) == 0).
> + {.
> + LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16);.
> + }.
> + /* Odd number of IDs exists */.
> + else.
> + {.
> + LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id;.
> + }.
> + }.
> + else.
> + {.
> + buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */.
> + if ((cnt2 & 0x0001) == 0).
> + {.
> + /* Insert new mask to even address*/.
> + buf1 = (id << 16) | (buf0 >> 16);.
> + }.
> + else.
> + {.
> + /* Insert new mask to odd address */.
> + buf1 = (buf0 & 0xFFFF0000) | id;.
> + }.
> + LPC_CANAF_RAM->mask[cnt1] = buf1;/* Insert mask */.
> + bound1 = CANAF_FullCAN_cnt >> 1;.
> + /* Move all remaining standard mask entries one place up */.
> + while (cnt1 < bound1).
> + {.
> + cnt1++;.
> + buf1 = LPC_CANAF_RAM->mask[cnt1];.
> + LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16);.
> + buf0 = buf1;.
> + }.
> +.
> + if ((CANAF_FullCAN_cnt & 0x0001) == 0).
> + {.
> + /* Even number of IDs exists */.
> + LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000).
> + | (0x0000FFFF);.
> + }.
> + }.
> + }.
> + //restruct FulCAN Object Section.
> + bound1 = CANAF_FullCAN_cnt - cnt2;.
> + cnt1 = total - (CANAF_FullCAN_cnt)*3 + cnt2*3 + 1;.
> + buf0 = LPC_CANAF_RAM->mask[cnt1];.
> + buf1 = LPC_CANAF_RAM->mask[cnt1+1];.
> + buf2 = LPC_CANAF_RAM->mask[cnt1+2];.
> + LPC_CANAF_RAM->mask[cnt1]=LPC_CANAF_RAM->mask[cnt1+1]= LPC_CANAF_RAM->mask[cnt1+2]=0x00;.
> + cnt1+=3;.
> + while(bound1--).
> + {.
> + tmp0 = LPC_CANAF_RAM->mask[cnt1];.
> + tmp1 = LPC_CANAF_RAM->mask[cnt1+1];.
> + tmp2 = LPC_CANAF_RAM->mask[cnt1+2];.
> + LPC_CANAF_RAM->mask[cnt1]= buf0;.
> + LPC_CANAF_RAM->mask[cnt1+1]= buf1;.
> + LPC_CANAF_RAM->mask[cnt1+2]= buf2;.
> + buf0 = tmp0;.
> + buf1 = tmp1;.
> + buf2 = tmp2;.
> + cnt1+=3;.
> + }.
> + CANAF_FullCAN_cnt++;.
> + //update address values.
> + LPC_CANAF->SFF_sa +=0x04;.
> + LPC_CANAF->SFF_GRP_sa +=0x04 ;.
> + LPC_CANAF->EFF_sa +=0x04 ;.
> + LPC_CANAF->EFF_GRP_sa +=0x04;.
> + LPC_CANAF->ENDofTable +=0x04;.
> +.
> + LPC_CANAF->AFMR = 0x04;.
> + return CAN_OK;.
> +}.
> +.
> +/********************************************************************//**.
> + * @brief Load Group entry into AFLUT.
> + * @param[in] CANx: CAN peripheral selected, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @param[in] lowerID, upperID: lower and upper identifier of entry.
> + * @param[in] format: type of ID format, should be:.
> + * - STD_ID_FORMAT: Standard ID format (11-bit value).
> + * - EXT_ID_FORMAT: Extended ID format (29-bit value).
> + * @return CAN_ERROR, could be:.
> + * - CAN_OK: loading is successful.
> + * - CAN_CONFLICT_ID_ERROR: Conflict ID occurs.
> + * - CAN_OBJECTS_FULL_ERROR: no more space available.
> + *********************************************************************/.
> +CAN_ERROR CAN_LoadGroupEntry(LPC_CAN_TypeDef* CANx, uint32_t lowerID, \.
> + uint32_t upperID, CAN_ID_FORMAT_Type format).
> +{.
> + uint16_t tmp = 0;.
> + uint32_t buf0, buf1, entry1, entry2, LID,UID;.
> + int16_t cnt1, bound1, total;.
> +.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> + CHECK_PARAM(PARAM_ID_FORMAT(format));.
> +.
> + if(lowerID > upperID) return CAN_CONFLICT_ID_ERROR;.
> + if(CANx == LPC_CAN1).
> + {.
> + tmp = 0;.
> + }.
> + else.
> + {.
> + tmp = 1;.
> + }.
> +.
> + total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \.
> + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1);.
> +.
> + /* Setup Acceptance Filter Configuration.
> + Acceptance Filter Mode Register = Off */.
> + LPC_CANAF->AFMR = 0x00000001;.
> +.
> +/*********Add Group of Standard Identifier Frame Format************/.
> + if(format == STD_ID_FORMAT).
> + {.
> + if ((total >= 512)){//don't have enough space.
> + return CAN_OBJECTS_FULL_ERROR;.
> + }.
> + lowerID &=0x7FF; //mask ID.
> + upperID &=0x7FF;.
> + entry1 = (tmp << 29)|(lowerID << 16)|(tmp << 13)|(upperID << 0);.
> + cnt1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1);.
> +.
> + //if this is the first Group standard ID entry.
> + if(CANAF_gstd_cnt == 0).
> + {.
> + LPC_CANAF_RAM->mask[cnt1] = entry1;.
> + }.
> + else.
> + {.
> + //find the position to add new Group entry.
> + bound1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt;.
> + while(cnt1 < bound1).
> + {.
> + buf0 = LPC_CANAF_RAM->mask[cnt1];.
> + LID = (buf0 >> 16)&0x7FF;.
> + UID = buf0 & 0x7FF;.
> + if (upperID <= LID).
> + {.
> + //add new entry before this entry.
> + LPC_CANAF_RAM->mask[cnt1] = entry1;.
> + break;.
> + }.
> + else if (lowerID >= UID).
> + {.
> + //load next entry to compare.
> + cnt1 ++;.
> + }.
> + else.
> + return CAN_CONFLICT_ID_ERROR;.
> + }.
> + if(cnt1 >= bound1).
> + {.
> + //add new entry at the last position in this list.
> + buf0 = LPC_CANAF_RAM->mask[cnt1];.
> + LPC_CANAF_RAM->mask[cnt1] = entry1;.
> + }.
> +.
> + //remove all remaining entry of this section one place up.
> + bound1 = total - cnt1;.
> + while(bound1--).
> + {.
> + cnt1++;.
> + buf1 = LPC_CANAF_RAM->mask[cnt1];.
> + LPC_CANAF_RAM->mask[cnt1] = buf0;.
> + buf0 = buf1;.
> + }.
> + }.
> + CANAF_gstd_cnt++;.
> + //update address values.
> + LPC_CANAF->EFF_sa +=0x04 ;.
> + LPC_CANAF->EFF_GRP_sa +=0x04;.
> + LPC_CANAF->ENDofTable +=0x04;.
> + }.
> +.
> +.
> +/*********Add Group of Extended Identifier Frame Format************/.
> + else.
> + {.
> + if ((total >= 511)){//don't have enough space.
> + return CAN_OBJECTS_FULL_ERROR;.
> + }.
> + lowerID &= 0x1FFFFFFF; //mask ID.
> + upperID &= 0x1FFFFFFF;.
> + entry1 = (tmp << 29)|(lowerID << 0);.
> + entry2 = (tmp << 29)|(upperID << 0);.
> +.
> + cnt1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt + CANAF_ext_cnt;.
> + //if this is the first Group standard ID entry.
> + if(CANAF_gext_cnt == 0).
> + {.
> + LPC_CANAF_RAM->mask[cnt1] = entry1;.
> + LPC_CANAF_RAM->mask[cnt1+1] = entry2;.
> + }.
> + else.
> + {.
> + //find the position to add new Group entry.
> + bound1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt \.
> + + CANAF_ext_cnt + (CANAF_gext_cnt<<1);.
> + while(cnt1 < bound1).
> + {.
> + buf0 = LPC_CANAF_RAM->mask[cnt1];.
> + buf1 = LPC_CANAF_RAM->mask[cnt1+1];.
> + LID = buf0 & 0x1FFFFFFF; //mask ID.
> + UID = buf1 & 0x1FFFFFFF;.
> + if (upperID <= LID).
> + {.
> + //add new entry before this entry.
> + LPC_CANAF_RAM->mask[cnt1] = entry1;.
> + LPC_CANAF_RAM->mask[++cnt1] = entry2;.
> + break;.
> + }.
> + else if (lowerID >= UID).
> + {.
> + //load next entry to compare.
> + cnt1 +=2;.
> + }.
> + else.
> + return CAN_CONFLICT_ID_ERROR;.
> + }.
> + if(cnt1 >= bound1).
> + {.
> + //add new entry at the last position in this list.
> + buf0 = LPC_CANAF_RAM->mask[cnt1];.
> + buf1 = LPC_CANAF_RAM->mask[cnt1+1];.
> + LPC_CANAF_RAM->mask[cnt1] = entry1;.
> + LPC_CANAF_RAM->mask[++cnt1] = entry2;.
> + }.
> + //remove all remaining entry of this section two place up.
> + bound1 = total - cnt1 + 1;.
> + cnt1++;.
> + while(bound1>0).
> + {.
> + entry1 = LPC_CANAF_RAM->mask[cnt1];.
> + entry2 = LPC_CANAF_RAM->mask[cnt1+1];.
> + LPC_CANAF_RAM->mask[cnt1] = buf0;.
> + LPC_CANAF_RAM->mask[cnt1+1] = buf1;.
> + buf0 = entry1;.
> + buf1 = entry2;.
> + cnt1 +=2;.
> + bound1 -=2;.
> + }.
> + }.
> + CANAF_gext_cnt++;.
> + //update address values.
> + LPC_CANAF->ENDofTable +=0x08;.
> + }.
> + LPC_CANAF->AFMR = 0x04;.
> + return CAN_OK;.
> +}.
> +.
> +/********************************************************************//**.
> + * @brief Remove AFLUT entry (FullCAN entry and Explicit Standard entry).
> + * @param[in] EntryType: the type of entry that want to remove, should be:.
> + * - FULLCAN_ENTRY.
> + * - EXPLICIT_STANDARD_ENTRY.
> + * - GROUP_STANDARD_ENTRY.
> + * - EXPLICIT_EXTEND_ENTRY.
> + * - GROUP_EXTEND_ENTRY.
> + * @param[in] position: the position of this entry in its section.
> + * Note: the first position is 0.
> + * @return CAN_ERROR, could be:.
> + * - CAN_OK: removing is successful.
> + * - CAN_ENTRY_NOT_EXIT_ERROR: entry want to remove is not exit.
> + *********************************************************************/.
> +CAN_ERROR CAN_RemoveEntry(AFLUT_ENTRY_Type EntryType, uint16_t position).
> +{.
> + uint16_t cnt, bound, total;.
> + uint32_t buf0, buf1;.
> + CHECK_PARAM(PARAM_AFLUT_ENTRY_TYPE(EntryType));.
> + CHECK_PARAM(PARAM_POSITION(position));.
> +.
> + /* Setup Acceptance Filter Configuration.
> + Acceptance Filter Mode Register = Off */.
> + LPC_CANAF->AFMR = 0x00000001;.
> + total = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt + 1) >> 1) + \.
> + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1);.
> +.
> +.
> +/************** Remove FullCAN Entry *************/.
> + if(EntryType == FULLCAN_ENTRY).
> + {.
> + if((CANAF_FullCAN_cnt==0)||(position >= CANAF_FullCAN_cnt)).
> + {.
> + return CAN_ENTRY_NOT_EXIT_ERROR;.
> + }.
> + else.
> + {.
> + cnt = position >> 1;.
> + buf0 = LPC_CANAF_RAM->mask[cnt];.
> + bound = (CANAF_FullCAN_cnt - position -1)>>1;.
> + if((position & 0x0001) == 0) //event position.
> + {.
> + while(bound--).
> + {.
> + //remove all remaining FullCAN entry one place down.
> + buf1 = LPC_CANAF_RAM->mask[cnt+1];.
> + LPC_CANAF_RAM->mask[cnt] = (buf1 >> 16) | (buf0 << 16);.
> + buf0 = buf1;.
> + cnt++;.
> + }.
> + }.
> + else //odd position.
> + {.
> + while(bound--).
> + {.
> + //remove all remaining FullCAN entry one place down.
> + buf1 = LPC_CANAF_RAM->mask[cnt+1];.
> + LPC_CANAF_RAM->mask[cnt] = (buf0 & 0xFFFF0000)|(buf1 >> 16);.
> + LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+1] << 16;.
> + buf0 = buf1<<16;.
> + cnt++;.
> + }.
> + }.
> + if((CANAF_FullCAN_cnt & 0x0001) == 0).
> + {.
> + if((position & 0x0001)==0).
> + LPC_CANAF_RAM->mask[cnt] = (buf0 << 16) | (0x0000FFFF);.
> + else.
> + LPC_CANAF_RAM->mask[cnt] = buf0 | 0x0000FFFF;.
> + }.
> + else.
> + {.
> + //remove all remaining section one place down.
> + cnt = (CANAF_FullCAN_cnt + 1)>>1;.
> + bound = total + CANAF_FullCAN_cnt * 3;.
> + while(bound>cnt).
> + {.
> + LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt];.
> + cnt++;.
> + }.
> + LPC_CANAF_RAM->mask[cnt-1]=0x00;.
> + //update address values.
> + LPC_CANAF->SFF_sa -=0x04;.
> + LPC_CANAF->SFF_GRP_sa -=0x04 ;.
> + LPC_CANAF->EFF_sa -=0x04 ;.
> + LPC_CANAF->EFF_GRP_sa -=0x04;.
> + LPC_CANAF->ENDofTable -=0x04;.
> + }.
> + CANAF_FullCAN_cnt--;.
> +.
> + //delete its FullCAN Object in the FullCAN Object section.
> + //remove all remaining FullCAN Object three place down.
> + cnt = total + position * 3;.
> + bound = (CANAF_FullCAN_cnt - position + 1) * 3;.
> +.
> + while(bound).
> + {.
> + LPC_CANAF_RAM->mask[cnt]=LPC_CANAF_RAM->mask[cnt+3];;.
> + LPC_CANAF_RAM->mask[cnt+1]=LPC_CANAF_RAM->mask[cnt+4];.
> + LPC_CANAF_RAM->mask[cnt+2]=LPC_CANAF_RAM->mask[cnt+5];.
> + bound -=3;.
> + cnt +=3;.
> + }.
> + }.
> + }.
> +.
> +/************** Remove Explicit Standard ID Entry *************/.
> + else if(EntryType == EXPLICIT_STANDARD_ENTRY).
> + {.
> + if((CANAF_std_cnt==0)||(position >= CANAF_std_cnt)).
> + {.
> + return CAN_ENTRY_NOT_EXIT_ERROR;.
> + }.
> + else.
> + {.
> + cnt = ((CANAF_FullCAN_cnt+1)>>1)+ (position >> 1);.
> + buf0 = LPC_CANAF_RAM->mask[cnt];.
> + bound = (CANAF_std_cnt - position - 1)>>1;.
> + if((position & 0x0001) == 0) //event position.
> + {.
> + while(bound--).
> + {.
> + //remove all remaining FullCAN entry one place down.
> + buf1 = LPC_CANAF_RAM->mask[cnt+1];.
> + LPC_CANAF_RAM->mask[cnt] = (buf1 >> 16) | (buf0 << 16);.
> + buf0 = buf1;.
> + cnt++;.
> + }.
> + }.
> + else //odd position.
> + {.
> + while(bound--).
> + {.
> + //remove all remaining FullCAN entry one place down.
> + buf1 = LPC_CANAF_RAM->mask[cnt+1];.
> + LPC_CANAF_RAM->mask[cnt] = (buf0 & 0xFFFF0000)|(buf1 >> 16);.
> + LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+1] << 16;.
> + buf0 = buf1<<16;.
> + cnt++;.
> + }.
> + }.
> + if((CANAF_std_cnt & 0x0001) == 0).
> + {.
> + if((position & 0x0001)==0).
> + LPC_CANAF_RAM->mask[cnt] = (buf0 << 16) | (0x0000FFFF);.
> + else.
> + LPC_CANAF_RAM->mask[cnt] = buf0 | 0x0000FFFF;.
> + }.
> + else.
> + {.
> + //remove all remaining section one place down.
> + cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1);.
> + bound = total + CANAF_FullCAN_cnt * 3;.
> + while(bound>cnt).
> + {.
> + LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt];.
> + cnt++;.
> + }.
> + LPC_CANAF_RAM->mask[cnt-1]=0x00;.
> + //update address value.
> + LPC_CANAF->SFF_GRP_sa -=0x04 ;.
> + LPC_CANAF->EFF_sa -=0x04 ;.
> + LPC_CANAF->EFF_GRP_sa -=0x04;.
> + LPC_CANAF->ENDofTable -=0x04;.
> + }.
> + CANAF_std_cnt--;.
> + }.
> + }.
> +.
> +/************** Remove Group of Standard ID Entry *************/.
> + else if(EntryType == GROUP_STANDARD_ENTRY).
> + {.
> + if((CANAF_gstd_cnt==0)||(position >= CANAF_gstd_cnt)).
> + {.
> + return CAN_ENTRY_NOT_EXIT_ERROR;.
> + }.
> + else.
> + {.
> + cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1)+ position + 1;.
> + bound = total + CANAF_FullCAN_cnt * 3;.
> + while (cnt<bound).
> + {.
> + LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt];.
> + cnt++;.
> + }.
> + LPC_CANAF_RAM->mask[cnt-1]=0x00;.
> + }.
> + CANAF_gstd_cnt--;.
> + //update address value.
> + LPC_CANAF->EFF_sa -=0x04;.
> + LPC_CANAF->EFF_GRP_sa -=0x04;.
> + LPC_CANAF->ENDofTable -=0x04;.
> + }.
> +.
> +/************** Remove Explicit Extended ID Entry *************/.
> + else if(EntryType == EXPLICIT_EXTEND_ENTRY).
> + {.
> + if((CANAF_ext_cnt==0)||(position >= CANAF_ext_cnt)).
> + {.
> + return CAN_ENTRY_NOT_EXIT_ERROR;.
> + }.
> + else.
> + {.
> + cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1)+ CANAF_gstd_cnt + position + 1;.
> + bound = total + CANAF_FullCAN_cnt * 3;.
> + while (cnt<bound).
> + {.
> + LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt];.
> + cnt++;.
> + }.
> + LPC_CANAF_RAM->mask[cnt-1]=0x00;.
> + }.
> + CANAF_ext_cnt--;.
> + LPC_CANAF->EFF_GRP_sa -=0x04;.
> + LPC_CANAF->ENDofTable -=0x04;.
> + }.
> +.
> +/************** Remove Group of Extended ID Entry *************/.
> + else.
> + {.
> + if((CANAF_gext_cnt==0)||(position >= CANAF_gext_cnt)).
> + {.
> + return CAN_ENTRY_NOT_EXIT_ERROR;.
> + }.
> + else.
> + {.
> + cnt = total - (CANAF_gext_cnt<<1) + (position<<1);.
> + bound = total + CANAF_FullCAN_cnt * 3;.
> + while (cnt<bound).
> + {.
> + //remove all remaining entry two place up.
> + LPC_CANAF_RAM->mask[cnt] = LPC_CANAF_RAM->mask[cnt+2];.
> + LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+3];.
> + cnt+=2;.
> + }.
> + }.
> + CANAF_gext_cnt--;.
> + LPC_CANAF->ENDofTable -=0x08;.
> + }.
> + LPC_CANAF->AFMR = 0x04;.
> + return CAN_OK;.
> +}.
> +.
> +/********************************************************************//**.
> + * @brief Send message data.
> + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @param[in] CAN_Msg point to the CAN_MSG_Type Structure, it contains message.
> + * information such as: ID, DLC, RTR, ID Format.
> + * @return Status:.
> + * - SUCCESS: send message successfully.
> + * - ERROR: send message unsuccessfully.
> + *********************************************************************/.
> +Status CAN_SendMsg (LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg).
> +{.
> + uint32_t data;.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> + CHECK_PARAM(PARAM_ID_FORMAT(CAN_Msg->format));.
> + if(CAN_Msg->format==STD_ID_FORMAT).
> + {.
> + CHECK_PARAM(PARAM_ID_11(CAN_Msg->id));.
> + }.
> + else.
> + {.
> + CHECK_PARAM(PARAM_ID_29(CAN_Msg->id));.
> + }.
> + CHECK_PARAM(PARAM_DLC(CAN_Msg->len));.
> + CHECK_PARAM(PARAM_FRAME_TYPE(CAN_Msg->type));.
> +.
> + //Check status of Transmit Buffer 1.
> + if ((CANx->SR & 0x00000004)>>2).
> + {.
> + /* Transmit Channel 1 is available */.
> + /* Write frame informations and frame data into its CANxTFI1,.
> + * CANxTID1, CANxTDA1, CANxTDB1 register */.
> + CANx->TFI1 &= ~0x000F000;.
> + CANx->TFI1 |= (CAN_Msg->len)<<16;.
> + if(CAN_Msg->type == REMOTE_FRAME).
> + {.
> + CANx->TFI1 |= (1<<30); //set bit RTR.
> + }.
> + else.
> + {.
> + CANx->TFI1 &= ~(1<<30);.
> + }.
> + if(CAN_Msg->format == EXT_ID_FORMAT).
> + {.
> + CANx->TFI1 |= (1<<31); //set bit FF.
> + }.
> + else.
> + {.
> + CANx->TFI1 &= ~(1<<31);.
> + }.
> +.
> + /* Write CAN ID*/.
> + CANx->TID1 = CAN_Msg->id;.
> +.
> + /*Write first 4 data bytes*/.
> + data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24);.
> +// CANx->TDA1 = *((uint32_t *) &(CAN_Msg->dataA));.
> + CANx->TDA1 = data;.
> +.
> + /*Write second 4 data bytes*/.
> + data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24);.
> +// CANx->TDB1 = *((uint32_t *) &(CAN_Msg->dataB));.
> + CANx->TDB1 = data;.
> +.
> + /*Write transmission request*/.
> + CANx->CMR = 0x21;.
> + return SUCCESS;.
> + }.
> + //check status of Transmit Buffer 2.
> + else if((CANx->SR & 0x00000004)>>10).
> + {.
> + /* Transmit Channel 2 is available */.
> + /* Write frame informations and frame data into its CANxTFI2,.
> + * CANxTID2, CANxTDA2, CANxTDB2 register */.
> + CANx->TFI2 &= ~0x000F000;.
> + CANx->TFI2 |= (CAN_Msg->len)<<16;.
> + if(CAN_Msg->type == REMOTE_FRAME).
> + {.
> + CANx->TFI2 |= (1<<30); //set bit RTR.
> + }.
> + else.
> + {.
> + CANx->TFI2 &= ~(1<<30);.
> + }.
> + if(CAN_Msg->format == EXT_ID_FORMAT).
> + {.
> + CANx->TFI2 |= (1<<31); //set bit FF.
> + }.
> + else.
> + {.
> + CANx->TFI2 &= ~(1<<31);.
> + }.
> +.
> + /* Write CAN ID*/.
> + CANx->TID2 = CAN_Msg->id;.
> +.
> + /*Write first 4 data bytes*/.
> + data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24);.
> +// CANx->TDA2 = *((uint32_t *) &(CAN_Msg->dataA));.
> + CANx->TDA2 = data;.
> +.
> + /*Write second 4 data bytes*/.
> + data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24);.
> +// CANx->TDB2 = *((uint32_t *) &(CAN_Msg->dataB));.
> + CANx->TDB2 = data;.
> +.
> + /*Write transmission request*/.
> + CANx->CMR = 0x41;.
> + return SUCCESS;.
> + }.
> + //check status of Transmit Buffer 3.
> + else if ((CANx->SR & 0x00000004)>>18).
> + {.
> + /* Transmit Channel 3 is available */.
> + /* Write frame informations and frame data into its CANxTFI3,.
> + * CANxTID3, CANxTDA3, CANxTDB3 register */.
> + CANx->TFI3 &= ~0x000F000;.
> + CANx->TFI3 |= (CAN_Msg->len)<<16;.
> + if(CAN_Msg->type == REMOTE_FRAME).
> + {.
> + CANx->TFI3 |= (1<<30); //set bit RTR.
> + }.
> + else.
> + {.
> + CANx->TFI3 &= ~(1<<30);.
> + }.
> + if(CAN_Msg->format == EXT_ID_FORMAT).
> + {.
> + CANx->TFI3 |= (1<<31); //set bit FF.
> + }.
> + else.
> + {.
> + CANx->TFI3 &= ~(1<<31);.
> + }.
> +.
> + /* Write CAN ID*/.
> + CANx->TID3 = CAN_Msg->id;.
> +.
> + /*Write first 4 data bytes*/.
> + data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24);.
> +// CANx->TDA3 = *((uint32_t *) &(CAN_Msg->dataA));.
> + CANx->TDA3 = data;.
> +.
> + /*Write second 4 data bytes*/.
> + data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24);.
> +// CANx->TDB3 = *((uint32_t *) &(CAN_Msg->dataB));.
> + CANx->TDB3 = data;.
> +.
> + /*Write transmission request*/.
> + CANx->CMR = 0x81;.
> + return SUCCESS;.
> + }.
> + else.
> + {.
> + return ERROR;.
> + }.
> +}.
> +.
> +/********************************************************************//**.
> + * @brief Receive message data.
> + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @param[in] CAN_Msg point to the CAN_MSG_Type Struct, it will contain received.
> + * message information such as: ID, DLC, RTR, ID Format.
> + * @return Status:.
> + * - SUCCESS: receive message successfully.
> + * - ERROR: receive message unsuccessfully.
> + *********************************************************************/.
> +Status CAN_ReceiveMsg (LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg).
> +{.
> + uint32_t data;.
> +.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> +.
> + //check status of Receive Buffer.
> + if((CANx->SR &0x00000001)).
> + {.
> + /* Receive message is available */.
> + /* Read frame informations */.
> + CAN_Msg->format = (uint8_t)(((CANx->RFS) & 0x80000000)>>31);.
> + CAN_Msg->type = (uint8_t)(((CANx->RFS) & 0x40000000)>>30);.
> + CAN_Msg->len = (uint8_t)(((CANx->RFS) & 0x000F0000)>>16);.
> +.
> +.
> + /* Read CAN message identifier */.
> + CAN_Msg->id = CANx->RID;.
> +.
> + /* Read the data if received message was DATA FRAME */.
> + if (CAN_Msg->type == DATA_FRAME).
> + {.
> + /* Read first 4 data bytes */.
> +// *((uint32_t *) &CAN_Msg->dataA) = CANx->RDA;.
> + data = CANx->RDA;.
> + *((uint8_t *) &CAN_Msg->dataA[0])= data & 0x000000FF;.
> + *((uint8_t *) &CAN_Msg->dataA[1])= (data & 0x0000FF00)>>8;;.
> + *((uint8_t *) &CAN_Msg->dataA[2])= (data & 0x00FF0000)>>16;.
> + *((uint8_t *) &CAN_Msg->dataA[3])= (data & 0xFF000000)>>24;.
> +.
> + /* Read second 4 data bytes */.
> +// *((uint32_t *) &CAN_Msg->dataB) = CANx->RDB;.
> + data = CANx->RDB;.
> + *((uint8_t *) &CAN_Msg->dataB[0])= data & 0x000000FF;.
> + *((uint8_t *) &CAN_Msg->dataB[1])= (data & 0x0000FF00)>>8;.
> + *((uint8_t *) &CAN_Msg->dataB[2])= (data & 0x00FF0000)>>16;.
> + *((uint8_t *) &CAN_Msg->dataB[3])= (data & 0xFF000000)>>24;.
> +.
> + /*release receive buffer*/.
> + CANx->CMR = 0x04;.
> + }.
> + else.
> + {.
> + /* Received Frame is a Remote Frame, not have data, we just receive.
> + * message information only */.
> + return SUCCESS;.
> + }.
> + }.
> + else.
> + {.
> + // no receive message available.
> + return ERROR;.
> + }.
> + return SUCCESS;.
> +}.
> +.
> +/********************************************************************//**.
> + * @brief Receive FullCAN Object.
> + * @param[in] CANAFx: CAN Acceptance Filter register, should be LPC_CANAF.
> + * @param[in] CAN_Msg point to the CAN_MSG_Type Struct, it will contain received.
> + * message information such as: ID, DLC, RTR, ID Format.
> + * @return CAN_ERROR, could be:.
> + * - CAN_FULL_OBJ_NOT_RCV: FullCAN Object is not be received.
> + * - CAN_OK: Received FullCAN Object successful.
> + *.
> + *********************************************************************/.
> +CAN_ERROR FCAN_ReadObj (LPC_CANAF_TypeDef* CANAFx, CAN_MSG_Type *CAN_Msg).
> +{.
> + uint32_t *pSrc, data;.
> + uint32_t interrut_word, msg_idx, test_bit, head_idx, tail_idx;.
> +.
> + CHECK_PARAM(PARAM_CANAFx(CANAFx));.
> +.
> + interrut_word = 0;.
> +.
> + if (LPC_CANAF->FCANIC0 != 0).
> + {.
> + interrut_word = LPC_CANAF->FCANIC0;.
> + head_idx = 0;.
> + tail_idx = 31;.
> + }.
> + else if (LPC_CANAF->FCANIC1 != 0).
> + {.
> + interrut_word = LPC_CANAF->FCANIC1;.
> + head_idx = 32;.
> + tail_idx = 63;.
> + }.
> +.
> + if (interrut_word != 0).
> + {.
> + /* Detect for interrupt pending */.
> + msg_idx = 0;.
> + for (msg_idx = head_idx; msg_idx <= tail_idx; msg_idx++).
> + {.
> + test_bit = interrut_word & 0x1;.
> + interrut_word = interrut_word >> 1;.
> +.
> + if (test_bit).
> + {.
> + pSrc = (uint32_t *) (LPC_CANAF->ENDofTable + LPC_CANAF_RAM_BASE + msg_idx * 12);.
> +.
> + /* Has been finished updating the content */.
> + if ((*pSrc & 0x03000000L) == 0x03000000L).
> + {.
> + /*clear semaphore*/.
> + *pSrc &= 0xFCFFFFFF;.
> +.
> + /*Set to DatA*/.
> + pSrc++;.
> + /* Copy to dest buf */.
> +// *((uint32_t *) &CAN_Msg->dataA) = *pSrc;.
> + data = *pSrc;.
> + *((uint8_t *) &CAN_Msg->dataA[0])= data & 0x000000FF;.
> + *((uint8_t *) &CAN_Msg->dataA[1])= (data & 0x0000FF00)>>8;.
> + *((uint8_t *) &CAN_Msg->dataA[2])= (data & 0x00FF0000)>>16;.
> + *((uint8_t *) &CAN_Msg->dataA[3])= (data & 0xFF000000)>>24;.
> +.
> + /*Set to DatB*/.
> + pSrc++;.
> + /* Copy to dest buf */.
> +// *((uint32_t *) &CAN_Msg->dataB) = *pSrc;.
> + data = *pSrc;.
> + *((uint8_t *) &CAN_Msg->dataB[0])= data & 0x000000FF;.
> + *((uint8_t *) &CAN_Msg->dataB[1])= (data & 0x0000FF00)>>8;.
> + *((uint8_t *) &CAN_Msg->dataB[2])= (data & 0x00FF0000)>>16;.
> + *((uint8_t *) &CAN_Msg->dataB[3])= (data & 0xFF000000)>>24;.
> + /*Back to Dat1*/.
> + pSrc -= 2;.
> +.
> + CAN_Msg->id = *pSrc & 0x7FF;.
> + CAN_Msg->len = (uint8_t) (*pSrc >> 16) & 0x0F;.
> + CAN_Msg->format = 0; //FullCAN Object ID always is 11-bit value.
> + CAN_Msg->type = (uint8_t)(*pSrc >> 30) &0x01;.
> + /*Re-read semaphore*/.
> + if ((*pSrc & 0x03000000L) == 0).
> + {.
> + return CAN_OK;.
> + }.
> + }.
> + }.
> + }.
> + }.
> + return CAN_FULL_OBJ_NOT_RCV;.
> +}.
> +/********************************************************************//**.
> + * @brief Get CAN Control Status.
> + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @param[in] arg: type of CAN status to get from CAN status register.
> + * Should be:.
> + * - CANCTRL_GLOBAL_STS: CAN Global Status.
> + * - CANCTRL_INT_CAP: CAN Interrupt and Capture.
> + * - CANCTRL_ERR_WRN: CAN Error Warning Limit.
> + * - CANCTRL_STS: CAN Control Status.
> + * @return Current Control Status that you want to get value.
> + *********************************************************************/.
> +uint32_t CAN_GetCTRLStatus (LPC_CAN_TypeDef* CANx, CAN_CTRL_STS_Type arg).
> +{.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> + CHECK_PARAM(PARAM_CTRL_STS_TYPE(arg));.
> +.
> + switch (arg).
> + {.
> + case CANCTRL_GLOBAL_STS:.
> + return CANx->GSR;.
> +.
> + case CANCTRL_INT_CAP:.
> + return CANx->ICR;.
> +.
> + case CANCTRL_ERR_WRN:.
> + return CANx->EWL;.
> +.
> + default: // CANCTRL_STS.
> + return CANx->SR;.
> + }.
> +}.
> +/********************************************************************//**.
> + * @brief Get CAN Central Status.
> + * @param[in] CANCRx point to LPC_CANCR_TypeDef.
> + * @param[in] arg: type of CAN status to get from CAN Central status register.
> + * Should be:.
> + * - CANCR_TX_STS: Central CAN Tx Status.
> + * - CANCR_RX_STS: Central CAN Rx Status.
> + * - CANCR_MS: Central CAN Miscellaneous Status.
> + * @return Current Central Status that you want to get value.
> + *********************************************************************/.
> +uint32_t CAN_GetCRStatus (LPC_CANCR_TypeDef* CANCRx, CAN_CR_STS_Type arg).
> +{.
> + CHECK_PARAM(PARAM_CANCRx(CANCRx));.
> + CHECK_PARAM(PARAM_CR_STS_TYPE(arg));.
> +.
> + switch (arg).
> + {.
> + case CANCR_TX_STS:.
> + return CANCRx->CANTxSR;.
> +.
> + case CANCR_RX_STS:.
> + return CANCRx->CANRxSR;.
> +.
> + default: // CANCR_MS.
> + return CANCRx->CANMSR;.
> + }.
> +}.
> +/********************************************************************//**.
> + * @brief Enable/Disable CAN Interrupt.
> + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @param[in] arg: type of CAN interrupt that you want to enable/disable.
> + * Should be:.
> + * - CANINT_RIE: CAN Receiver Interrupt Enable.
> + * - CANINT_TIE1: CAN Transmit Interrupt Enable.
> + * - CANINT_EIE: CAN Error Warning Interrupt Enable.
> + * - CANINT_DOIE: CAN Data Overrun Interrupt Enable.
> + * - CANINT_WUIE: CAN Wake-Up Interrupt Enable.
> + * - CANINT_EPIE: CAN Error Passive Interrupt Enable.
> + * - CANINT_ALIE: CAN Arbitration Lost Interrupt Enable.
> + * - CANINT_BEIE: CAN Bus Error Interrupt Enable.
> + * - CANINT_IDIE: CAN ID Ready Interrupt Enable.
> + * - CANINT_TIE2: CAN Transmit Interrupt Enable for Buffer2.
> + * - CANINT_TIE3: CAN Transmit Interrupt Enable for Buffer3.
> + * - CANINT_FCE: FullCAN Interrupt Enable.
> + * @param[in] NewState: New state of this function, should be:.
> + * - ENABLE.
> + * - DISABLE.
> + * @return none.
> + *********************************************************************/.
> +void CAN_IRQCmd (LPC_CAN_TypeDef* CANx, CAN_INT_EN_Type arg, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> + CHECK_PARAM(PARAM_INT_EN_TYPE(arg));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + if(NewState == ENABLE).
> + {.
> + if(arg==CANINT_FCE).
> + {.
> + LPC_CANAF->AFMR = 0x01;.
> + LPC_CANAF->FCANIE = 0x01;.
> + LPC_CANAF->AFMR = 0x04;.
> + }.
> + else.
> + CANx->IER |= (1 << arg);.
> + }.
> + else.
> + {.
> + if(arg==CANINT_FCE){.
> + LPC_CANAF->AFMR = 0x01;.
> + LPC_CANAF->FCANIE = 0x01;.
> + LPC_CANAF->AFMR = 0x00;.
> + }.
> + else.
> + CANx->IER &= ~(1 << arg);.
> + }.
> +}.
> +/*********************************************************************//**.
> + * @brief Install interrupt call-back function.
> + * @param[in] arg: CAN interrupt type, should be:.
> + * - CANINT_RIE: CAN Receiver Interrupt Enable.
> + * - CANINT_TIE1: CAN Transmit Interrupt Enable.
> + * - CANINT_EIE: CAN Error Warning Interrupt Enable.
> + * - CANINT_DOIE: CAN Data Overrun Interrupt Enable.
> + * - CANINT_WUIE: CAN Wake-Up Interrupt Enable.
> + * - CANINT_EPIE: CAN Error Passive Interrupt Enable.
> + * - CANINT_ALIE: CAN Arbitration Lost Interrupt Enable.
> + * - CANINT_BEIE: CAN Bus Error Interrupt Enable.
> + * - CANINT_IDIE: CAN ID Ready Interrupt Enable.
> + * - CANINT_TIE2: CAN Transmit Interrupt Enable for Buffer2.
> + * - CANINT_TIE3: CAN Transmit Interrupt Enable for Buffer3.
> + * - CANINT_FCE: FullCAN Interrupt Enable.
> + * @param[in] pnCANCbs: pointer point to call-back function.
> + * @return None.
> + **********************************************************************/.
> +void CAN_SetupCBS(CAN_INT_EN_Type arg,fnCANCbs_Type* pnCANCbs).
> +{.
> + CHECK_PARAM(PARAM_INT_EN_TYPE(arg));.
> + _apfnCANCbs[arg] = pnCANCbs;.
> +}.
> +/********************************************************************//**.
> + * @brief Setting Acceptance Filter mode.
> + * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: CANAF.
> + * @param[in] AFMode: type of AF mode that you want to set, should be:.
> + * - CAN_Normal: Normal mode.
> + * - CAN_AccOff: Acceptance Filter Off Mode.
> + * - CAN_AccBP: Acceptance Fileter Bypass Mode.
> + * - CAN_eFCAN: FullCAN Mode Enhancement.
> + * @return none.
> + *********************************************************************/.
> +void CAN_SetAFMode (LPC_CANAF_TypeDef* CANAFx, CAN_AFMODE_Type AFMode).
> +{.
> + CHECK_PARAM(PARAM_CANAFx(CANAFx));.
> + CHECK_PARAM(PARAM_AFMODE_TYPE(AFMode));.
> +.
> + switch(AFMode).
> + {.
> + case CAN_Normal:.
> + CANAFx->AFMR = 0x00;.
> + break;.
> + case CAN_AccOff:.
> + CANAFx->AFMR = 0x01;.
> + break;.
> + case CAN_AccBP:.
> + CANAFx->AFMR = 0x02;.
> + break;.
> + case CAN_eFCAN:.
> + CANAFx->AFMR = 0x04;.
> + break;.
> + }.
> +}.
> +.
> +/********************************************************************//**.
> + * @brief Enable/Disable CAN Mode.
> + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be:.
> + * - CAN1: CAN 1.
> + * - CAN2: CAN 2.
> + * @param[in] mode: type of CAN mode that you want to enable/disable, should be:.
> + * - CAN_OPERATING_MODE: Normal Operating Mode.
> + * - CAN_RESET_MODE: Reset Mode.
> + * - CAN_LISTENONLY_MODE: Listen Only Mode.
> + * - CAN_SELFTEST_MODE: Self Test Mode.
> + * - CAN_TXPRIORITY_MODE: Transmit Priority Mode.
> + * - CAN_SLEEP_MODE: Sleep Mode.
> + * - CAN_RXPOLARITY_MODE: Receive Polarity Mode.
> + * - CAN_TEST_MODE: Test Mode.
> + * @param[in] NewState: New State of this function, should be:.
> + * - ENABLE.
> + * - DISABLE.
> + * @return none.
> + *********************************************************************/.
> +void CAN_ModeConfig(LPC_CAN_TypeDef* CANx, CAN_MODE_Type mode, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_CANx(CANx));.
> + CHECK_PARAM(PARAM_MODE_TYPE(mode));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + switch(mode).
> + {.
> + case CAN_OPERATING_MODE:.
> + CANx->MOD = 0x00;.
> + break;.
> + case CAN_RESET_MODE:.
> + if(NewState == ENABLE).
> + CANx->MOD |=CAN_MOD_RM;.
> + else.
> + CANx->MOD &= ~CAN_MOD_RM;.
> + break;.
> + case CAN_LISTENONLY_MODE:.
> + CANx->MOD |=CAN_MOD_RM;.
> + if(NewState == ENABLE).
> + CANx->MOD |=CAN_MOD_LOM;.
> + else.
> + CANx->MOD &=~CAN_MOD_LOM;.
> + break;.
> + case CAN_SELFTEST_MODE:.
> + CANx->MOD |=CAN_MOD_RM;.
> + if(NewState == ENABLE).
> + CANx->MOD |=CAN_MOD_STM;.
> + else.
> + CANx->MOD &=~CAN_MOD_STM;.
> + break;.
> + case CAN_TXPRIORITY_MODE:.
> + if(NewState == ENABLE).
> + CANx->MOD |=CAN_MOD_TPM;.
> + else.
> + CANx->MOD &=~CAN_MOD_TPM;.
> + break;.
> + case CAN_SLEEP_MODE:.
> + if(NewState == ENABLE).
> + CANx->MOD |=CAN_MOD_SM;.
> + else.
> + CANx->MOD &=~CAN_MOD_SM;.
> + break;.
> + case CAN_RXPOLARITY_MODE:.
> + if(NewState == ENABLE).
> + CANx->MOD |=CAN_MOD_RPM;.
> + else.
> + CANx->MOD &=~CAN_MOD_RPM;.
> + break;.
> + case CAN_TEST_MODE:.
> + if(NewState == ENABLE).
> + CANx->MOD |=CAN_MOD_TM;.
> + else.
> + CANx->MOD &=~CAN_MOD_TM;.
> + break;.
> + }.
> +}.
> +/*********************************************************************//**.
> + * @brief Standard CAN interrupt handler, this function will check.
> + * all interrupt status of CAN channels, then execute the call.
> + * back function if they're already installed.
> + * @param[in] CANx point to CAN peripheral selected, should be: CAN1 or CAN2.
> + * @return None.
> + **********************************************************************/.
> +void CAN_IntHandler(LPC_CAN_TypeDef* CANx).
> +{.
> + uint8_t t;.
> + //scan interrupt pending.
> + if(LPC_CANAF->FCANIE).
> + {.
> + _apfnCANCbs[11]();.
> + }.
> + //scan interrupt channels.
> + for(t=0;t<11;t++).
> + {.
> + if(((CANx->ICR)>>t)&0x01).
> + {.
> + _apfnCANCbs[t]();.
> + }.
> + }.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +#endif /* _CAN */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.h b/arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.h
> new file mode 100644
> index 0000000..c9d5b4e
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/can-cm/lpc17xx_can.h
> @@ -0,0 +1,855 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_can.h.
> + * @brief : Contains all macro definitions and function prototypes.
> + * support for CAN firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 1.June.2009.
> + * @author : NguyenCao.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @defgroup CAN.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC17XX_CAN_H_.
> +#define LPC17XX_CAN_H_.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "LPC17xx.h".
> +#include "lpc_types.h".
> +.
> +#ifdef __cplusplus.
> +extern "C".
> +{.
> +#endif.
> +.
> +.
> +/* Private Macros ------------------------------------------------------------- */.
> +/** @defgroup CAN_Private_Macros.
> + * @{.
> + */.
> +.
> +#define ID_11 1.
> +#define MAX_HW_FULLCAN_OBJ 64.
> +#define MAX_SW_FULLCAN_OBJ 32.
> +.
> +.
> +/** @defgroup CAN_REGISTER_BIT_DEFINITION.
> + * @{.
> + */.
> +.
> +/** CAN Reset mode */.
> +#define CAN_MOD_RM ((uint32_t)(1)).
> +/** CAN Listen Only Mode */.
> +#define CAN_MOD_LOM ((uint32_t)(1<<1)).
> +/** CAN Self Test mode */.
> +#define CAN_MOD_STM ((uint32_t)(1<<2)).
> +/** CAN Transmit Priority mode */.
> +#define CAN_MOD_TPM ((uint32_t)(1<<3)).
> +/** CAN Sleep mode */.
> +#define CAN_MOD_SM ((uint32_t)(1<<4)).
> +/** CAN Receive Polarity mode */.
> +#define CAN_MOD_RPM ((uint32_t)(1<<5)).
> +/** CAN Test mode */.
> +#define CAN_MOD_TM ((uint32_t)(1<<7)).
> +/*********************************************************************//**.
> + * Macro defines for CAN Command Register.
> + **********************************************************************/.
> +/** CAN Transmission Request */.
> +#define CAN_CMR_TR ((uint32_t)(1)).
> +/** CAN Abort Transmission */.
> +#define CAN_CMR_AT ((uint32_t)(1<<1)).
> +/** CAN Release Receive Buffer */.
> +#define CAN_CMR_RRB ((uint32_t)(1<<2)).
> +/** CAN Clear Data Overrun */.
> +#define CAN_CMR_CDO ((uint32_t)(1<<3)).
> +/** CAN Self Reception Request */.
> +#define CAN_CMR_SRR ((uint32_t)(1<<4)).
> +/** CAN Select Tx Buffer 1 */.
> +#define CAN_CMR_STB1 ((uint32_t)(1<<5)).
> +/** CAN Select Tx Buffer 2 */.
> +#define CAN_CMR_STB2 ((uint32_t)(1<<6)).
> +/** CAN Select Tx Buffer 3 */.
> +#define CAN_CMR_STB3 ((uint32_t)(1<<7)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Global Status Register.
> + **********************************************************************/.
> +/** CAN Receive Buffer Status */.
> +#define CAN_GSR_RBS ((uint32_t)(1)).
> +/** CAN Data Overrun Status */.
> +#define CAN_GSR_DOS ((uint32_t)(1<<1)).
> +/** CAN Transmit Buffer Status */.
> +#define CAN_GSR_TBS ((uint32_t)(1<<2)).
> +/** CAN Transmit Complete Status */.
> +#define CAN_GSR_TCS ((uint32_t)(1<<3)).
> +/** CAN Receive Status */.
> +#define CAN_GSR_RS ((uint32_t)(1<<4)).
> +/** CAN Transmit Status */.
> +#define CAN_GSR_TS ((uint32_t)(1<<5)).
> +/** CAN Error Status */.
> +#define CAN_GSR_ES ((uint32_t)(1<<6)).
> +/** CAN Bus Status */.
> +#define CAN_GSR_BS ((uint32_t)(1<<7)).
> +/** CAN Current value of the Rx Error Counter */.
> +#define CAN_GSR_RXERR(n) ((uint32_t)((n&0xFF)<<16)).
> +/** CAN Current value of the Tx Error Counter */.
> +#define CAN_GSR_TXERR(n) ((uint32_t)(n&0xFF)<<24)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Interrupt and Capture Register.
> + **********************************************************************/.
> +/** CAN Receive Interrupt */.
> +#define CAN_ICR_RI ((uint32_t)(1)).
> +/** CAN Transmit Interrupt 1 */.
> +#define CAN_ICR_TI1 ((uint32_t)(1<<1)).
> +/** CAN Error Warning Interrupt */.
> +#define CAN_ICR_EI ((uint32_t)(1<<2)).
> +/** CAN Data Overrun Interrupt */.
> +#define CAN_ICR_DOI ((uint32_t)(1<<3)).
> +/** CAN Wake-Up Interrupt */.
> +#define CAN_ICR_WUI ((uint32_t)(1<<4)).
> +/** CAN Error Passive Interrupt */.
> +#define CAN_ICR_EPI ((uint32_t)(1<<5)).
> +/** CAN Arbitration Lost Interrupt */.
> +#define CAN_ICR_ALI ((uint32_t)(1<<6)).
> +/** CAN Bus Error Interrupt */.
> +#define CAN_ICR_BEI ((uint32_t)(1<<7)).
> +/** CAN ID Ready Interrupt */.
> +#define CAN_ICR_IDI ((uint32_t)(1<<8)).
> +/** CAN Transmit Interrupt 2 */.
> +#define CAN_ICR_TI2 ((uint32_t)(1<<9)).
> +/** CAN Transmit Interrupt 3 */.
> +#define CAN_ICR_TI3 ((uint32_t)(1<<10)).
> +/** CAN Error Code Capture */.
> +#define CAN_ICR_ERRBIT(n) ((uint32_t)((n&0x1F)<<16)).
> +/** CAN Error Direction */.
> +#define CAN_ICR_ERRDIR ((uint32_t)(1<<21)).
> +/** CAN Error Capture */.
> +#define CAN_ICR_ERRC(n) ((uint32_t)((n&0x3)<<22)).
> +/** CAN Arbitration Lost Capture */.
> +#define CAN_ICR_ALCBIT(n) ((uint32_t)((n&0xFF)<<24)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Interrupt Enable Register.
> + **********************************************************************/.
> +/** CAN Receive Interrupt Enable */.
> +#define CAN_IER_RIE ((uint32_t)(1)).
> +/** CAN Transmit Interrupt Enable for buffer 1 */.
> +#define CAN_IER_TIE1 ((uint32_t)(1<<1)).
> +/** CAN Error Warning Interrupt Enable */.
> +#define CAN_IER_EIE ((uint32_t)(1<<2)).
> +/** CAN Data Overrun Interrupt Enable */.
> +#define CAN_IER_DOIE ((uint32_t)(1<<3)).
> +/** CAN Wake-Up Interrupt Enable */.
> +#define CAN_IER_WUIE ((uint32_t)(1<<4)).
> +/** CAN Error Passive Interrupt Enable */.
> +#define CAN_IER_EPIE ((uint32_t)(1<<5)).
> +/** CAN Arbitration Lost Interrupt Enable */.
> +#define CAN_IER_ALIE ((uint32_t)(1<<6)).
> +/** CAN Bus Error Interrupt Enable */.
> +#define CAN_IER_BEIE ((uint32_t)(1<<7)).
> +/** CAN ID Ready Interrupt Enable */.
> +#define CAN_IER_IDIE ((uint32_t)(1<<8)).
> +/** CAN Transmit Enable Interrupt for Buffer 2 */.
> +#define CAN_IER_TIE2 ((uint32_t)(1<<9)).
> +/** CAN Transmit Enable Interrupt for Buffer 3 */.
> +#define CAN_IER_TIE3 ((uint32_t)(1<<10)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Bus Timing Register.
> + **********************************************************************/.
> +/** CAN Baudrate Prescaler */.
> +#define CAN_BTR_BRP(n) ((uint32_t)(n&0x3FF)).
> +/** CAN Synchronization Jump Width */.
> +#define CAN_BTR_SJM(n) ((uint32_t)((n&0x3)<<14)).
> +/** CAN Time Segment 1 */.
> +#define CAN_BTR_TESG1(n) ((uint32_t)(n&0xF)<<16)).
> +/** CAN Time Segment 2 */.
> +#define CAN_BTR_TESG2(n) ((uint32_t)(n&0xF)<<20)).
> +/** CAN Sampling */.
> +#define CAN_BTR_SAM(n) ((uint32_t)(1<<23)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Error Warning Limit Register.
> + **********************************************************************/.
> +/** CAN Error Warning Limit */.
> +#define CAN_EWL_EWL(n) ((uint32_t)(n&0xFF)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Status Register.
> + **********************************************************************/.
> +/** CAN Receive Buffer Status */.
> +#define CAN_SR_RBS ((uint32_t)(1)).
> +/** CAN Data Overrun Status */.
> +#define CAN_SR_DOS ((uint32_t)(1<<1)).
> +/** CAN Transmit Buffer Status 1 */.
> +#define CAN_SR_TBS1 ((uint32_t)(1<<2)).
> +/** CAN Transmission Complete Status of Buffer 1 */.
> +#define CAN_SR_TCS1 ((uint32_t)(1<<3)).
> +/** CAN Receive Status */.
> +#define CAN_SR_RS ((uint32_t)(1<<4)).
> +/** CAN Transmit Status 1 */.
> +#define CAN_SR_TS1 ((uint32_t)(1<<5)).
> +/** CAN Error Status */.
> +#define CAN_SR_ES ((uint32_t)(1<<6)).
> +/** CAN Bus Status */.
> +#define CAN_SR_BS ((uint32_t)(1<<7)).
> +/** CAN Transmit Buffer Status 2 */.
> +#define CAN_SR_TBS2 ((uint32_t)(1<<10)).
> +/** CAN Transmission Complete Status of Buffer 2 */.
> +#define CAN_SR_TCS2 ((uint32_t)(1<<11)).
> +/** CAN Transmit Status 2 */.
> +#define CAN_SR_TS2 ((uint32_t)(1<<13)).
> +/** CAN Transmit Buffer Status 2 */.
> +#define CAN_SR_TBS3 ((uint32_t)(1<<18)).
> +/** CAN Transmission Complete Status of Buffer 2 */.
> +#define CAN_SR_TCS3 ((uint32_t)(1<<19)).
> +/** CAN Transmit Status 2 */.
> +#define CAN_SR_TS3 ((uint32_t)(1<<21)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Receive Frame Status Register.
> + **********************************************************************/.
> +/** CAN ID Index */.
> +#define CAN_RFS_ID_INDEX(n) ((uint32_t)(n&0x3FF)).
> +/** CAN Bypass */.
> +#define CAN_RFS_BP ((uint32_t)(1<<10)).
> +/** CAN Data Length Code */.
> +#define CAN_RFS_DLC(n) ((uint32_t)((n&0xF)<<16).
> +/** CAN Remote Transmission Request */.
> +#define CAN_RFS_RTR ((uint32_t)(1<<30)).
> +/** CAN control 11 bit or 29 bit Identifier */.
> +#define CAN_RFS_FF ((uint32_t)(1<<31)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Receive Identifier Register.
> + **********************************************************************/.
> +/** CAN 11 bit Identifier */.
> +#define CAN_RID_ID_11(n) ((uint32_t)(n&0x7FF)).
> +/** CAN 29 bit Identifier */.
> +#define CAN_RID_ID_29(n) ((uint32_t)(n&0x1FFFFFFF)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Receive Data A Register.
> + **********************************************************************/.
> +/** CAN Receive Data 1 */.
> +#define CAN_RDA_DATA1(n) ((uint32_t)(n&0xFF)).
> +/** CAN Receive Data 2 */.
> +#define CAN_RDA_DATA2(n) ((uint32_t)((n&0xFF)<<8)).
> +/** CAN Receive Data 3 */.
> +#define CAN_RDA_DATA3(n) ((uint32_t)((n&0xFF)<<16)).
> +/** CAN Receive Data 4 */.
> +#define CAN_RDA_DATA4(n) ((uint32_t)((n&0xFF)<<24)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Receive Data B Register.
> + **********************************************************************/.
> +/** CAN Receive Data 5 */.
> +#define CAN_RDB_DATA5(n) ((uint32_t)(n&0xFF)).
> +/** CAN Receive Data 6 */.
> +#define CAN_RDB_DATA6(n) ((uint32_t)((n&0xFF)<<8)).
> +/** CAN Receive Data 7 */.
> +#define CAN_RDB_DATA7(n) ((uint32_t)((n&0xFF)<<16)).
> +/** CAN Receive Data 8 */.
> +#define CAN_RDB_DATA8(n) ((uint32_t)((n&0xFF)<<24)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Transmit Frame Information Register.
> + **********************************************************************/.
> +/** CAN Priority */.
> +#define CAN_TFI_PRIO(n) ((uint32_t)(n&0xFF)).
> +/** CAN Data Length Code */.
> +#define CAN_TFI_DLC(n) ((uint32_t)((n&0xF)<<16)).
> +/** CAN Remote Frame Transmission */.
> +#define CAN_TFI_RTR ((uint32_t)(1<<30)).
> +/** CAN control 11-bit or 29-bit Identifier */.
> +#define CAN_TFI_FF ((uint32_t)(1<<31)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Transmit Identifier Register.
> + **********************************************************************/.
> +/** CAN 11-bit Identifier */.
> +#define CAN_TID_ID11(n) ((uint32_t)(n&0x7FF)).
> +/** CAN 11-bit Identifier */.
> +#define CAN_TID_ID29(n) ((uint32_t)(n&0x1FFFFFFF)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Transmit Data A Register.
> + **********************************************************************/.
> +/** CAN Transmit Data 1 */.
> +#define CAN_TDA_DATA1(n) ((uint32_t)(n&0xFF)).
> +/** CAN Transmit Data 2 */.
> +#define CAN_TDA_DATA2(n) ((uint32_t)((n&0xFF)<<8)).
> +/** CAN Transmit Data 3 */.
> +#define CAN_TDA_DATA3(n) ((uint32_t)((n&0xFF)<<16)).
> +/** CAN Transmit Data 4 */.
> +#define CAN_TDA_DATA4(n) ((uint32_t)((n&0xFF)<<24)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Transmit Data B Register.
> + **********************************************************************/.
> +/** CAN Transmit Data 5 */.
> +#define CAN_TDA_DATA5(n) ((uint32_t)(n&0xFF)).
> +/** CAN Transmit Data 6 */.
> +#define CAN_TDA_DATA6(n) ((uint32_t)((n&0xFF)<<8)).
> +/** CAN Transmit Data 7 */.
> +#define CAN_TDA_DATA7(n) ((uint32_t)((n&0xFF)<<16)).
> +/** CAN Transmit Data 8 */.
> +#define CAN_TDA_DATA8(n) ((uint32_t)((n&0xFF)<<24)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Sleep Clear Register.
> + **********************************************************************/.
> +/** CAN1 Sleep mode */.
> +#define CAN1SLEEPCLR ((uint32_t)(1<<1)).
> +/** CAN2 Sleep Mode */.
> +#define CAN2SLEEPCLR ((uint32_t)(1<<2)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for CAN Wake up Flags Register.
> + **********************************************************************/.
> +/** CAN1 Sleep mode */.
> +#define CAN_WAKEFLAGES_CAN1WAKE ((uint32_t)(1<<1)).
> +/** CAN2 Sleep Mode */.
> +#define CAN_WAKEFLAGES_CAN2WAKE ((uint32_t)(1<<2)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for Central transmit Status Register.
> + **********************************************************************/.
> +/** CAN Transmit 1 */.
> +#define CAN_TSR_TS1 ((uint32_t)(1)).
> +/** CAN Transmit 2 */.
> +#define CAN_TSR_TS2 ((uint32_t)(1<<1)).
> +/** CAN Transmit Buffer Status 1 */.
> +#define CAN_TSR_TBS1 ((uint32_t)(1<<8)).
> +/** CAN Transmit Buffer Status 2 */.
> +#define CAN_TSR_TBS2 ((uint32_t)(1<<9)).
> +/** CAN Transmission Complete Status 1 */.
> +#define CAN_TSR_TCS1 ((uint32_t)(1<<16)).
> +/** CAN Transmission Complete Status 2 */.
> +#define CAN_TSR_TCS2 ((uint32_t)(1<<17)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for Central Receive Status Register.
> + **********************************************************************/.
> +/** CAN Receive Status 1 */.
> +#define CAN_RSR_RS1 ((uint32_t)(1)).
> +/** CAN Receive Status 1 */.
> +#define CAN_RSR_RS2 ((uint32_t)(1<<1)).
> +/** CAN Receive Buffer Status 1*/.
> +#define CAN_RSR_RB1 ((uint32_t)(1<<8)).
> +/** CAN Receive Buffer Status 2*/.
> +#define CAN_RSR_RB2 ((uint32_t)(1<<9)).
> +/** CAN Data Overrun Status 1 */.
> +#define CAN_RSR_DOS1 ((uint32_t)(1<<16)).
> +/** CAN Data Overrun Status 1 */.
> +#define CAN_RSR_DOS2 ((uint32_t)(1<<17)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for Central Miscellaneous Status Register.
> + **********************************************************************/.
> +/** Same CAN Error Status in CAN1GSR */.
> +#define CAN_MSR_E1 ((uint32_t)(1)).
> +/** Same CAN Error Status in CAN2GSR */.
> +#define CAN_MSR_E2 ((uint32_t)(1<<1)).
> +/** Same CAN Bus Status in CAN1GSR */.
> +#define CAN_MSR_BS1 ((uint32_t)(1<<8)).
> +/** Same CAN Bus Status in CAN2GSR */.
> +#define CAN_MSR_BS2 ((uint32_t)(1<<9)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for Acceptance Filter Mode Register.
> + **********************************************************************/.
> +/** CAN Acceptance Filter Off mode */.
> +#define CAN_AFMR_AccOff ((uint32_t)(1)).
> +/** CAN Acceptance File Bypass mode */.
> +#define CAN_AFMR_AccBP ((uint32_t)(1<<1)).
> +/** FullCAN Mode Enhancements */.
> +#define CAN_AFMR_eFCAN ((uint32_t)(1<<2)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for Standard Frame Individual Start Address Register.
> + **********************************************************************/.
> +/** The start address of the table of individual Standard Identifier */.
> +#define CAN_STT_sa(n) ((uint32_t)((n&1FF)<<2)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for Standard Frame Group Start Address Register.
> + **********************************************************************/.
> +/** The start address of the table of grouped Standard Identifier */.
> +#define CAN_SFF_GRP_sa(n) ((uint32_t)((n&3FF)<<2)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for Extended Frame Start Address Register.
> + **********************************************************************/.
> +/** The start address of the table of individual Extended Identifier */.
> +#define CAN_EFF_sa(n) ((uint32_t)((n&1FF)<<2)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for Extended Frame Group Start Address Register.
> + **********************************************************************/.
> +/** The start address of the table of grouped Extended Identifier */.
> +#define CAN_Eff_GRP_sa(n) ((uint32_t)((n&3FF)<<2)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for End Of AF Table Register.
> + **********************************************************************/.
> +/** The End of Table of AF LookUp Table */.
> +#define CAN_EndofTable(n) ((uint32_t)((n&3FF)<<2)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for LUT Error Address Register.
> + **********************************************************************/.
> +/** CAN Look-Up Table Error Address */.
> +#define CAN_LUTerrAd(n) ((uint32_t)((n&1FF)<<2)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for LUT Error Register.
> + **********************************************************************/.
> +/** CAN Look-Up Table Error */.
> +#define CAN_LUTerr ((uint32_t)(1)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for Global FullCANInterrupt Enable Register.
> + **********************************************************************/.
> +/** Global FullCANInterrupt Enable */.
> +#define CAN_FCANIE ((uint32_t)(1)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for FullCAN Interrupt and Capture Register 0.
> + **********************************************************************/.
> +/** FullCAN Interrupt and Capture (0-31)*/.
> +#define CAN_FCANIC0_IntPnd(n) ((uint32_t)(1<<n)).
> +.
> +/*********************************************************************//**.
> + * Macro defines for FullCAN Interrupt and Capture Register 1.
> + **********************************************************************/.
> +/** FullCAN Interrupt and Capture (0-31)*/.
> +#define CAN_FCANIC1_IntPnd(n) ((uint32_t)(1<<(n-32))).
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Types --------------------------------------------------------------- */.
> +/** @defgroup CAN_Public_Types.
> + * @{.
> + */.
> +.
> +/** CAN configuration structure */.
> +/***********************************************************************.
> + * CAN device configuration commands (IOCTL commands and arguments).
> + **********************************************************************/.
> +/**.
> + * @brief CAN ID format definition.
> + */.
> +typedef enum {.
> + STD_ID_FORMAT = 0, /**< Use standard ID format (11 bit ID) */.
> + EXT_ID_FORMAT = 1 /**< Use extended ID format (29 bit ID) */.
> +} CAN_ID_FORMAT_Type;.
> +.
> +/**.
> + * @brief AFLUT Entry type definition.
> + */.
> +typedef enum {.
> + FULLCAN_ENTRY = 0,.
> + EXPLICIT_STANDARD_ENTRY,.
> + GROUP_STANDARD_ENTRY,.
> + EXPLICIT_EXTEND_ENTRY,.
> + GROUP_EXTEND_ENTRY,.
> +} AFLUT_ENTRY_Type;.
> +.
> +/**.
> + * @brief Symbolic names for type of CAN message.
> + */.
> +typedef enum {.
> + DATA_FRAME = 0, /**< Data frame */.
> + REMOTE_FRAME = 1 /**< Remote frame */.
> +} CAN_FRAME_Type;.
> +.
> +/**.
> + * @brief CAN Control status definition.
> + */.
> +typedef enum {.
> + CANCTRL_GLOBAL_STS = 0, /**< CAN Global Status */.
> + CANCTRL_INT_CAP, /**< CAN Interrupt and Capture */.
> + CANCTRL_ERR_WRN, /**< CAN Error Warning Limit */.
> + CANCTRL_STS /**< CAN Control Status */.
> +} CAN_CTRL_STS_Type;.
> +.
> +/**.
> + * @brief Central CAN status type definition.
> + */.
> +typedef enum {.
> + CANCR_TX_STS = 0, /**< Central CAN Tx Status */.
> + CANCR_RX_STS, /**< Central CAN Rx Status */.
> + CANCR_MS /**< Central CAN Miscellaneous Status */.
> +} CAN_CR_STS_Type;.
> +.
> +/**.
> + * @brief CAN interrupt enable type definition.
> + */.
> +typedef enum {.
> + CANINT_RIE = 0, /**< CAN Receiver Interrupt Enable */.
> + CANINT_TIE1, /**< CAN Transmit Interrupt Enable */.
> + CANINT_EIE, /**< CAN Error Warning Interrupt Enable */.
> + CANINT_DOIE, /**< CAN Data Overrun Interrupt Enable */.
> + CANINT_WUIE, /**< CAN Wake-Up Interrupt Enable */.
> + CANINT_EPIE, /**< CAN Error Passive Interrupt Enable */.
> + CANINT_ALIE, /**< CAN Arbitration Lost Interrupt Enable */.
> + CANINT_BEIE, /**< CAN Bus Error Inter rupt Enable */.
> + CANINT_IDIE, /**< CAN ID Ready Interrupt Enable */.
> + CANINT_TIE2, /**< CAN Transmit Interrupt Enable for Buffer2 */.
> + CANINT_TIE3, /**< CAN Transmit Interrupt Enable for Buffer3 */.
> + CANINT_FCE /**< FullCAN Interrupt Enable */.
> +} CAN_INT_EN_Type;.
> +.
> +/**.
> + * @brief Acceptance Filter Mode type definition.
> + */.
> +typedef enum {.
> + CAN_Normal = 0, /**< Normal Mode */.
> + CAN_AccOff, /**< Acceptance Filter Off Mode */.
> + CAN_AccBP, /**< Acceptance Fileter Bypass Mode */.
> + CAN_eFCAN /**< FullCAN Mode Enhancement */.
> +} CAN_AFMODE_Type;.
> +.
> +/**.
> + * @brief CAN Mode Type definition.
> + */.
> +typedef enum {.
> + CAN_OPERATING_MODE = 0, /**< Operating Mode */.
> + CAN_RESET_MODE, /**< Reset Mode */.
> + CAN_LISTENONLY_MODE, /**< Listen Only Mode */.
> + CAN_SELFTEST_MODE, /**< Seft Test Mode */.
> + CAN_TXPRIORITY_MODE, /**< Transmit Priority Mode */.
> + CAN_SLEEP_MODE, /**< Sleep Mode */.
> + CAN_RXPOLARITY_MODE, /**< Receive Polarity Mode */.
> + CAN_TEST_MODE /**< Test Mode */.
> +} CAN_MODE_Type;.
> +.
> +/**.
> + * @brief Error values that functions can return.
> + */.
> +typedef enum {.
> + CAN_OK = 1, /**< No error */.
> + CAN_OBJECTS_FULL_ERROR, /**< No more rx or tx objects available */.
> + CAN_FULL_OBJ_NOT_RCV, /**< Full CAN object not received */.
> + CAN_NO_RECEIVE_DATA, /**< No have receive data available */.
> + CAN_AF_ENTRY_ERROR, /**< Entry load in AFLUT is unvalid */.
> + CAN_CONFLICT_ID_ERROR, /**< Conflict ID occur */.
> + CAN_ENTRY_NOT_EXIT_ERROR /**< Entry remove outo AFLUT is not exit */.
> +} CAN_ERROR;.
> +.
> +/**.
> + * @brief Pin Configuration structure.
> + */.
> +typedef struct {.
> + uint8_t RD; /**< Serial Inputs, from CAN transceivers, should be:.
> + ** For CAN1:.
> + - CAN_RD1_P0_0: RD pin is on P0.0.
> + - CAN_RD1_P0_21 : RD pin is on P0.21.
> + ** For CAN2:.
> + - CAN_RD2_P0_4: RD pin is on P0.4.
> + - CAN_RD2_P2_7: RD pin is on P2.7.
> + */.
> + uint8_t TD; /**< Serial Outputs, To CAN transceivers, should be:.
> + ** For CAN1:.
> + - CAN_TD1_P0_1: TD pin is on P0.1.
> + - CAN_TD1_P0_22: TD pin is on P0.22.
> + ** For CAN2:.
> + - CAN_TD2_P0_5: TD pin is on P0.5.
> + - CAN_TD2_P2_8: TD pin is on P2.8.
> + */.
> +} CAN_PinCFG_Type;.
> +.
> +/**.
> + * @brief CAN message object structure.
> + */.
> +typedef struct {.
> + uint32_t id; /**< 29 bit identifier, it depend on "format" value.
> + - if format = STD_ID_FORMAT, id should be 11 bit identifier.
> + - if format = EXT_ID_FORMAT, id should be 29 bit identifier.
> + */.
> + uint8_t dataA[4]; /**< Data field A */.
> + uint8_t dataB[4]; /**< Data field B */.
> + uint8_t len; /**< Length of data field in bytes, should be:.
> + - 0000b-0111b: 0-7 bytes.
> + - 1xxxb: 8 bytes.
> + */.
> + uint8_t format; /**< Identifier Format, should be:.
> + - STD_ID_FORMAT: Standard ID - 11 bit format.
> + - EXT_ID_FORMAT: Extended ID - 29 bit format.
> + */.
> + uint8_t type; /**< Remote Frame transmission, should be:.
> + - DATA_FRAME: the number of data bytes called out by the DLC.
> + field are send from the CANxTDA and CANxTDB registers.
> + - REMOTE_FRAME: Remote Frame is sent.
> + */.
> +} CAN_MSG_Type;.
> +.
> +/**.
> + * @brief FullCAN Entry structure.
> + */.
> +typedef struct {.
> + uint8_t controller; /**< CAN Controller, should be:.
> + - CAN1_CTRL: CAN1 Controller.
> + - CAN2_CTRL: CAN2 Controller.
> + */.
> + uint8_t disable; /**< Disable bit, should be:.
> + - MSG_ENABLE: disable bit = 0.
> + - MSG_DISABLE: disable bit = 1.
> + */.
> + uint16_t id_11; /**< Standard ID, should be 11-bit value */.
> +} FullCAN_Entry;.
> +.
> +/**.
> + * @brief Standard ID Frame Format Entry structure.
> + */.
> +typedef struct {.
> + uint8_t controller; /**< CAN Controller, should be:.
> + - CAN1_CTRL: CAN1 Controller.
> + - CAN2_CTRL: CAN2 Controller.
> + */.
> + uint8_t disable; /**< Disable bit, should be:.
> + - MSG_ENABLE: disable bit = 0.
> + - MSG_DISABLE: disable bit = 1.
> + */.
> + uint16_t id_11; /**< Standard ID, should be 11-bit value */.
> +} SFF_Entry;.
> +.
> +/**.
> + * @brief Group of Standard ID Frame Format Entry structure.
> + */.
> +typedef struct {.
> + uint8_t controller1; /**< First CAN Controller, should be:.
> + - CAN1_CTRL: CAN1 Controller.
> + - CAN2_CTRL: CAN2 Controller.
> + */.
> + uint8_t disable1; /**< First Disable bit, should be:.
> + - MSG_ENABLE: disable bit = 0).
> + - MSG_DISABLE: disable bit = 1.
> + */.
> + uint16_t lowerID; /**< ID lower bound, should be 11-bit value */.
> + uint8_t controller2; /**< Second CAN Controller, should be:.
> + - CAN1_CTRL: CAN1 Controller.
> + - CAN2_CTRL: CAN2 Controller.
> + */.
> + uint8_t disable2; /**< Second Disable bit, should be:.
> + - MSG_ENABLE: disable bit = 0.
> + - MSG_DISABLE: disable bit = 1.
> + */.
> + uint16_t upperID; /**< ID upper bound, should be 11-bit value and.
> + equal or greater than lowerID.
> + */.
> +} SFF_GPR_Entry;.
> +.
> +/**.
> + * @brief Extended ID Frame Format Entry structure.
> + */.
> +typedef struct {.
> + uint8_t controller; /**< CAN Controller, should be:.
> + - CAN1_CTRL: CAN1 Controller.
> + - CAN2_CTRL: CAN2 Controller.
> + */.
> + uint32_t ID_29; /**< Extend ID, shoud be 29-bit value */.
> +} EFF_Entry;.
> +.
> +.
> +/**.
> + * @brief Group of Extended ID Frame Format Entry structure.
> + */.
> +typedef struct {.
> + uint8_t controller1; /**< First CAN Controller, should be:.
> + - CAN1_CTRL: CAN1 Controller.
> + - CAN2_CTRL: CAN2 Controller.
> + */.
> + uint8_t controller2; /**< Second Disable bit, should be:.
> + - MSG_ENABLE: disable bit = 0(default).
> + - MSG_DISABLE: disable bit = 1.
> + */.
> + uint32_t lowerEID; /**< Extended ID lower bound, should be 29-bit value */.
> + uint32_t upperEID; /**< Extended ID upper bound, should be 29-bit value */.
> +} EFF_GPR_Entry;.
> +.
> +.
> +/**.
> + * @brief Acceptance Filter Section Table structure.
> + */.
> +typedef struct {.
> + FullCAN_Entry* FullCAN_Sec; /**< The pointer point to FullCAN_Entry */.
> + uint8_t FC_NumEntry; /**< FullCAN Entry Number */.
> + SFF_Entry* SFF_Sec; /**< The pointer point to SFF_Entry */.
> + uint8_t SFF_NumEntry; /**< Standard ID Entry Number */.
> + SFF_GPR_Entry* SFF_GPR_Sec; /**< The pointer point to SFF_GPR_Entry */.
> + uint8_t SFF_GPR_NumEntry; /**< Group Standard ID Entry Number */.
> + EFF_Entry* EFF_Sec; /**< The pointer point to EFF_Entry */.
> + uint8_t EFF_NumEntry; /**< Extended ID Entry Number */.
> + EFF_GPR_Entry* EFF_GPR_Sec; /**< The pointer point to EFF_GPR_Entry */.
> + uint8_t EFF_GPR_NumEntry; /**< Group Extended ID Entry Number */.
> +} AF_SectionDef;.
> +.
> +/**.
> + * @brief CAN call-back function type definitions.
> + */.
> +typedef void ( fnCANCbs_Type)();.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Macros -------------------------------------------------------------- */.
> +/** @defgroup CAN_Public_Macros.
> + * @{.
> + */.
> +.
> +/** Macro to determine if it is valid CAN peripheral */.
> +#define PARAM_CANx(x) ((((uint32_t*)x)==((uint32_t *)LPC_CAN1)) \.
> +||(((uint32_t*)x)==((uint32_t *)LPC_CAN2))).
> +.
> +#define PARAM_CANAFx(x) (((uint32_t*)x)== ((uint32_t*)LPC_CANAF)).
> +#define PARAM_CANAFRAMx(x) (((uint32_t*)x)== (uint32_t*)LPC_CANAF_RAM).
> +#define PARAM_CANCRx(x) (((uint32_t*)x)==((uint32_t*)LPC_CANCR)).
> +.
> +/** Macro to check Data to send valid */.
> +#define PARAM_I2S_DATA(data) ((data>=0)&&(data <= 0xFFFFFFFF)).
> +#define PRAM_I2S_FREQ(freq) ((freq>=16000)&&(freq <= 96000)).
> +.
> +/** Macro to check Pin Selection value */.
> +#define PARAM_RD1_PIN(n) ((n==CAN_RD1_P0_0)||(n==CAN_RD1_P0_21)).
> +#define PARAM_TD1_PIN(n) ((n==CAN_TD1_P0_1)||(n==CAN_TD1_P0_22)).
> +#define PARAM_RD2_PIN(n) ((n==CAN_RD2_P0_4)||(n==CAN_RD2_P2_7)).
> +#define PARAM_TD2_PIN(n) ((n==CAN_TD2_P0_5)||(n==CAN_TD2_P2_8)).
> +.
> +/** Macro to check Frame Identifier */.
> +#define PARAM_ID_11(n) ((n>>11)==0) /*-- 11 bit --*/.
> +#define PARAM_ID_29(n) ((n>>29)==0) /*-- 29 bit --*/.
> +.
> +#define PARAM_DLC(n) ((n>>4)==0) /*-- 4 bit --*/.
> +#define PARAM_ID_FORMAT(n) ((n==STD_ID_FORMAT)||(n==EXT_ID_FORMAT)).
> +#define PARAM_GRP_ID(x, y) ((x<=y)).
> +#define PARAM_FRAME_TYPE(n) ((n==DATA_FRAME)||(n==REMOTE_FRAME)).
> +.
> +/** Macro to check Control/Central Status type parameter */.
> +#define PARAM_CTRL_STS_TYPE(n) ((n==CANCTRL_GLOBAL_STS)||(n==CANCTRL_INT_CAP) \.
> +||(n==CANCTRL_ERR_WRN)||(n==CANCTRL_STS)).
> +#define PARAM_CR_STS_TYPE(n) ((n==CANCR_TX_STS)||(n==CANCR_RX_STS) \.
> +||(n==CANCR_MS)).
> +/** Macro to check AF Mode type parameter */.
> +#define PARAM_AFMODE_TYPE(n) ((n==CAN_Normal)||(n==CAN_AccOff) \.
> +||(n==CAN_AccBP)||(n==CAN_eFCAN)).
> +/** Macro to check Operation Mode */.
> +#define PARAM_MODE_TYPE(n) ((n==CAN_OPERATING_MODE)||(n==CAN_RESET_MODE) \.
> +||(n==CAN_LISTENONLY_MODE)||(n==CAN_SELFTEST_MODE) \.
> +||(n==CAN_TXPRIORITY_MODE)||(n==CAN_SLEEP_MODE) \.
> +||(n==CAN_RXPOLARITY_MODE)||(n==CAN_TEST_MODE)).
> +.
> +/** Macro define for struct AF_Section parameter */.
> +#define CAN1_CTRL ((uint8_t)(0)).
> +#define CAN2_CTRL ((uint8_t)(1)).
> +#define PARAM_CTRL(n) ((n==CAN1_CTRL)|(n==CAN2_CTRL)).
> +.
> +#define MSG_ENABLE ((uint8_t)(0)).
> +#define MSG_DISABLE ((uint8_t)(1)).
> +#define PARAM_MSG_DISABLE(n) ((n==MSG_ENABLE)|(n==MSG_DISABLE)).
> +.
> +/**Macro to check Interrupt Type parameter */.
> +#define PARAM_INT_EN_TYPE(n) ((n==CANINT_RIE)||(n==CANINT_TIE1) \.
> +||(n==CANINT_EIE)||(n==CANINT_DOIE) \.
> +||(n==CANINT_WUIE)||(n==CANINT_EPIE) \.
> +||(n==CANINT_ALIE)||(n==CANINT_BEIE) \.
> +||(n==CANINT_IDIE)||(n==CANINT_TIE2) \.
> +||(n==CANINT_TIE3)||(n==CANINT_FCE)).
> +.
> +/** Macro to check AFLUT Entry type */.
> +#define PARAM_AFLUT_ENTRY_TYPE(n) ((n==FULLCAN_ENTRY)||(n==EXPLICIT_STANDARD_ENTRY)\.
> +||(n==GROUP_STANDARD_ENTRY)||(n==EXPLICIT_EXTEND_ENTRY) \.
> +||(n==GROUP_EXTEND_ENTRY)).
> +#define PARAM_POSITION(n) ((n>=0)&&(n<512)).
> +.
> +/** CAN function pin selection defines */.
> +#define CAN_RD1_P0_0 ((uint8_t)(0)).
> +#define CAN_RD1_P0_21 ((uint8_t)(1)).
> +#define CAN_TD1_P0_1 ((uint8_t)(0)).
> +#define CAN_TD1_P0_22 ((uint8_t)(1)).
> +.
> +#define CAN_RD2_P0_4 ((uint8_t)(0)).
> +#define CAN_RD2_P2_7 ((uint8_t)(1)).
> +#define CAN_TD2_P0_5 ((uint8_t)(0)).
> +#define CAN_TD2_P2_8 ((uint8_t)(1)).
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup CAN_Public_Functions.
> + * @{.
> + */.
> +.
> +void CAN_Init(LPC_CAN_TypeDef *CANx, uint32_t baudrate);.
> +void CAN_DeInit(LPC_CAN_TypeDef *CANx);.
> +.
> +Status CAN_SendMsg(LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg);.
> +Status CAN_ReceiveMsg(LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg);.
> +CAN_ERROR FCAN_ReadObj(LPC_CANAF_TypeDef* CANAFx, CAN_MSG_Type *CAN_Msg);.
> +.
> +uint32_t CAN_GetCTRLStatus(LPC_CAN_TypeDef* CANx, CAN_CTRL_STS_Type arg);.
> +uint32_t CAN_GetCRStatus(LPC_CANCR_TypeDef* CANCRx, CAN_CR_STS_Type arg);.
> +void CAN_ModeConfig(LPC_CAN_TypeDef* CANx, CAN_MODE_Type mode,.
> + FunctionalState NewState);.
> +void CAN_SetBaudRate(LPC_CAN_TypeDef *CANx, uint32_t baudrate);.
> +.
> +void CAN_SetAFMode(LPC_CANAF_TypeDef* CANAFx, CAN_AFMODE_Type AFmode);.
> +CAN_ERROR CAN_SetupAFLUT(LPC_CANAF_TypeDef* CANAFx, AF_SectionDef* AFSection);.
> +CAN_ERROR CAN_LoadFullCANEntry(LPC_CAN_TypeDef* CANx, uint16_t ID);.
> +CAN_ERROR CAN_LoadExplicitEntry(LPC_CAN_TypeDef* CANx, uint32_t ID,.
> + CAN_ID_FORMAT_Type format);.
> +CAN_ERROR CAN_LoadGroupEntry(LPC_CAN_TypeDef* CANx, uint32_t lowerID,.
> + uint32_t upperID, CAN_ID_FORMAT_Type format);.
> +CAN_ERROR CAN_RemoveEntry(AFLUT_ENTRY_Type EntryType, uint16_t position);.
> +.
> +void CAN_SetupCBS(CAN_INT_EN_Type arg, fnCANCbs_Type* pnCANCbs);.
> +void CAN_IRQCmd(LPC_CAN_TypeDef* CANx, CAN_INT_EN_Type arg,.
> + FunctionalState NewState);.
> +void CAN_IntHandler(LPC_CAN_TypeDef* CANx);.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +#ifdef __cplusplus.
> +}.
> +#endif.
> +.
> +#endif /* LPC17XX_CAN_H_ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile b/arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile.omk
> new file mode 100644
> index 0000000..ae6be7d
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/clkpwr/Makefile.omk
> @@ -0,0 +1,8 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = clkpwr
> +
> +clkpwr_SOURCES = lpc17xx_clkpwr.c
> +include_HEADERS = lpc17xx_clkpwr.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.c b/arch/arm/mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.c
> new file mode 100644
> index 0000000..64d7b09
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.c
> @@ -0,0 +1,345 @@
> +/**.
> + * @file : lpc17xx_clkpwr.c.
> + * @brief : Contains all functions support for Clock and Power Control.
> + * firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 18. Mar. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **********************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @addtogroup CLKPWR.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_clkpwr.h".
> +#include "system_LPC17xx.h"
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup CLKPWR_Public_Functions.
> + * @{.
> + */.
> +.
> +/*********************************************************************//**.
> + * @brief Set value of each Peripheral Clock Selection.
> + * @param[in] ClkType Peripheral Clock Selection of each type,.
> + * should be one of the following:.
> + * - CLKPWR_PCLKSEL_WDT : WDT.
> + - CLKPWR_PCLKSEL_TIMER0 : Timer 0.
> + - CLKPWR_PCLKSEL_TIMER1 : Timer 1.
> + - CLKPWR_PCLKSEL_UART0 : UART 0.
> + - CLKPWR_PCLKSEL_UART1 : UART 1.
> + - CLKPWR_PCLKSEL_PWM1 : PWM 1.
> + - CLKPWR_PCLKSEL_I2C0 : I2C 0.
> + - CLKPWR_PCLKSEL_SPI : SPI.
> + - CLKPWR_PCLKSEL_SSP1 : SSP 1.
> + - CLKPWR_PCLKSEL_DAC : DAC.
> + - CLKPWR_PCLKSEL_ADC : ADC.
> + - CLKPWR_PCLKSEL_CAN1 : CAN 1.
> + - CLKPWR_PCLKSEL_CAN2 : CAN 2.
> + - CLKPWR_PCLKSEL_ACF : ACF.
> + - CLKPWR_PCLKSEL_QEI : QEI.
> + - CLKPWR_PCLKSEL_PCB : PCB.
> + - CLKPWR_PCLKSEL_I2C1 : I2C 1.
> + - CLKPWR_PCLKSEL_SSP0 : SSP 0.
> + - CLKPWR_PCLKSEL_TIMER2 : Timer 2.
> + - CLKPWR_PCLKSEL_TIMER3 : Timer 3.
> + - CLKPWR_PCLKSEL_UART2 : UART 2.
> + - CLKPWR_PCLKSEL_UART3 : UART 3.
> + - CLKPWR_PCLKSEL_I2C2 : I2C 2.
> + - CLKPWR_PCLKSEL_I2S : I2S.
> + - CLKPWR_PCLKSEL_RIT : RIT.
> + - CLKPWR_PCLKSEL_SYSCON : SYSCON.
> + - CLKPWR_PCLKSEL_MC : MC.
> +.
> + * @param[in] DivVal Value of divider, should be:.
> + * - CLKPWR_PCLKSEL_CCLK_DIV_4 : PCLK_peripheral = CCLK/4.
> + * - CLKPWR_PCLKSEL_CCLK_DIV_1 : PCLK_peripheral = CCLK/1.
> + * - CLKPWR_PCLKSEL_CCLK_DIV_2 : PCLK_peripheral = CCLK/2.
> + *.
> + * @return none.
> + **********************************************************************/.
> +void CLKPWR_SetPCLKDiv (uint32_t ClkType, uint32_t DivVal).
> +{.
> + uint32_t bitpos;.
> +.
> + bitpos = (ClkType < 32) ? (ClkType) : (ClkType - 32);.
> +.
> + /* PCLKSEL0 selected */.
> + if (ClkType < 32).
> + {.
> + /* Clear two bit at bit position */.
> + LPC_SC->PCLKSEL0 &= (~(CLKPWR_PCLKSEL_BITMASK(bitpos)));.
> +.
> + /* Set two selected bit */.
> + LPC_SC->PCLKSEL0 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal));.
> + }.
> + /* PCLKSEL1 selected */.
> + else.
> + {.
> + /* Clear two bit at bit position */.
> + LPC_SC->PCLKSEL1 &= ~(CLKPWR_PCLKSEL_BITMASK(bitpos));.
> +.
> + /* Set two selected bit */.
> + LPC_SC->PCLKSEL1 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal));.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Get current value of each Peripheral Clock Selection.
> + * @param[in] ClkType Peripheral Clock Selection of each type,.
> + * should be one of the following:.
> + * - CLKPWR_PCLKSEL_WDT : WDT.
> + - CLKPWR_PCLKSEL_TIMER0 : Timer 0.
> + - CLKPWR_PCLKSEL_TIMER1 : Timer 1.
> + - CLKPWR_PCLKSEL_UART0 : UART 0.
> + - CLKPWR_PCLKSEL_UART1 : UART 1.
> + - CLKPWR_PCLKSEL_PWM1 : PWM 1.
> + - CLKPWR_PCLKSEL_I2C0 : I2C 0.
> + - CLKPWR_PCLKSEL_SPI : SPI.
> + - CLKPWR_PCLKSEL_SSP1 : SSP 1.
> + - CLKPWR_PCLKSEL_DAC : DAC.
> + - CLKPWR_PCLKSEL_ADC : ADC.
> + - CLKPWR_PCLKSEL_CAN1 : CAN 1.
> + - CLKPWR_PCLKSEL_CAN2 : CAN 2.
> + - CLKPWR_PCLKSEL_ACF : ACF.
> + - CLKPWR_PCLKSEL_QEI : QEI.
> + - CLKPWR_PCLKSEL_PCB : PCB.
> + - CLKPWR_PCLKSEL_I2C1 : I2C 1.
> + - CLKPWR_PCLKSEL_SSP0 : SSP 0.
> + - CLKPWR_PCLKSEL_TIMER2 : Timer 2.
> + - CLKPWR_PCLKSEL_TIMER3 : Timer 3.
> + - CLKPWR_PCLKSEL_UART2 : UART 2.
> + - CLKPWR_PCLKSEL_UART3 : UART 3.
> + - CLKPWR_PCLKSEL_I2C2 : I2C 2.
> + - CLKPWR_PCLKSEL_I2S : I2S.
> + - CLKPWR_PCLKSEL_RIT : RIT.
> + - CLKPWR_PCLKSEL_SYSCON : SYSCON.
> + - CLKPWR_PCLKSEL_MC : MC.
> +.
> + * @return Value of Selected Peripheral Clock Selection.
> + **********************************************************************/.
> +uint32_t CLKPWR_GetPCLKSEL (uint32_t ClkType).
> +{.
> + uint32_t bitpos, retval;.
> +.
> + if (ClkType < 32).
> + {.
> + bitpos = ClkType;.
> + retval = LPC_SC->PCLKSEL0;.
> + }.
> + else.
> + {.
> + bitpos = ClkType - 32;.
> + retval = LPC_SC->PCLKSEL1;.
> + }.
> +.
> + retval = CLKPWR_PCLKSEL_GET(bitpos, retval);.
> + return retval;.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Get current value of each Peripheral Clock.
> + * @param[in] ClkType Peripheral Clock Selection of each type,.
> + * should be one of the following:.
> + * - CLKPWR_PCLKSEL_WDT : WDT.
> + - CLKPWR_PCLKSEL_TIMER0 : Timer 0.
> + - CLKPWR_PCLKSEL_TIMER1 : Timer 1.
> + - CLKPWR_PCLKSEL_UART0 : UART 0.
> + - CLKPWR_PCLKSEL_UART1 : UART 1.
> + - CLKPWR_PCLKSEL_PWM1 : PWM 1.
> + - CLKPWR_PCLKSEL_I2C0 : I2C 0.
> + - CLKPWR_PCLKSEL_SPI : SPI.
> + - CLKPWR_PCLKSEL_SSP1 : SSP 1.
> + - CLKPWR_PCLKSEL_DAC : DAC.
> + - CLKPWR_PCLKSEL_ADC : ADC.
> + - CLKPWR_PCLKSEL_CAN1 : CAN 1.
> + - CLKPWR_PCLKSEL_CAN2 : CAN 2.
> + - CLKPWR_PCLKSEL_ACF : ACF.
> + - CLKPWR_PCLKSEL_QEI : QEI.
> + - CLKPWR_PCLKSEL_PCB : PCB.
> + - CLKPWR_PCLKSEL_I2C1 : I2C 1.
> + - CLKPWR_PCLKSEL_SSP0 : SSP 0.
> + - CLKPWR_PCLKSEL_TIMER2 : Timer 2.
> + - CLKPWR_PCLKSEL_TIMER3 : Timer 3.
> + - CLKPWR_PCLKSEL_UART2 : UART 2.
> + - CLKPWR_PCLKSEL_UART3 : UART 3.
> + - CLKPWR_PCLKSEL_I2C2 : I2C 2.
> + - CLKPWR_PCLKSEL_I2S : I2S.
> + - CLKPWR_PCLKSEL_RIT : RIT.
> + - CLKPWR_PCLKSEL_SYSCON : SYSCON.
> + - CLKPWR_PCLKSEL_MC : MC.
> +.
> + * @return Value of Selected Peripheral Clock.
> + **********************************************************************/.
> +uint32_t CLKPWR_GetPCLK (uint32_t ClkType).
> +{.
> + uint32_t retval, div;.
> +.
> + retval = SystemCoreClock;.
> + div = CLKPWR_GetPCLKSEL(ClkType);.
> +.
> + switch (div).
> + {.
> + case 0:.
> + div = 4;.
> + break;.
> +.
> + case 1:.
> + div = 1;.
> + break;.
> +.
> + case 2:.
> + div = 2;.
> + break;.
> +.
> + case 3:.
> + div = 8;.
> + break;.
> + }.
> + retval /= div;.
> +.
> + return retval;.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Configure power supply for each peripheral according to NewState.
> + * @param[in] PPType Type of peripheral used to enable power,.
> + * should be one of the following:.
> + * - CLKPWR_PCONP_PCTIM0 : Timer 0.
> + - CLKPWR_PCONP_PCTIM1 : Timer 1.
> + - CLKPWR_PCONP_PCUART0 : UART 0.
> + - CLKPWR_PCONP_PCUART1 : UART 1.
> + - CLKPWR_PCONP_PCPWM1 : PWM 1.
> + - CLKPWR_PCONP_PCI2C0 : I2C 0.
> + - CLKPWR_PCONP_PCSPI : SPI.
> + - CLKPWR_PCONP_PCRTC : RTC.
> + - CLKPWR_PCONP_PCSSP1 : SSP 1.
> + - CLKPWR_PCONP_PCAD : ADC.
> + - CLKPWR_PCONP_PCAN1 : CAN 1.
> + - CLKPWR_PCONP_PCAN2 : CAN 2.
> + - CLKPWR_PCONP_PCGPIO : GPIO.
> + - CLKPWR_PCONP_PCRIT : RIT.
> + - CLKPWR_PCONP_PCMC : MC.
> + - CLKPWR_PCONP_PCQEI : QEI.
> + - CLKPWR_PCONP_PCI2C1 : I2C 1.
> + - CLKPWR_PCONP_PCSSP0 : SSP 0.
> + - CLKPWR_PCONP_PCTIM2 : Timer 2.
> + - CLKPWR_PCONP_PCTIM3 : Timer 3.
> + - CLKPWR_PCONP_PCUART2 : UART 2.
> + - CLKPWR_PCONP_PCUART3 : UART 3.
> + - CLKPWR_PCONP_PCI2C2 : I2C 2.
> + - CLKPWR_PCONP_PCI2S : I2S.
> + - CLKPWR_PCONP_PCGPDMA : GPDMA.
> + - CLKPWR_PCONP_PCENET : Ethernet.
> + - CLKPWR_PCONP_PCUSB : USB.
> + *.
> + * @param[in] NewState New state of Peripheral Power, should be:.
> + * - ENABLE : Enable power for this peripheral.
> + * - DISABLE : Disable power for this peripheral.
> + *.
> + * @return none.
> + **********************************************************************/.
> +void CLKPWR_ConfigPPWR (uint32_t PPType, FunctionalState NewState).
> +{.
> + if (NewState == ENABLE).
> + {.
> + LPC_SC->PCONP |= PPType & CLKPWR_PCONP_BITMASK;.
> + }.
> + else if (NewState == DISABLE).
> + {.
> + LPC_SC->PCONP &= (~PPType) & CLKPWR_PCONP_BITMASK;.
> + }.
> +}.
> +.
> +.
> +/**.
> + * @brief Enter Sleep mode with co-operated instruction by the Cortex-M3..
> + * @param[in] None.
> + * @return None.
> + */.
> +void CLKPWR_Sleep(void).
> +{.
> + LPC_SC->PCON = 0x00;.
> + /* Sleep Mode*/.
> + __WFI();.
> +}.
> +.
> +.
> +/**.
> + * @brief Enter Deep Sleep mode with co-operated instruction by the Cortex-M3..
> + * @param[in] None.
> + * @return None.
> + */.
> +void CLKPWR_DeepSleep(void).
> +{.
> + /* Deep-Sleep Mode, set SLEEPDEEP bit */.
> + SCB->SCR = 0x4;.
> + LPC_SC->PCON = 0x00;.
> + /* Sleep Mode*/.
> + __WFI();.
> +}.
> +.
> +.
> +/**.
> + * @brief Enter Power Down mode with co-operated instruction by the Cortex-M3..
> + * @param[in] None.
> + * @return None.
> + */.
> +void CLKPWR_PowerDown(void).
> +{.
> + /* Deep-Sleep Mode, set SLEEPDEEP bit */.
> + SCB->SCR = 0x4;.
> + LPC_SC->PCON = 0x01;.
> + /* Sleep Mode*/.
> + __WFI();.
> +}.
> +.
> +.
> +/**.
> + * @brief Enter Deep Power Down mode with co-operated instruction by the Cortex-M3..
> + * @param[in] None.
> + * @return None.
> + */.
> +void CLKPWR_DeepPowerDown(void).
> +{.
> + /* Deep-Sleep Mode, set SLEEPDEEP bit */.
> + SCB->SCR = 0x4;.
> + LPC_SC->PCON = 0x03;.
> + /* Sleep Mode*/.
> + __WFI();.
> +}.
> +.
> +.
> +/**.
> + * @brief Configure Brown-Out function in.
> + */.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.h b/arch/arm/mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.h
> new file mode 100644
> index 0000000..cb47275
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/clkpwr/lpc17xx_clkpwr.h
> @@ -0,0 +1,384 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_clkpwr.h.
> + * @brief : Contains all macro definitions and function prototypes.
> + * support for Clock and Power Control firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 18. Mar. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @defgroup CLKPWR.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC17XX_CLKPWR_H_.
> +#define LPC17XX_CLKPWR_H_.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx.h".
> +#include "lpc_types.h".
> +.
> +#ifdef __cplusplus.
> +extern "C".
> +{.
> +#endif.
> +.
> +.
> +/* Private Macros ------------------------------------------------------------- */.
> +/** @defgroup CLKPWR_Private_Macros.
> + * @{.
> + */.
> +.
> +/** @defgroup CLKPPWR_REGISTER_BIT_DEFINITIONS.
> + * @{.
> + */.
> +.
> +/* Clock source selection multiplexer definition */.
> +/** Internal RC oscillator */.
> +#define CLKPWR_CLKSRCSEL_CLKSRC_IRC ((uint32_t)(0x00)).
> +/** Main oscillator */.
> +#define CLKPWR_CLKSRCSEL_CLKSRC_MAINOSC ((uint32_t)(0x01)).
> +/** RTC oscillator */.
> +#define CLKPWR_CLKSRCSEL_CLKSRC_RTC ((uint32_t)(0x02)).
> +/** Clock source selection bit mask */.
> +#define CLKPWR_CLKSRCSEL_BITMASK ((uint32_t)(0x03)).
> +.
> +.
> +/* Clock Output Configuration register definition */.
> +/** Selects the CPU clock as the CLKOUT source */.
> +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_CPU ((uint32_t)(0x00)).
> +/** Selects the main oscillator as the CLKOUT source */.
> +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_MAINOSC ((uint32_t)(0x01)).
> +/** Selects the Internal RC oscillator as the CLKOUT source */.
> +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_RC ((uint32_t)(0x02)).
> +/** Selects the USB clock as the CLKOUT source */.
> +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_USB ((uint32_t)(0x03)).
> +/** Selects the RTC oscillator as the CLKOUT source */.
> +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_RTC ((uint32_t)(0x04)).
> +/** Integer value to divide the output clock by, minus one */.
> +#define CLKPWR_CLKOUTCFG_CLKOUTDIV(n) ((uint32_t)((n&0x0F)<<4)).
> +/** CLKOUT enable control */.
> +#define CLKPWR_CLKOUTCFG_CLKOUT_EN ((uint32_t)(1<<8)).
> +/** CLKOUT activity indication */.
> +#define CLKPWR_CLKOUTCFG_CLKOUT_ACT ((uint32_t)(1<<9)).
> +/** Clock source selection bit mask */.
> +#define CLKPWR_CLKOUTCFG_BITMASK ((uint32_t)(0x3FF)).
> +.
> +.
> +/* PLL 0 control definition */.
> +/** PLL 0 control enable */.
> +#define CLKPWR_PLL0CON_ENABLE ((uint32_t)(0x01)).
> +/** PLL 0 control connect */.
> +#define CLKPWR_PLL0CON_CONNECT ((uint32_t)(0x02)).
> +/** PLL 0 control bit mask */.
> +#define CLKPWR_PLL0CON_BITMASK ((uint32_t)(0x03)).
> +.
> +.
> +/* PLL 0 Configuration register definition */.
> +/** PLL 0 Configuration MSEL field */.
> +#define CLKPWR_PLL0CFG_MSEL(n) ((uint32_t)(n&0x7FFF)).
> +/** PLL 0 Configuration NSEL field */.
> +#define CLKPWR_PLL0CFG_NSEL(n) ((uint32_t)((n<<16)&0xFF0000)).
> +/** PLL 0 Configuration bit mask */.
> +#define CLKPWR_PLL0CFG_BITMASK ((uint32_t)(0xFF7FFF)).
> +.
> +.
> +/* PLL 0 status definition */.
> +/** PLL 0 MSEL value */.
> +#define CLKPWR_PLL0STAT_MSEL(n) ((uint32_t)(n&0x7FFF)).
> +/** PLL NSEL get value */.
> +#define CLKPWR_PLL0STAT_NSEL(n) ((uint32_t)((n>>16)&0xFF)).
> +/** PLL status enable bit */.
> +#define CLKPWR_PLL0STAT_PLLE ((uint32_t)(1<<24)).
> +/** PLL status Connect bit */.
> +#define CLKPWR_PLL0STAT_PLLC ((uint32_t)(1<<25)).
> +/** PLL status lock */.
> +#define CLKPWR_PLL0STAT_PLOCK ((uint32_t)(1<<26)).
> +.
> +.
> +/* PLL0 Feed register definition */.
> +/** PLL0 Feed bit mask */.
> +#define CLKPWR_PLL0FEED_BITMASK ((uint32_t)0xFF).
> +.
> +.
> +/* USB PLL control definition */.
> +/** USB PLL control enable */.
> +#define CLKPWR_PLL1CON_ENABLE ((uint32_t)(0x01)).
> +/** USB PLL control connect */.
> +#define CLKPWR_PLL1CON_CONNECT ((uint32_t)(0x02)).
> +/** USB PLL control bit mask */.
> +#define CLKPWR_PLL1CON_BITMASK ((uint32_t)(0x03)).
> +.
> +.
> +/* USB PLL configuration definition */.
> +/** USB PLL MSEL set value */.
> +#define CLKPWR_PLL1CFG_MSEL(n) ((uint32_t)(n&0x1F)).
> +/** USB PLL PSEL set value */.
> +#define CLKPWR_PLL1CFG_PSEL(n) ((uint32_t)((n&0x03)<<5)).
> +/** USB PLL configuration bit mask */.
> +#define CLKPWR_PLL1CFG_BITMASK ((uint32_t)(0x7F)).
> +.
> +.
> +/* USB PLL status definition */.
> +/** USB PLL MSEL get value */.
> +#define CLKPWR_PLL1STAT_MSEL(n) ((uint32_t)(n&0x1F)).
> +/** USB PLL PSEL get value */.
> +#define CLKPWR_PLL1STAT_PSEL(n) ((uint32_t)((n>>5)&0x03)).
> +/** USB PLL status enable bit */.
> +#define CLKPWR_PLL1STAT_PLLE ((uint32_t)(1<<8)).
> +/** USB PLL status Connect bit */.
> +#define CLKPWR_PLL1STAT_PLLC ((uint32_t)(1<<9)).
> +/** USB PLL status lock */.
> +#define CLKPWR_PLL1STAT_PLOCK ((uint32_t)(1<<10)).
> +.
> +.
> +/* PLL1 Feed register definition */.
> +/** PLL1 Feed bit mask */.
> +#define CLKPWR_PLL1FEED_BITMASK ((uint32_t)0xFF).
> +.
> +.
> +/* CPU Clock Configuration register definition */.
> +/** CPU Clock configuration bit mask */.
> +#define CLKPWR_CCLKCFG_BITMASK ((uint32_t)(0xFF)).
> +.
> +/* USB Clock Configuration register definition */.
> +/** USB Clock Configuration bit mask */.
> +#define CLKPWR_USBCLKCFG_BITMASK ((uint32_t)(0x0F)).
> +.
> +/* IRC Trim register definition */.
> +/** IRC Trim bit mask */.
> +#define CLKPWR_IRCTRIM_BITMASK ((uint32_t)(0x0F)).
> +.
> +.
> +/* Peripheral clock divider bit position definition */.
> +/** Peripheral Clock Selection 0 mask bit */.
> +#define CLKPWR_PCLKSEL0_BITMASK ((uint32_t)(0xFFF3F3FF)).
> +/** Peripheral Clock Selection 1 mask bit */.
> +#define CLKPWR_PCLKSEL1_BITMASK ((uint32_t)(0xFCF3F0F3)).
> +.
> +.
> +/** Macro to set peripheral clock of each type.
> + * p: position of two bits that hold divider of peripheral clock.
> + * n: value of divider of peripheral clock to be set */.
> +#define CLKPWR_PCLKSEL_SET(p,n) _SBF(p,n).
> +/** Macro to mask peripheral clock of each type */.
> +#define CLKPWR_PCLKSEL_BITMASK(p) _SBF(p,0x03).
> +/** Macro to get peripheral clock of each type */.
> +#define CLKPWR_PCLKSEL_GET(p, n) ((uint32_t)((n>>p)&0x03)).
> +.
> +.
> +/* Power Mode Control register definition */.
> +/** Power mode control bit 0 */.
> +#define CLKPWR_PCON_PM0 ((uint32_t)(1<<0)).
> +/** Power mode control bit 1 */.
> +#define CLKPWR_PCON_PM1 ((uint32_t)(1<<1)).
> +/** Brown-Out Reduced Power Mode */.
> +#define CLKPWR_PCON_BODPDM ((uint32_t)(1<<2)).
> +/** Brown-Out Global Disable */.
> +#define CLKPWR_PCON_BOGD ((uint32_t)(1<<3)).
> +/** Brown Out Reset Disable */.
> +#define CLKPWR_PCON_BORD ((uint32_t)(1<<4)).
> +/** Sleep Mode entry flag */.
> +#define CLKPWR_PCON_SMFLAG ((uint32_t)(1<<8)).
> +/** Deep Sleep entry flag */.
> +#define CLKPWR_PCON_DSFLAG ((uint32_t)(1<<9)).
> +/** Power-down entry flag */.
> +#define CLKPWR_PCON_PDFLAG ((uint32_t)(1<<10)).
> +/** Deep Power-down entry flag */.
> +#define CLKPWR_PCON_DPDFLAG ((uint32_t)(1<<11)).
> +.
> +.
> +/** Power Control for Peripherals bit mask */.
> +#define CLKPWR_PCONP_BITMASK 0xEFEFF7DE.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Macros -------------------------------------------------------------- */.
> +/** @defgroup CLKPWR_Public_Macros.
> + * @{.
> + */.
> +.
> +/**********************************************************************.
> + * Peripheral Clock Selection Definitions.
> + **********************************************************************/.
> +/** Peripheral clock divider bit position for WDT */.
> +#define CLKPWR_PCLKSEL_WDT ((uint32_t)(0)).
> +/** Peripheral clock divider bit position for TIMER0 */.
> +#define CLKPWR_PCLKSEL_TIMER0 ((uint32_t)(2)).
> +/** Peripheral clock divider bit position for TIMER1 */.
> +#define CLKPWR_PCLKSEL_TIMER1 ((uint32_t)(4)).
> +/** Peripheral clock divider bit position for UART0 */.
> +#define CLKPWR_PCLKSEL_UART0 ((uint32_t)(6)).
> +/** Peripheral clock divider bit position for UART1 */.
> +#define CLKPWR_PCLKSEL_UART1 ((uint32_t)(8)).
> +/** Peripheral clock divider bit position for PWM1 */.
> +#define CLKPWR_PCLKSEL_PWM1 ((uint32_t)(12)).
> +/** Peripheral clock divider bit position for I2C0 */.
> +#define CLKPWR_PCLKSEL_I2C0 ((uint32_t)(14)).
> +/** Peripheral clock divider bit position for SPI */.
> +#define CLKPWR_PCLKSEL_SPI ((uint32_t)(16)).
> +/** Peripheral clock divider bit position for SSP1 */.
> +#define CLKPWR_PCLKSEL_SSP1 ((uint32_t)(20)).
> +/** Peripheral clock divider bit position for DAC */.
> +#define CLKPWR_PCLKSEL_DAC ((uint32_t)(22)).
> +/** Peripheral clock divider bit position for ADC */.
> +#define CLKPWR_PCLKSEL_ADC ((uint32_t)(24)).
> +/** Peripheral clock divider bit position for CAN1 */.
> +#define CLKPWR_PCLKSEL_CAN1 ((uint32_t)(26)).
> +/** Peripheral clock divider bit position for CAN2 */.
> +#define CLKPWR_PCLKSEL_CAN2 ((uint32_t)(28)).
> +/** Peripheral clock divider bit position for ACF */.
> +#define CLKPWR_PCLKSEL_ACF ((uint32_t)(30)).
> +/** Peripheral clock divider bit position for QEI */.
> +#define CLKPWR_PCLKSEL_QEI ((uint32_t)(32)).
> +/** Peripheral clock divider bit position for PCB */.
> +#define CLKPWR_PCLKSEL_PCB ((uint32_t)(36)).
> +/** Peripheral clock divider bit position for I2C1 */.
> +#define CLKPWR_PCLKSEL_I2C1 ((uint32_t)(38)).
> +/** Peripheral clock divider bit position for SSP0 */.
> +#define CLKPWR_PCLKSEL_SSP0 ((uint32_t)(42)).
> +/** Peripheral clock divider bit position for TIMER2 */.
> +#define CLKPWR_PCLKSEL_TIMER2 ((uint32_t)(44)).
> +/** Peripheral clock divider bit position for TIMER3 */.
> +#define CLKPWR_PCLKSEL_TIMER3 ((uint32_t)(46)).
> +/** Peripheral clock divider bit position for UART2 */.
> +#define CLKPWR_PCLKSEL_UART2 ((uint32_t)(48)).
> +/** Peripheral clock divider bit position for UART3 */.
> +#define CLKPWR_PCLKSEL_UART3 ((uint32_t)(50)).
> +/** Peripheral clock divider bit position for I2C2 */.
> +#define CLKPWR_PCLKSEL_I2C2 ((uint32_t)(52)).
> +/** Peripheral clock divider bit position for I2S */.
> +#define CLKPWR_PCLKSEL_I2S ((uint32_t)(54)).
> +/** Peripheral clock divider bit position for RIT */.
> +#define CLKPWR_PCLKSEL_RIT ((uint32_t)(58)).
> +/** Peripheral clock divider bit position for SYSCON */.
> +#define CLKPWR_PCLKSEL_SYSCON ((uint32_t)(60)).
> +/** Peripheral clock divider bit position for MC */.
> +#define CLKPWR_PCLKSEL_MC ((uint32_t)(62)).
> +.
> +/** Macro for Peripheral Clock Selection register bit values.
> + * Note: When CCLK_DIV_8, Peripherals clock is selected to.
> + * PCLK_xyz = CCLK/8 except for CAN1, CAN2, and CAN filtering.
> + * when 11selects PCLK_xyz = CCLK/6 */.
> +/* Peripheral clock divider is set to 4 from CCLK */.
> +#define CLKPWR_PCLKSEL_CCLK_DIV_4 ((uint32_t)(0)).
> +/** Peripheral clock divider is the same with CCLK */.
> +#define CLKPWR_PCLKSEL_CCLK_DIV_1 ((uint32_t)(1)).
> +/** Peripheral clock divider is set to 2 from CCLK */.
> +#define CLKPWR_PCLKSEL_CCLK_DIV_2 ((uint32_t)(2)).
> +.
> +.
> +/********************************************************************.
> +* Power Control for Peripherals Definitions.
> +**********************************************************************/.
> +/** Timer/Counter 0 power/clock control bit */.
> +#define CLKPWR_PCONP_PCTIM0 ((uint32_t)(1<<1)).
> +/* Timer/Counter 1 power/clock control bit */.
> +#define CLKPWR_PCONP_PCTIM1 ((uint32_t)(1<<2)).
> +/** UART0 power/clock control bit */.
> +#define CLKPWR_PCONP_PCUART0 ((uint32_t)(1<<3)).
> +/** UART1 power/clock control bit */.
> +#define CLKPWR_PCONP_PCUART1 ((uint32_t)(1<<4)).
> +/** PWM1 power/clock control bit */.
> +#define CLKPWR_PCONP_PCPWM1 ((uint32_t)(1<<6)).
> +/** The I2C0 interface power/clock control bit */.
> +#define CLKPWR_PCONP_PCI2C0 ((uint32_t)(1<<7)).
> +/** The SPI interface power/clock control bit */.
> +#define CLKPWR_PCONP_PCSPI ((uint32_t)(1<<8)).
> +/** The RTC power/clock control bit */.
> +#define CLKPWR_PCONP_PCRTC ((uint32_t)(1<<9)).
> +/** The SSP1 interface power/clock control bit */.
> +#define CLKPWR_PCONP_PCSSP1 ((uint32_t)(1<<10)).
> +/** A/D converter 0 (ADC0) power/clock control bit */.
> +#define CLKPWR_PCONP_PCAD ((uint32_t)(1<<12)).
> +/** CAN Controller 1 power/clock control bit */.
> +#define CLKPWR_PCONP_PCAN1 ((uint32_t)(1<<13)).
> +/** CAN Controller 2 power/clock control bit */.
> +#define CLKPWR_PCONP_PCAN2 ((uint32_t)(1<<14)).
> +/** GPIO power/clock control bit */.
> +#define CLKPWR_PCONP_PCGPIO ((uint32_t)(1<<15)).
> +/** Repetitive Interrupt Timer power/clock control bit */.
> +#define CLKPWR_PCONP_PCRIT ((uint32_t)(1<<16)).
> +/** Motor Control PWM */.
> +#define CLKPWR_PCONP_PCMC ((uint32_t)(1<<17)).
> +/** Quadrature Encoder Interface power/clock control bit */.
> +#define CLKPWR_PCONP_PCQEI ((uint32_t)(1<<18)).
> +/** The I2C1 interface power/clock control bit */.
> +#define CLKPWR_PCONP_PCI2C1 ((uint32_t)(1<<19)).
> +/** The SSP0 interface power/clock control bit */.
> +#define CLKPWR_PCONP_PCSSP0 ((uint32_t)(1<<21)).
> +/** Timer 2 power/clock control bit */.
> +#define CLKPWR_PCONP_PCTIM2 ((uint32_t)(1<<22)).
> +/** Timer 3 power/clock control bit */.
> +#define CLKPWR_PCONP_PCTIM3 ((uint32_t)(1<<23)).
> +/** UART 2 power/clock control bit */.
> +#define CLKPWR_PCONP_PCUART2 ((uint32_t)(1<<24)).
> +/** UART 3 power/clock control bit */.
> +#define CLKPWR_PCONP_PCUART3 ((uint32_t)(1<<25)).
> +/** I2C interface 2 power/clock control bit */.
> +#define CLKPWR_PCONP_PCI2C2 ((uint32_t)(1<<26)).
> +/** I2S interface power/clock control bit*/.
> +#define CLKPWR_PCONP_PCI2S ((uint32_t)(1<<27)).
> +/** GP DMA function power/clock control bit*/.
> +#define CLKPWR_PCONP_PCGPDMA ((uint32_t)(1<<29)).
> +/** Ethernet block power/clock control bit*/.
> +#define CLKPWR_PCONP_PCENET ((uint32_t)(1<<30)).
> +/** USB interface power/clock control bit*/.
> +#define CLKPWR_PCONP_PCUSB ((uint32_t)(1<<31)).
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup CLKPWR_Public_Functions.
> + * @{.
> + */.
> +.
> +void CLKPWR_SetPCLKDiv (uint32_t ClkType, uint32_t DivVal);.
> +uint32_t CLKPWR_GetPCLKSEL (uint32_t ClkType);.
> +uint32_t CLKPWR_GetPCLK (uint32_t ClkType);.
> +void CLKPWR_ConfigPPWR (uint32_t PPType, FunctionalState NewState);.
> +void CLKPWR_Sleep(void);.
> +void CLKPWR_DeepSleep(void);.
> +void CLKPWR_PowerDown(void);.
> +void CLKPWR_DeepPowerDown(void);.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +#ifdef __cplusplus.
> +}.
> +#endif.
> +.
> +#endif /* LPC17XX_CLKPWR_H_ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/core/Makefile b/arch/arm/mach-lpc17cmsis/libs/core/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/core/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/core/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/core/Makefile.omk
> new file mode 100644
> index 0000000..98c22ef
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/core/Makefile.omk
> @@ -0,0 +1,5 @@
> +# -*- makefile -*-
> +
> +lib_obj_SOURCES = core_cm3.c
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/core/core_cm3.c b/arch/arm/mach-lpc17cmsis/libs/core/core_cm3.c
> new file mode 100644
> index 0000000..56fddc5
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/core/core_cm3.c
> @@ -0,0 +1,784 @@
> +/**************************************************************************//**.
> + * @file core_cm3.c.
> + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Source File.
> + * @version V1.30.
> + * @date 30. October 2009.
> + *.
> + * @note.
> + * Copyright (C) 2009 ARM Limited. All rights reserved..
> + *.
> + * @par.
> + * ARM Limited (ARM) is supplying this software for use with Cortex-M .
> + * processor based microcontrollers. This file can be freely distributed .
> + * within development tools that are supporting such ARM based processors. .
> + *.
> + * @par.
> + * 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..
> + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR.
> + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER..
> + *.
> + ******************************************************************************/.
> +.
> +#include <stdint.h>.
> +.
> +/* define compiler specific symbols */.
> +#if defined ( __CC_ARM ).
> + #define __ASM __asm /*!< asm keyword for ARM Compiler */.
> + #define __INLINE __inline /*!< inline keyword for ARM Compiler */.
> +.
> +#elif defined ( __ICCARM__ ).
> + #define __ASM __asm /*!< asm keyword for IAR Compiler */.
> + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */.
> +.
> +#elif defined ( __GNUC__ ).
> + #define __ASM __asm /*!< asm keyword for GNU Compiler */.
> + #define __INLINE inline /*!< inline keyword for GNU Compiler */.
> +.
> +#elif defined ( __TASKING__ ).
> + #define __ASM __asm /*!< asm keyword for TASKING Compiler */.
> + #define __INLINE inline /*!< inline keyword for TASKING Compiler */.
> +.
> +#endif.
> +.
> +.
> +/* ################### Compiler specific Intrinsics ########################### */.
> +.
> +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/.
> +/* ARM armcc specific functions */.
> +.
> +/**.
> + * @brief Return the Process Stack Pointer.
> + *.
> + * @return ProcessStackPointer.
> + *.
> + * Return the actual process stack pointer.
> + */.
> +__ASM uint32_t __get_PSP(void).
> +{.
> + mrs r0, psp.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Set the Process Stack Pointer.
> + *.
> + * @param topOfProcStack Process Stack Pointer.
> + *.
> + * Assign the value ProcessStackPointer to the MSP .
> + * (process stack pointer) Cortex processor register.
> + */.
> +__ASM void __set_PSP(uint32_t topOfProcStack).
> +{.
> + msr psp, r0.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Return the Main Stack Pointer.
> + *.
> + * @return Main Stack Pointer.
> + *.
> + * Return the current value of the MSP (main stack pointer).
> + * Cortex processor register.
> + */.
> +__ASM uint32_t __get_MSP(void).
> +{.
> + mrs r0, msp.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Set the Main Stack Pointer.
> + *.
> + * @param topOfMainStack Main Stack Pointer.
> + *.
> + * Assign the value mainStackPointer to the MSP .
> + * (main stack pointer) Cortex processor register.
> + */.
> +__ASM void __set_MSP(uint32_t mainStackPointer).
> +{.
> + msr msp, r0.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Reverse byte order in unsigned short value.
> + *.
> + * @param value value to reverse.
> + * @return reversed value.
> + *.
> + * Reverse byte order in unsigned short value.
> + */.
> +__ASM uint32_t __REV16(uint16_t value).
> +{.
> + rev16 r0, r0.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Reverse byte order in signed short value with sign extension to integer.
> + *.
> + * @param value value to reverse.
> + * @return reversed value.
> + *.
> + * Reverse byte order in signed short value with sign extension to integer.
> + */.
> +__ASM int32_t __REVSH(int16_t value).
> +{.
> + revsh r0, r0.
> + bx lr.
> +}.
> +.
> +.
> +#if (__ARMCC_VERSION < 400000).
> +.
> +/**.
> + * @brief Remove the exclusive lock created by ldrex.
> + *.
> + * Removes the exclusive lock which is created by ldrex..
> + */.
> +__ASM void __CLREX(void).
> +{.
> + clrex.
> +}.
> +.
> +/**.
> + * @brief Return the Base Priority value.
> + *.
> + * @return BasePriority.
> + *.
> + * Return the content of the base priority register.
> + */.
> +__ASM uint32_t __get_BASEPRI(void).
> +{.
> + mrs r0, basepri.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Set the Base Priority value.
> + *.
> + * @param basePri BasePriority.
> + *.
> + * Set the base priority register.
> + */.
> +__ASM void __set_BASEPRI(uint32_t basePri).
> +{.
> + msr basepri, r0.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Return the Priority Mask value.
> + *.
> + * @return PriMask.
> + *.
> + * Return state of the priority mask bit from the priority mask register.
> + */.
> +__ASM uint32_t __get_PRIMASK(void).
> +{.
> + mrs r0, primask.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Set the Priority Mask value.
> + *.
> + * @param priMask PriMask.
> + *.
> + * Set the priority mask bit in the priority mask register.
> + */.
> +__ASM void __set_PRIMASK(uint32_t priMask).
> +{.
> + msr primask, r0.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Return the Fault Mask value.
> + *.
> + * @return FaultMask.
> + *.
> + * Return the content of the fault mask register.
> + */.
> +__ASM uint32_t __get_FAULTMASK(void).
> +{.
> + mrs r0, faultmask.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Set the Fault Mask value.
> + *.
> + * @param faultMask faultMask value.
> + *.
> + * Set the fault mask register.
> + */.
> +__ASM void __set_FAULTMASK(uint32_t faultMask).
> +{.
> + msr faultmask, r0.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Return the Control Register value.
> + * .
> + * @return Control value.
> + *.
> + * Return the content of the control register.
> + */.
> +__ASM uint32_t __get_CONTROL(void).
> +{.
> + mrs r0, control.
> + bx lr.
> +}.
> +.
> +/**.
> + * @brief Set the Control Register value.
> + *.
> + * @param control Control value.
> + *.
> + * Set the control register.
> + */.
> +__ASM void __set_CONTROL(uint32_t control).
> +{.
> + msr control, r0.
> + bx lr.
> +}.
> +.
> +#endif /* __ARMCC_VERSION */ .
> +.
> +.
> +.
> +#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/.
> +/* IAR iccarm specific functions */.
> +#pragma diag_suppress=Pe940.
> +.
> +/**.
> + * @brief Return the Process Stack Pointer.
> + *.
> + * @return ProcessStackPointer.
> + *.
> + * Return the actual process stack pointer.
> + */.
> +uint32_t __get_PSP(void).
> +{.
> + __ASM("mrs r0, psp");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief Set the Process Stack Pointer.
> + *.
> + * @param topOfProcStack Process Stack Pointer.
> + *.
> + * Assign the value ProcessStackPointer to the MSP .
> + * (process stack pointer) Cortex processor register.
> + */.
> +void __set_PSP(uint32_t topOfProcStack).
> +{.
> + __ASM("msr psp, r0");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief Return the Main Stack Pointer.
> + *.
> + * @return Main Stack Pointer.
> + *.
> + * Return the current value of the MSP (main stack pointer).
> + * Cortex processor register.
> + */.
> +uint32_t __get_MSP(void).
> +{.
> + __ASM("mrs r0, msp");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief Set the Main Stack Pointer.
> + *.
> + * @param topOfMainStack Main Stack Pointer.
> + *.
> + * Assign the value mainStackPointer to the MSP .
> + * (main stack pointer) Cortex processor register.
> + */.
> +void __set_MSP(uint32_t topOfMainStack).
> +{.
> + __ASM("msr msp, r0");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief Reverse byte order in unsigned short value.
> + *.
> + * @param value value to reverse.
> + * @return reversed value.
> + *.
> + * Reverse byte order in unsigned short value.
> + */.
> +uint32_t __REV16(uint16_t value).
> +{.
> + __ASM("rev16 r0, r0");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief Reverse bit order of value.
> + *.
> + * @param value value to reverse.
> + * @return reversed value.
> + *.
> + * Reverse bit order of value.
> + */.
> +uint32_t __RBIT(uint32_t value).
> +{.
> + __ASM("rbit r0, r0");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief LDR Exclusive (8 bit).
> + *.
> + * @param *addr address pointer.
> + * @return value of (*address).
> + *.
> + * Exclusive LDR command for 8 bit values).
> + */.
> +uint8_t __LDREXB(uint8_t *addr).
> +{.
> + __ASM("ldrexb r0, [r0]");.
> + __ASM("bx lr"); .
> +}.
> +.
> +/**.
> + * @brief LDR Exclusive (16 bit).
> + *.
> + * @param *addr address pointer.
> + * @return value of (*address).
> + *.
> + * Exclusive LDR command for 16 bit values.
> + */.
> +uint16_t __LDREXH(uint16_t *addr).
> +{.
> + __ASM("ldrexh r0, [r0]");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief LDR Exclusive (32 bit).
> + *.
> + * @param *addr address pointer.
> + * @return value of (*address).
> + *.
> + * Exclusive LDR command for 32 bit values.
> + */.
> +uint32_t __LDREXW(uint32_t *addr).
> +{.
> + __ASM("ldrex r0, [r0]");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief STR Exclusive (8 bit).
> + *.
> + * @param value value to store.
> + * @param *addr address pointer.
> + * @return successful / failed.
> + *.
> + * Exclusive STR command for 8 bit values.
> + */.
> +uint32_t __STREXB(uint8_t value, uint8_t *addr).
> +{.
> + __ASM("strexb r0, r0, [r1]");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief STR Exclusive (16 bit).
> + *.
> + * @param value value to store.
> + * @param *addr address pointer.
> + * @return successful / failed.
> + *.
> + * Exclusive STR command for 16 bit values.
> + */.
> +uint32_t __STREXH(uint16_t value, uint16_t *addr).
> +{.
> + __ASM("strexh r0, r0, [r1]");.
> + __ASM("bx lr");.
> +}.
> +.
> +/**.
> + * @brief STR Exclusive (32 bit).
> + *.
> + * @param value value to store.
> + * @param *addr address pointer.
> + * @return successful / failed.
> + *.
> + * Exclusive STR command for 32 bit values.
> + */.
> +uint32_t __STREXW(uint32_t value, uint32_t *addr).
> +{.
> + __ASM("strex r0, r0, [r1]");.
> + __ASM("bx lr");.
> +}.
> +.
> +#pragma diag_default=Pe940.
> +.
> +.
> +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/.
> +/* GNU gcc specific functions */.
> +.
> +/**.
> + * @brief Return the Process Stack Pointer.
> + *.
> + * @return ProcessStackPointer.
> + *.
> + * Return the actual process stack pointer.
> + */.
> +uint32_t __get_PSP(void) __attribute__( ( naked ) );.
> +uint32_t __get_PSP(void).
> +{.
> + uint32_t result=0;.
> +.
> + __ASM volatile ("MRS %0, psp\n\t" .
> + "MOV r0, %0 \n\t".
> + "BX lr \n\t" : "=r" (result) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief Set the Process Stack Pointer.
> + *.
> + * @param topOfProcStack Process Stack Pointer.
> + *.
> + * Assign the value ProcessStackPointer to the MSP .
> + * (process stack pointer) Cortex processor register.
> + */.
> +void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) );.
> +void __set_PSP(uint32_t topOfProcStack).
> +{.
> + __ASM volatile ("MSR psp, %0\n\t".
> + "BX lr \n\t" : : "r" (topOfProcStack) );.
> +}.
> +.
> +/**.
> + * @brief Return the Main Stack Pointer.
> + *.
> + * @return Main Stack Pointer.
> + *.
> + * Return the current value of the MSP (main stack pointer).
> + * Cortex processor register.
> + */.
> +uint32_t __get_MSP(void) __attribute__( ( naked ) );.
> +uint32_t __get_MSP(void).
> +{.
> + uint32_t result=0;.
> +.
> + __ASM volatile ("MRS %0, msp\n\t" .
> + "MOV r0, %0 \n\t".
> + "BX lr \n\t" : "=r" (result) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief Set the Main Stack Pointer.
> + *.
> + * @param topOfMainStack Main Stack Pointer.
> + *.
> + * Assign the value mainStackPointer to the MSP .
> + * (main stack pointer) Cortex processor register.
> + */.
> +void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) );.
> +void __set_MSP(uint32_t topOfMainStack).
> +{.
> + __ASM volatile ("MSR msp, %0\n\t".
> + "BX lr \n\t" : : "r" (topOfMainStack) );.
> +}.
> +.
> +/**.
> + * @brief Return the Base Priority value.
> + *.
> + * @return BasePriority.
> + *.
> + * Return the content of the base priority register.
> + */.
> +uint32_t __get_BASEPRI(void).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief Set the Base Priority value.
> + *.
> + * @param basePri BasePriority.
> + *.
> + * Set the base priority register.
> + */.
> +void __set_BASEPRI(uint32_t value).
> +{.
> + __ASM volatile ("MSR basepri, %0" : : "r" (value) );.
> +}.
> +.
> +/**.
> + * @brief Return the Priority Mask value.
> + *.
> + * @return PriMask.
> + *.
> + * Return state of the priority mask bit from the priority mask register.
> + */.
> +uint32_t __get_PRIMASK(void).
> +{.
> + uint32_t result=0;.
> +.
> + __ASM volatile ("MRS %0, primask" : "=r" (result) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief Set the Priority Mask value.
> + *.
> + * @param priMask PriMask.
> + *.
> + * Set the priority mask bit in the priority mask register.
> + */.
> +void __set_PRIMASK(uint32_t priMask).
> +{.
> + __ASM volatile ("MSR primask, %0" : : "r" (priMask) );.
> +}.
> +.
> +/**.
> + * @brief Return the Fault Mask value.
> + *.
> + * @return FaultMask.
> + *.
> + * Return the content of the fault mask register.
> + */.
> +uint32_t __get_FAULTMASK(void).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("MRS %0, faultmask" : "=r" (result) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief Set the Fault Mask value.
> + *.
> + * @param faultMask faultMask value.
> + *.
> + * Set the fault mask register.
> + */.
> +void __set_FAULTMASK(uint32_t faultMask).
> +{.
> + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );.
> +}.
> +.
> +/**.
> + * @brief Return the Control Register value.
> +* .
> +* @return Control value.
> + *.
> + * Return the content of the control register.
> + */.
> +uint32_t __get_CONTROL(void).
> +{.
> + uint32_t result=0;.
> +.
> + __ASM volatile ("MRS %0, control" : "=r" (result) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief Set the Control Register value.
> + *.
> + * @param control Control value.
> + *.
> + * Set the control register.
> + */.
> +void __set_CONTROL(uint32_t control).
> +{.
> + __ASM volatile ("MSR control, %0" : : "r" (control) );.
> +}.
> +.
> +.
> +/**.
> + * @brief Reverse byte order in integer value.
> + *.
> + * @param value value to reverse.
> + * @return reversed value.
> + *.
> + * Reverse byte order in integer value.
> + */.
> +uint32_t __REV(uint32_t value).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief Reverse byte order in unsigned short value.
> + *.
> + * @param value value to reverse.
> + * @return reversed value.
> + *.
> + * Reverse byte order in unsigned short value.
> + */.
> +uint32_t __REV16(uint16_t value).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief Reverse byte order in signed short value with sign extension to integer.
> + *.
> + * @param value value to reverse.
> + * @return reversed value.
> + *.
> + * Reverse byte order in signed short value with sign extension to integer.
> + */.
> +int32_t __REVSH(int16_t value).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief Reverse bit order of value.
> + *.
> + * @param value value to reverse.
> + * @return reversed value.
> + *.
> + * Reverse bit order of value.
> + */.
> +uint32_t __RBIT(uint32_t value).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief LDR Exclusive (8 bit).
> + *.
> + * @param *addr address pointer.
> + * @return value of (*address).
> + *.
> + * Exclusive LDR command for 8 bit value.
> + */.
> +uint8_t __LDREXB(uint8_t *addr).
> +{.
> + uint8_t result=0;.
> + .
> + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief LDR Exclusive (16 bit).
> + *.
> + * @param *addr address pointer.
> + * @return value of (*address).
> + *.
> + * Exclusive LDR command for 16 bit values.
> + */.
> +uint16_t __LDREXH(uint16_t *addr).
> +{.
> + uint16_t result=0;.
> + .
> + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief LDR Exclusive (32 bit).
> + *.
> + * @param *addr address pointer.
> + * @return value of (*address).
> + *.
> + * Exclusive LDR command for 32 bit values.
> + */.
> +uint32_t __LDREXW(uint32_t *addr).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief STR Exclusive (8 bit).
> + *.
> + * @param value value to store.
> + * @param *addr address pointer.
> + * @return successful / failed.
> + *.
> + * Exclusive STR command for 8 bit values.
> + */.
> +uint32_t __STREXB(uint8_t value, uint8_t *addr).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief STR Exclusive (16 bit).
> + *.
> + * @param value value to store.
> + * @param *addr address pointer.
> + * @return successful / failed.
> + *.
> + * Exclusive STR command for 16 bit values.
> + */.
> +uint32_t __STREXH(uint16_t value, uint16_t *addr).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );.
> + return(result);.
> +}.
> +.
> +/**.
> + * @brief STR Exclusive (32 bit).
> + *.
> + * @param value value to store.
> + * @param *addr address pointer.
> + * @return successful / failed.
> + *.
> + * Exclusive STR command for 32 bit values.
> + */.
> +uint32_t __STREXW(uint32_t value, uint32_t *addr).
> +{.
> + uint32_t result=0;.
> + .
> + __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );.
> + return(result);.
> +}.
> +.
> +.
> +#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/.
> +/* TASKING carm specific functions */.
> +.
> +/*.
> + * The CMSIS functions have been implemented as intrinsics in the compiler..
> + * Please use "carm -?i" to get an up to date list of all instrinsics,.
> + * Including the CMSIS ones..
> + */.
> +.
> +#endif.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/emac/Makefile b/arch/arm/mach-lpc17cmsis/libs/emac/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/emac/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/emac/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/emac/Makefile.omk
> new file mode 100644
> index 0000000..a0ba00f
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/emac/Makefile.omk
> @@ -0,0 +1,11 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = emac
> +
> +emac_SOURCES = lpc17xx_emac.c
> +
> +emac_LIBS = clkpwr
> +
> +include_HEADERS = lpc17xx_emac.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.c b/arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.c
> new file mode 100644
> index 0000000..34a18d6
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.c
> @@ -0,0 +1,989 @@
> +/**.
> + * @file : lpc17xx_emac.c.
> + * @brief : Contains all functions support for Ethernet MAC firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 02. Jun. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **********************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @addtogroup EMAC.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_emac.h".
> +#include "lpc17xx_clkpwr.h".
> +.
> +/* If this source file built with example, the LPC17xx FW library configuration.
> + * file in each example directory ("lpc17xx_libcfg.h") must be included,.
> + * otherwise the default FW library configuration file must be included instead.
> + */.
> +#ifdef __BUILD_WITH_EXAMPLE__.
> +#include "lpc17xx_libcfg.h".
> +#else.
> +#include "lpc17xx_libcfg_default.h".
> +#endif /* __BUILD_WITH_EXAMPLE__ */.
> +.
> +.
> +#ifdef _EMAC.
> +.
> +/* Private Variables ---------------------------------------------------------- */.
> +/** @defgroup EMAC_Private_Variables.
> + * @{.
> + */.
> +.
> +/* MII Mgmt Configuration register - Clock divider setting */.
> +const uint8_t EMAC_clkdiv[] = { 4, 6, 8, 10, 14, 20, 28 };.
> +.
> +/* EMAC local DMA Descriptors */.
> +.
> +/** Rx Descriptor data array */.
> +static RX_Desc Rx_Desc[EMAC_NUM_RX_FRAG];.
> +.
> +/** Rx Status data array - Must be 8-Byte aligned */.
> +#if defined ( __CC_ARM ).
> +static __align(8) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG];.
> +#elif defined ( __ICCARM__ ).
> +#pragma data_alignment=8.
> +static RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG];.
> +#elif defined ( __GNUC__ ).
> +static __attribute__ ((aligned (8))) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG];.
> +#endif.
> +.
> +/** Tx Descriptor data array */.
> +static TX_Desc Tx_Desc[EMAC_NUM_TX_FRAG];.
> +/** Tx Status data array */.
> +static TX_Stat Tx_Stat[EMAC_NUM_TX_FRAG];.
> +.
> +/* EMAC local DMA buffers */.
> +/** Rx buffer data */.
> +static uint32_t rx_buf[EMAC_NUM_RX_FRAG][EMAC_ETH_MAX_FLEN>>2];.
> +/** Tx buffer data */.
> +static uint32_t tx_buf[EMAC_NUM_TX_FRAG][EMAC_ETH_MAX_FLEN>>2];.
> +.
> +/* EMAC call-back function pointer data */.
> +static EMAC_IntCBSType *_pfnIntCbDat[10];.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Private Functions ---------------------------------------------------------- */.
> +/** @defgroup EMAC_Private_Functions.
> + * @{.
> + */.
> +.
> +static void rx_descr_init (void);.
> +static void tx_descr_init (void);.
> +static int32_t write_PHY (uint32_t PhyReg, uint16_t Value);.
> +static int32_t read_PHY (uint32_t PhyReg);.
> +.
> +.
> +/*--------------------------- rx_descr_init ---------------------------------*/.
> +.
> +/**.
> + * @brief Initializes RX Descriptor.
> + * @param[in] None.
> + * @return None.
> + */.
> +static void rx_descr_init (void).
> +{.
> + /* Initialize Receive Descriptor and Status array. */.
> + uint32_t i;.
> +.
> + for (i = 0; i < EMAC_NUM_RX_FRAG; i++) {.
> + Rx_Desc[i].Packet = (uint32_t)&rx_buf[i];.
> + Rx_Desc[i].Ctrl = EMAC_RCTRL_INT | (EMAC_ETH_MAX_FLEN - 1);.
> + Rx_Stat[i].Info = 0;.
> + Rx_Stat[i].HashCRC = 0;.
> + }.
> +.
> + /* Set EMAC Receive Descriptor Registers. */.
> + LPC_EMAC->RxDescriptor = (uint32_t)&Rx_Desc[0];.
> + LPC_EMAC->RxStatus = (uint32_t)&Rx_Stat[0];.
> + LPC_EMAC->RxDescriptorNumber = EMAC_NUM_RX_FRAG - 1;.
> +.
> + /* Rx Descriptors Point to 0 */.
> + LPC_EMAC->RxConsumeIndex = 0;.
> +}.
> +.
> +.
> +/*--------------------------- tx_descr_init ---- ----------------------------*/.
> +/**.
> + * @brief Initializes TX Descriptor.
> + * @param[in] None.
> + * @return None.
> + */.
> +static void tx_descr_init (void) {.
> + /* Initialize Transmit Descriptor and Status array. */.
> + uint32_t i;.
> +.
> + for (i = 0; i < EMAC_NUM_TX_FRAG; i++) {.
> + Tx_Desc[i].Packet = (uint32_t)&tx_buf[i];.
> + Tx_Desc[i].Ctrl = 0;.
> + Tx_Stat[i].Info = 0;.
> + }.
> +.
> + /* Set EMAC Transmit Descriptor Registers. */.
> + LPC_EMAC->TxDescriptor = (uint32_t)&Tx_Desc[0];.
> + LPC_EMAC->TxStatus = (uint32_t)&Tx_Stat[0];.
> + LPC_EMAC->TxDescriptorNumber = EMAC_NUM_TX_FRAG - 1;.
> +.
> + /* Tx Descriptors Point to 0 */.
> + LPC_EMAC->TxProduceIndex = 0;.
> +}.
> +.
> +.
> +/*--------------------------- write_PHY -------------------------------------*/.
> +/**.
> + * @brief Write value to PHY device.
> + * @param[in] PhyReg PHY Register address.
> + * @param[in] Value Value to write.
> + * @return (0) if sucess, otherwise return (-1).
> + */.
> +static int32_t write_PHY (uint32_t PhyReg, uint16_t Value).
> +{.
> + /* Write a data 'Value' to PHY register 'PhyReg'. */.
> + uint32_t tout;.
> +.
> + LPC_EMAC->MADR = EMAC_DP83848C_DEF_ADR | PhyReg;.
> + LPC_EMAC->MWTD = Value;.
> +.
> + /* Wait until operation completed */.
> + tout = 0;.
> + for (tout = 0; tout < EMAC_MII_WR_TOUT; tout++) {.
> + if ((LPC_EMAC->MIND & EMAC_MIND_BUSY) == 0) {.
> + return (0);.
> + }.
> + }.
> + // Time out!.
> + return (-1);.
> +}.
> +.
> +.
> +/*--------------------------- read_PHY --------------------------------------*/.
> +/**.
> + * @brief Read value from PHY device.
> + * @param[in] PhyReg PHY Register address.
> + * @return Return value if success, otherwise return (-1).
> + */.
> +static int32_t read_PHY (uint32_t PhyReg).
> +{.
> + /* Read a PHY register 'PhyReg'. */.
> + uint32_t tout;.
> +.
> + LPC_EMAC->MADR = EMAC_DP83848C_DEF_ADR | PhyReg;.
> + LPC_EMAC->MCMD = EMAC_MCMD_READ;.
> +.
> + /* Wait until operation completed */.
> + tout = 0;.
> + for (tout = 0; tout < EMAC_MII_RD_TOUT; tout++) {.
> + if ((LPC_EMAC->MIND & EMAC_MIND_BUSY) == 0) {.
> + LPC_EMAC->MCMD = 0;.
> + return (LPC_EMAC->MRDD);.
> + }.
> + }.
> + // Time out!.
> + return (-1);.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Set Station MAC address for EMAC module.
> + * @param[in] abStationAddr Pointer to Station address that contains 6-bytes.
> + * of MAC address (should be in order from MAC Address 1 to MAC Address 6).
> + * @return None.
> + **********************************************************************/.
> +void setEmacAddr(uint8_t abStationAddr[]).
> +{.
> + /* Set the Ethernet MAC Address registers */.
> + LPC_EMAC->SA0 = ((uint32_t)abStationAddr[5] << 8) | (uint32_t)abStationAddr[4];.
> + LPC_EMAC->SA1 = ((uint32_t)abStationAddr[3] << 8) | (uint32_t)abStationAddr[2];.
> + LPC_EMAC->SA2 = ((uint32_t)abStationAddr[1] << 8) | (uint32_t)abStationAddr[0];.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup EMAC_Public_Functions.
> + * @{.
> + */.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Initializes the EMAC peripheral according to the specified.
> +* parameters in the EMAC_ConfigStruct..
> + * @param[in] EMAC_ConfigStruct Pointer to a EMAC_CFG_Type structure.
> +* that contains the configuration information for the.
> +* specified EMAC peripheral..
> + * @return None.
> + *.
> + * Note: This function will initialize EMAC module according to procedure below:.
> + * - Remove the soft reset condition from the MAC.
> + * - Configure the PHY via the MIIM interface of the MAC.
> + * - Select RMII mode.
> + * - Configure the transmit and receive DMA engines, including the descriptor arrays.
> + * - Configure the host registers (MAC1,MAC2 etc.) in the MAC.
> + * - Enable the receive and transmit data paths.
> + * In default state after initializing, only Rx Done and Tx Done interrupt are enabled,.
> + * all remain interrupts are disabled.
> + * (Ref. from LPC17xx UM).
> + **********************************************************************/.
> +Status EMAC_Init(EMAC_CFG_Type *EMAC_ConfigStruct).
> +{.
> + /* Initialize the EMAC Ethernet controller. */.
> + int32_t regv,tout, tmp;.
> +.
> + /* Set up clock and power for Ethernet module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCENET, ENABLE);.
> +.
> + /* Reset all EMAC internal modules */.
> + LPC_EMAC->MAC1 = EMAC_MAC1_RES_TX | EMAC_MAC1_RES_MCS_TX | EMAC_MAC1_RES_RX |.
> + EMAC_MAC1_RES_MCS_RX | EMAC_MAC1_SIM_RES | EMAC_MAC1_SOFT_RES;.
> +.
> + LPC_EMAC->Command = EMAC_CR_REG_RES | EMAC_CR_TX_RES | EMAC_CR_RX_RES | EMAC_CR_PASS_RUNT_FRM;.
> +.
> + /* A short delay after reset. */.
> + for (tout = 100; tout; tout--);.
> +.
> + /* Initialize MAC control registers. */.
> + LPC_EMAC->MAC1 = EMAC_MAC1_PASS_ALL;.
> + LPC_EMAC->MAC2 = EMAC_MAC2_CRC_EN | EMAC_MAC2_PAD_EN;.
> + LPC_EMAC->MAXF = EMAC_ETH_MAX_FLEN;.
> + /*.
> + * Find the clock that close to desired target clock.
> + */.
> + tmp = SystemCoreClock / EMAC_MCFG_MII_MAXCLK;.
> + for (tout = 0; tout < sizeof (EMAC_clkdiv); tout++){.
> + if (EMAC_clkdiv[tout] >= tmp) break;.
> + }.
> + tout++;.
> + // Write to MAC configuration register and reset.
> + LPC_EMAC->MCFG = EMAC_MCFG_CLK_SEL(tout) | EMAC_MCFG_RES_MII;.
> + // release reset.
> + LPC_EMAC->MCFG &= ~(EMAC_MCFG_RES_MII);.
> + LPC_EMAC->CLRT = EMAC_CLRT_DEF;.
> + LPC_EMAC->IPGR = EMAC_IPGR_P2_DEF;.
> +.
> + /* Enable Reduced MII interface. */.
> + LPC_EMAC->Command = EMAC_CR_RMII | EMAC_CR_PASS_RUNT_FRM;.
> +.
> + /* Reset Reduced MII Logic. */.
> + LPC_EMAC->SUPP = EMAC_SUPP_RES_RMII;.
> +.
> + for (tout = 100; tout; tout--);.
> + LPC_EMAC->SUPP = 0;.
> +.
> + /* Put the DP83848C in reset mode */.
> + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_BMCR_RESET);.
> +.
> + /* Wait for hardware reset to end. */.
> + for (tout = EMAC_PHY_RESP_TOUT; tout; tout--) {.
> + regv = read_PHY (EMAC_PHY_REG_BMCR);.
> + if (!(regv & (EMAC_PHY_BMCR_RESET | EMAC_PHY_BMCR_POWERDOWN))) {.
> + /* Reset complete, device not Power Down. */.
> + break;.
> + }.
> + if (tout == 0){.
> + // Time out, return ERROR.
> + return (ERROR);.
> + }.
> + }.
> +.
> + // Set PHY mode.
> + if (EMAC_SetPHYMode(EMAC_ConfigStruct->Mode) < 0){.
> + return (ERROR);.
> + }.
> +.
> + // Set EMAC address.
> + setEmacAddr(EMAC_ConfigStruct->pbEMAC_Addr);.
> +.
> + /* Initialize Tx and Rx DMA Descriptors */.
> + rx_descr_init ();.
> + tx_descr_init ();.
> +.
> + // Set Receive Filter register: enable broadcast and multicast.
> + LPC_EMAC->RxFilterCtrl = EMAC_RFC_MCAST_EN | EMAC_RFC_BCAST_EN | EMAC_RFC_PERFECT_EN;.
> +.
> + /* Enable Rx Done and Tx Done interrupt for EMAC */.
> + LPC_EMAC->IntEnable = EMAC_INT_RX_DONE | EMAC_INT_TX_DONE;.
> +.
> + /* Reset all interrupts */.
> + LPC_EMAC->IntClear = 0xFFFF;.
> +.
> + /* Enable receive and transmit mode of MAC Ethernet core */.
> + LPC_EMAC->Command |= (EMAC_CR_RX_EN | EMAC_CR_TX_EN);.
> + LPC_EMAC->MAC1 |= EMAC_MAC1_REC_EN;.
> +.
> + return SUCCESS;.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief De-initializes the EMAC peripheral registers to their.
> +* default reset values..
> + * @param[in] None.
> + * @return None.
> + **********************************************************************/.
> +void EMAC_DeInit(void).
> +{.
> + // Disable all interrupt.
> + LPC_EMAC->IntEnable = 0x00;.
> + // Clear all pending interrupt.
> + LPC_EMAC->IntClear = (0xFF) | (EMAC_INT_SOFT_INT | EMAC_INT_WAKEUP);.
> +.
> + /* TurnOff clock and power for Ethernet module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCENET, DISABLE);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Check specified PHY status in EMAC peripheral.
> + * @param[in] ulPHYState Specified PHY Status Type, should be:.
> + * - EMAC_PHY_STAT_LINK: Link Status.
> + * - EMAC_PHY_STAT_SPEED: Speed Status.
> + * - EMAC_PHY_STAT_DUP: Duplex Status.
> + * @return Status of specified PHY status (0 or 1)..
> + * (-1) if error..
> + *.
> + * Note:.
> + * For EMAC_PHY_STAT_LINK, return value:.
> + * - 0: Link Down.
> + * - 1: Link Up.
> + * For EMAC_PHY_STAT_SPEED, return value:.
> + * - 0: 10Mbps.
> + * - 1: 100Mbps.
> + * For EMAC_PHY_STAT_DUP, return value:.
> + * - 0: Half-Duplex.
> + * - 1: Full-Duplex.
> + **********************************************************************/.
> +int32_t EMAC_CheckPHYStatus(uint32_t ulPHYState).
> +{.
> + int32_t regv, tmp;.
> +.
> + regv = read_PHY (EMAC_PHY_REG_STS);.
> + switch(ulPHYState){.
> + case EMAC_PHY_STAT_LINK:.
> + tmp = (regv & EMAC_PHY_SR_LINK) ? 1 : 0;.
> + break;.
> + case EMAC_PHY_STAT_SPEED:.
> + tmp = (regv & EMAC_PHY_SR_SPEED) ? 0 : 1;.
> + break;.
> + case EMAC_PHY_STAT_DUP:.
> + tmp = (regv & EMAC_PHY_SR_DUP) ? 1 : 0;.
> + break;.
> + default:.
> + tmp = -1;.
> + break;.
> + }.
> + return (tmp);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Set specified PHY mode in EMAC peripheral.
> + * @param[in] ulPHYMode Specified PHY mode, should be:.
> + * - EMAC_MODE_AUTO.
> + * - EMAC_MODE_10M_FULL.
> + * - EMAC_MODE_10M_HALF.
> + * - EMAC_MODE_100M_FULL.
> + * - EMAC_MODE_100M_HALF.
> + * @return Return (0) if no error, otherwise return (-1).
> + **********************************************************************/.
> +int32_t EMAC_SetPHYMode(uint32_t ulPHYMode).
> +{.
> + int32_t id1, id2, tout, regv;.
> +.
> + /* Check if this is a DP83848C PHY. */.
> + id1 = read_PHY (EMAC_PHY_REG_IDR1);.
> + id2 = read_PHY (EMAC_PHY_REG_IDR2);.
> +.
> + if (((id1 << 16) | (id2 & 0xFFF0)) == EMAC_DP83848C_ID) {.
> + /* Configure the PHY device */.
> + switch(ulPHYMode){.
> + case EMAC_MODE_AUTO:.
> + /* Use auto-negotiation about the link speed. */.
> + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_AUTO_NEG);.
> + /* Wait to complete Auto_Negotiation */.
> + for (tout = EMAC_PHY_RESP_TOUT; tout; tout--) {.
> + regv = read_PHY (EMAC_PHY_REG_BMSR);.
> + if (regv & EMAC_PHY_BMSR_AUTO_DONE) {.
> + /* Auto-negotiation Complete. */.
> + break;.
> + }.
> + if (tout == 0){.
> + // Time out, return error.
> + return (-1);.
> + }.
> + }.
> + break;.
> + case EMAC_MODE_10M_FULL:.
> + /* Connect at 10MBit full-duplex */.
> + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_FULLD_10M);.
> + break;.
> + case EMAC_MODE_10M_HALF:.
> + /* Connect at 10MBit half-duplex */.
> + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_HALFD_10M);.
> + break;.
> + case EMAC_MODE_100M_FULL:.
> + /* Connect at 100MBit full-duplex */.
> + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_FULLD_100M);.
> + break;.
> + case EMAC_MODE_100M_HALF:.
> + /* Connect at 100MBit half-duplex */.
> + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_HALFD_100M);.
> + break;.
> + default:.
> + // un-supported.
> + return (-1);.
> + }.
> + }.
> + // It's not correct module ID.
> + else {.
> + return (-1);.
> + }.
> +.
> + // Update EMAC configuration with current PHY status.
> + if (EMAC_UpdatePHYStatus() < 0){.
> + return (-1);.
> + }.
> +.
> + // Complete.
> + return (0);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Auto-Configures value for the EMAC configuration register to.
> + * match with current PHY mode.
> + * @param[in] None.
> + * @return Return (0) if no error, otherwise return (-1).
> + *.
> + * Note: The EMAC configuration will be auto-configured:.
> + * - Speed mode..
> + * - Half/Full duplex mode.
> + **********************************************************************/.
> +int32_t EMAC_UpdatePHYStatus(void).
> +{.
> + int32_t regv, tout;.
> +.
> + /* Check the link status. */.
> + for (tout = EMAC_PHY_RESP_TOUT; tout; tout--) {.
> + regv = read_PHY (EMAC_PHY_REG_STS);.
> + if (regv & EMAC_PHY_SR_LINK) {.
> + /* Link is on. */.
> + break;.
> + }.
> + if (tout == 0){.
> + // time out.
> + return (-1);.
> + }.
> + }.
> +.
> + /* Configure Full/Half Duplex mode. */.
> + if (regv & EMAC_PHY_SR_DUP) {.
> + /* Full duplex is enabled. */.
> + LPC_EMAC->MAC2 |= EMAC_MAC2_FULL_DUP;.
> + LPC_EMAC->Command |= EMAC_CR_FULL_DUP;.
> + LPC_EMAC->IPGT = EMAC_IPGT_FULL_DUP;.
> + } else {.
> + /* Half duplex mode. */.
> + LPC_EMAC->IPGT = EMAC_IPGT_HALF_DUP;.
> + }.
> +.
> + /* Configure 100MBit/10MBit mode. */.
> + if (regv & EMAC_PHY_SR_SPEED) {.
> + /* 10MBit mode. */.
> + LPC_EMAC->SUPP = 0;.
> + } else {.
> + /* 100MBit mode. */.
> + LPC_EMAC->SUPP = EMAC_SUPP_SPEED;.
> + }.
> +.
> + // Complete.
> + return (0);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Enable/Disable hash filter functionality for specified destination.
> + * MAC address in EMAC module.
> + * @param[in] dstMAC_addr Pointer to the first MAC destination address, should.
> + * be 6-bytes length, in order LSB to the MSB.
> + * @param[in] NewState New State of this command, should be:.
> + * - ENABLE..
> + * - DISABLE..
> + * @return None.
> + *.
> + * Note:.
> + * The standard Ethernet cyclic redundancy check (CRC) function is calculated from.
> + * the 6 byte destination address in the Ethernet frame (this CRC is calculated.
> + * anyway as part of calculating the CRC of the whole frame), then bits [28:23] out of.
> + * the 32 bits CRC result are taken to form the hash. The 6 bit hash is used to access.
> + * the hash table: it is used as an index in the 64 bit HashFilter register that has been.
> + * programmed with accept values. If the selected accept value is 1, the frame is.
> + * accepted..
> + **********************************************************************/.
> +void EMAC_SetHashFilter(uint8_t dstMAC_addr[], FunctionalState NewState).
> +{.
> + uint32_t *pReg;.
> + uint32_t tmp;.
> + int32_t crc;.
> +.
> + // Calculate the CRC from the destination MAC address.
> + crc = EMAC_CRCCalc(dstMAC_addr, 6);.
> + // Extract the value from CRC to get index value for hash filter table.
> + crc = (crc >> 23) & 0x3F;.
> +.
> + pReg = (crc > 31) ? ((uint32_t *)&LPC_EMAC->HashFilterH) \.
> + : ((uint32_t *)&LPC_EMAC->HashFilterL);.
> + tmp = (crc > 31) ? (crc - 32) : crc;.
> + if (NewState == ENABLE) {.
> + (*pReg) |= (1UL << tmp);.
> + } else {.
> + (*pReg) &= ~(1UL << tmp);.
> + }.
> + // Enable Rx Filter.
> + LPC_EMAC->Command &= ~EMAC_CR_PASS_RX_FILT;.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Calculates CRC code for number of bytes in the frame.
> + * @param[in] frame_no_fcs Pointer to the first byte of the frame.
> + * @param[in] frame_len length of the frame without the FCS.
> + * @return the CRC as a 32 bit integer.
> + **********************************************************************/.
> +int32_t EMAC_CRCCalc(uint8_t frame_no_fcs[], int32_t frame_len).
> +{.
> + int i; // iterator.
> + int j; // another iterator.
> + char byte; // current byte.
> + int crc; // CRC result.
> + int q0, q1, q2, q3; // temporary variables.
> + crc = 0xFFFFFFFF;.
> + for (i = 0; i < frame_len; i++) {.
> + byte = *frame_no_fcs++;.
> + for (j = 0; j < 2; j++) {.
> + if (((crc >> 28) ^ (byte >> 3)) & 0x00000001) {.
> + q3 = 0x04C11DB7;.
> + } else {.
> + q3 = 0x00000000;.
> + }.
> + if (((crc >> 29) ^ (byte >> 2)) & 0x00000001) {.
> + q2 = 0x09823B6E;.
> + } else {.
> + q2 = 0x00000000;.
> + }.
> + if (((crc >> 30) ^ (byte >> 1)) & 0x00000001) {.
> + q1 = 0x130476DC;.
> + } else {.
> + q1 = 0x00000000;.
> + }.
> + if (((crc >> 31) ^ (byte >> 0)) & 0x00000001) {.
> + q0 = 0x2608EDB8;.
> + } else {.
> + q0 = 0x00000000;.
> + }.
> + crc = (crc << 4) ^ q3 ^ q2 ^ q1 ^ q0;.
> + byte >>= 4;.
> + }.
> + }.
> + return crc;.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Enable/Disable Filter mode for each specified type EMAC peripheral.
> + * @param[in] ulFilterMode Filter mode, should be:.
> + * - EMAC_RFC_UCAST_EN: all frames of unicast types.
> + * will be accepted.
> + * - EMAC_RFC_BCAST_EN: broadcast frame will be.
> + * accepted.
> + * - EMAC_RFC_MCAST_EN: all frames of multicast.
> + * types will be accepted.
> + * - EMAC_RFC_UCAST_HASH_EN: The imperfect hash.
> + * filter will be applied to unicast addresses.
> + * - EMAC_RFC_MCAST_HASH_EN: The imperfect hash.
> + * filter will be applied to multicast addresses.
> + * - EMAC_RFC_PERFECT_EN: the destination address.
> + * will be compared with the 6 byte station address.
> + * programmed in the station address by the filter.
> + * - EMAC_RFC_MAGP_WOL_EN: the result of the magic.
> + * packet filter will generate a WoL interrupt when.
> + * there is a match.
> + * - EMAC_RFC_PFILT_WOL_EN: the result of the perfect address.
> + * matching filter and the imperfect hash filter will.
> + * generate a WoL interrupt when there is a match.
> + * @param[in] NewState New State of this command, should be:.
> + * - ENABLE.
> + * - DISABLE.
> + * @return None.
> + **********************************************************************/.
> +void EMAC_SetFilterMode(uint32_t ulFilterMode, FunctionalState NewState).
> +{.
> + if (NewState == ENABLE){.
> + LPC_EMAC->RxFilterCtrl |= ulFilterMode;.
> + } else {.
> + LPC_EMAC->RxFilterCtrl &= ~ulFilterMode;.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Get status of Wake On LAN Filter for each specified.
> + * type in EMAC peripheral, clear this status if it is set.
> + * @param[in] ulWoLMode WoL Filter mode, should be:.
> + * - EMAC_WOL_UCAST: unicast frames caused WoL.
> + * - EMAC_WOL_UCAST: broadcast frame caused WoL.
> + * - EMAC_WOL_MCAST: multicast frame caused WoL.
> + * - EMAC_WOL_UCAST_HASH: unicast frame that passes the.
> + * imperfect hash filter caused WoL.
> + * - EMAC_WOL_MCAST_HASH: multicast frame that passes the.
> + * imperfect hash filter caused WoL.
> + * - EMAC_WOL_PERFECT:perfect address matching filter.
> + * caused WoL.
> + * - EMAC_WOL_RX_FILTER: the receive filter caused WoL.
> + * - EMAC_WOL_MAG_PACKET: the magic packet filter caused WoL.
> + * @return SET/RESET.
> + **********************************************************************/.
> +FlagStatus EMAC_GetWoLStatus(uint32_t ulWoLMode).
> +{.
> + if (LPC_EMAC->RxFilterWoLStatus & ulWoLMode) {.
> + LPC_EMAC->RxFilterWoLClear = ulWoLMode;.
> + return SET;.
> + } else {.
> + return RESET;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Write data to Tx packet data buffer at current index due to.
> + * TxProduceIndex.
> + * @param[in] pDataStruct Pointer to a EMAC_PACKETBUF_Type structure.
> + * data that contain specified information about.
> + * Packet data buffer..
> + * @return None.
> + **********************************************************************/.
> +void EMAC_WritePacketBuffer(EMAC_PACKETBUF_Type *pDataStruct).
> +{.
> + uint32_t idx,len;.
> + uint32_t *sp,*dp;.
> +.
> + idx = LPC_EMAC->TxProduceIndex;.
> + sp = (uint32_t *)pDataStruct->pbDataBuf;.
> + dp = (uint32_t *)Tx_Desc[idx].Packet;.
> + /* Copy frame data to EMAC packet buffers. */.
> + for (len = (pDataStruct->ulDataLen + 3) >> 2; len; len--) {.
> + *dp++ = *sp++;.
> + }.
> + Tx_Desc[idx].Ctrl = (pDataStruct->ulDataLen - 1) | (EMAC_TCTRL_INT | EMAC_TCTRL_LAST);.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Read data from Rx packet data buffer at current index due.
> + * to RxConsumeIndex.
> + * @param[in] pDataStruct Pointer to a EMAC_PACKETBUF_Type structure.
> + * data that contain specified information about.
> + * Packet data buffer..
> + * @return None.
> + **********************************************************************/.
> +void EMAC_ReadPacketBuffer(EMAC_PACKETBUF_Type *pDataStruct).
> +{.
> + uint32_t idx, len;.
> + uint32_t *dp, *sp;.
> +.
> + idx = LPC_EMAC->RxConsumeIndex;.
> + dp = (uint32_t *)pDataStruct->pbDataBuf;.
> + sp = (uint32_t *)Rx_Desc[idx].Packet;.
> +.
> + if (pDataStruct->pbDataBuf != NULL) {.
> + for (len = (pDataStruct->ulDataLen + 3) >> 2; len; len--) {.
> + *dp++ = *sp++;.
> + }.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Standard EMAC IRQ Handler. This sub-routine will check.
> + * these following interrupt and call the call-back function.
> + * if they're already installed:.
> + * - Overrun Error interrupt in RX Queue.
> + * - Receive Error interrupt: AlignmentError, RangeError,.
> + * LengthError, SymbolError, CRCError or NoDescriptor or Overrun.
> + * - RX Finished Process Descriptors interrupt (ProduceIndex == ConsumeIndex).
> + * - Receive Done interrupt.
> + * - Transmit Under-run interrupt.
> + * - Transmit errors interrupt : LateCollision, ExcessiveCollision.
> + * and ExcessiveDefer, NoDescriptor or Under-run.
> + * - TX Finished Process Descriptors interrupt (ProduceIndex == ConsumeIndex).
> + * - Transmit Done interrupt.
> + * - Interrupt triggered by software.
> + * - Interrupt triggered by a Wakeup event detected by the receive filter.
> + * @param[in] None.
> + * @return None.
> + **********************************************************************/.
> +void EMAC_StandardIRQHandler(void).
> +{.
> + /* EMAC Ethernet Controller Interrupt function. */.
> + uint32_t n, int_stat;.
> +.
> + // Get EMAC interrupt status.
> + while ((int_stat = (LPC_EMAC->IntStatus & LPC_EMAC->IntEnable)) != 0) {.
> + // Clear interrupt status.
> + LPC_EMAC->IntClear = int_stat;.
> + // Execute call-back function.
> + for (n = 0; n <= 7; n++) {.
> + if ((int_stat & (1 << n)) && (_pfnIntCbDat[n] != NULL)) {.
> + _pfnIntCbDat[n]();.
> + }.
> + }.
> + // Soft interrupt.
> + if ((int_stat & EMAC_INT_SOFT_INT) && (_pfnIntCbDat[8] != NULL)) {.
> + _pfnIntCbDat[8]();.
> + }.
> + // WakeUp interrupt.
> + if ((int_stat & EMAC_INT_WAKEUP) && (_pfnIntCbDat[9] != NULL)) {.
> + // Clear WoL interrupt.
> + LPC_EMAC->RxFilterWoLClear = EMAC_WOL_BITMASK;.
> + _pfnIntCbDat[9]();.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Setup/register Call-back function for each interrupt type.
> + * in EMAC module..
> + * @param[in] ulIntType Interrupt type, should be one of the following:.
> + * - EMAC_INT_RX_OVERRUN: Receive Overrun.
> + * - EMAC_INT_RX_ERR: Receive Error.
> + * - EMAC_INT_RX_FIN: Receive Descriptor Finish.
> + * - EMAC_INT_RX_DONE: Receive Done.
> + * - EMAC_INT_TX_UNDERRUN: Transmit Under-run.
> + * - EMAC_INT_TX_ERR: Transmit Error.
> + * - EMAC_INT_TX_FIN: Transmit descriptor finish.
> + * - EMAC_INT_TX_DONE: Transmit Done.
> + * - EMAC_INT_SOFT_INT: Software interrupt.
> + * - EMAC_INT_WAKEUP: Wakeup interrupt.
> + * @param[in] pfnIntCb Pointer to Call-back function used for this.
> + * interrupt type.
> + * @return None.
> + **********************************************************************/.
> +void EMAC_SetupIntCBS(uint32_t ulIntType, EMAC_IntCBSType *pfnIntCb).
> +{.
> + /* EMAC Ethernet Controller Interrupt function. */.
> + uint32_t n;.
> +.
> + if (ulIntType <= EMAC_INT_TX_DONE){.
> + for (n = 0; n <= 7; n++) {.
> + // Found it, install cbs now.
> + if (ulIntType & (1 << n)) {.
> + _pfnIntCbDat[n] = pfnIntCb;.
> + // Don't install cbs any more.
> + break;.
> + }.
> + }.
> + } else if (ulIntType & EMAC_INT_SOFT_INT) {.
> + _pfnIntCbDat[8] = pfnIntCb;.
> + } else if (ulIntType & EMAC_INT_WAKEUP) {.
> + _pfnIntCbDat[9] = pfnIntCb;.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Enable/Disable interrupt for each type in EMAC.
> + * @param[in] ulIntType Interrupt Type, should be:.
> + * - EMAC_INT_RX_OVERRUN: Receive Overrun.
> + * - EMAC_INT_RX_ERR: Receive Error.
> + * - EMAC_INT_RX_FIN: Receive Descriptor Finish.
> + * - EMAC_INT_RX_DONE: Receive Done.
> + * - EMAC_INT_TX_UNDERRUN: Transmit Under-run.
> + * - EMAC_INT_TX_ERR: Transmit Error.
> + * - EMAC_INT_TX_FIN: Transmit descriptor finish.
> + * - EMAC_INT_TX_DONE: Transmit Done.
> + * - EMAC_INT_SOFT_INT: Software interrupt.
> + * - EMAC_INT_WAKEUP: Wakeup interrupt.
> + * @param[in] NewState New State of this function, should be:.
> + * - ENABLE..
> + * - DISABLE..
> + * @return None.
> + **********************************************************************/.
> +void EMAC_IntCmd(uint32_t ulIntType, FunctionalState NewState).
> +{.
> + if (NewState == ENABLE) {.
> + LPC_EMAC->IntEnable |= ulIntType;.
> + } else {.
> + LPC_EMAC->IntEnable &= ~(ulIntType);.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Check whether if specified interrupt flag is set or not.
> + * for each interrupt type in EMAC and clear interrupt pending.
> + * if it is set..
> + * @param[in] ulIntType Interrupt Type, should be:.
> + * - EMAC_INT_RX_OVERRUN: Receive Overrun.
> + * - EMAC_INT_RX_ERR: Receive Error.
> + * - EMAC_INT_RX_FIN: Receive Descriptor Finish.
> + * - EMAC_INT_RX_DONE: Receive Done.
> + * - EMAC_INT_TX_UNDERRUN: Transmit Under-run.
> + * - EMAC_INT_TX_ERR: Transmit Error.
> + * - EMAC_INT_TX_FIN: Transmit descriptor finish.
> + * - EMAC_INT_TX_DONE: Transmit Done.
> + * - EMAC_INT_SOFT_INT: Software interrupt.
> + * - EMAC_INT_WAKEUP: Wakeup interrupt.
> + * @return New state of specified interrupt (SET or RESET).
> + **********************************************************************/.
> +IntStatus EMAC_IntGetStatus(uint32_t ulIntType).
> +{.
> + if (LPC_EMAC->IntStatus & ulIntType) {.
> + LPC_EMAC->IntClear = ulIntType;.
> + return SET;.
> + } else {.
> + return RESET;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Check whether if the current RxConsumeIndex is not equal to the.
> + * current RxProduceIndex..
> + * @param[in] None.
> + * @return TRUE if they're not equal, otherwise return FALSE.
> + *.
> + * Note: In case the RxConsumeIndex is not equal to the RxProduceIndex,.
> + * it means there're available data has been received. They should be read.
> + * out and released the Receive Data Buffer by updating the RxConsumeIndex value..
> + **********************************************************************/.
> +Bool EMAC_CheckReceiveIndex(void).
> +{.
> + if (LPC_EMAC->RxConsumeIndex != LPC_EMAC->RxProduceIndex) {.
> + return TRUE;.
> + } else {.
> + return FALSE;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Check whether if the current TxProduceIndex is not equal to the.
> + * current RxProduceIndex - 1..
> + * @param[in] None.
> + * @return TRUE if they're not equal, otherwise return FALSE.
> + *.
> + * Note: In case the RxConsumeIndex is equal to the RxProduceIndex - 1,.
> + * it means the transmit buffer is available and data can be written to transmit.
> + * buffer to be sent..
> + **********************************************************************/.
> +Bool EMAC_CheckTransmitIndex(void).
> +{.
> + uint32_t tmp = LPC_EMAC->TxConsumeIndex -1;.
> + if (LPC_EMAC->TxProduceIndex == tmp) {.
> + return FALSE;.
> + } else {.
> + return TRUE;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Get current status value of receive data (due to RxConsumeIndex).
> + * @param[in] ulRxStatType Received Status type, should be one of following:.
> + * - EMAC_RINFO_CTRL_FRAME: Control Frame.
> + * - EMAC_RINFO_VLAN: VLAN Frame.
> + * - EMAC_RINFO_FAIL_FILT: RX Filter Failed.
> + * - EMAC_RINFO_MCAST: Multicast Frame.
> + * - EMAC_RINFO_BCAST: Broadcast Frame.
> + * - EMAC_RINFO_CRC_ERR: CRC Error in Frame.
> + * - EMAC_RINFO_SYM_ERR: Symbol Error from PHY.
> + * - EMAC_RINFO_LEN_ERR: Length Error.
> + * - EMAC_RINFO_RANGE_ERR: Range error(exceeded max size).
> + * - EMAC_RINFO_ALIGN_ERR: Alignment error.
> + * - EMAC_RINFO_OVERRUN: Receive overrun.
> + * - EMAC_RINFO_NO_DESCR: No new Descriptor available.
> + * - EMAC_RINFO_LAST_FLAG: last Fragment in Frame.
> + * - EMAC_RINFO_ERR: Error Occurred (OR of all error).
> + * @return Current value of receive data (due to RxConsumeIndex).
> + **********************************************************************/.
> +FlagStatus EMAC_CheckReceiveDataStatus(uint32_t ulRxStatType).
> +{.
> + uint32_t idx;.
> + idx = LPC_EMAC->RxConsumeIndex;.
> + return (((Rx_Stat[idx].Info) & ulRxStatType) ? SET : RESET);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Get size of current Received data in received buffer (due to.
> + * RxConsumeIndex).
> + * @param[in] None.
> + * @return Size of received data.
> + **********************************************************************/.
> +uint32_t EMAC_GetReceiveDataSize(void).
> +{.
> + uint32_t idx;.
> + idx =LPC_EMAC->RxConsumeIndex;.
> + return ((Rx_Stat[idx].Info) & EMAC_RINFO_SIZE);.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Increase the RxConsumeIndex (after reading the Receive buffer.
> + * to release the Receive buffer) and wrap-around the index if.
> + * it reaches the maximum Receive Number.
> + * @param[in] None.
> + * @return None.
> + **********************************************************************/.
> +void EMAC_UpdateRxConsumeIndex(void).
> +{.
> + // Get current Rx consume index.
> + uint32_t idx = LPC_EMAC->RxConsumeIndex;.
> +.
> + /* Release frame from EMAC buffer */.
> + if (++idx == EMAC_NUM_RX_FRAG) idx = 0;.
> + LPC_EMAC->RxConsumeIndex = idx;.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Increase the TxProduceIndex (after writting to the Transmit buffer.
> + * to enable the Transmit buffer) and wrap-around the index if.
> + * it reaches the maximum Transmit Number.
> + * @param[in] None.
> + * @return None.
> + **********************************************************************/.
> +void EMAC_UpdateTxProduceIndex(void).
> +{.
> + // Get current Tx produce index.
> + uint32_t idx = LPC_EMAC->TxProduceIndex;.
> +.
> + /* Start frame transmission */.
> + if (++idx == EMAC_NUM_TX_FRAG) idx = 0;.
> + LPC_EMAC->TxProduceIndex = idx;.
> +}.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +#endif /* _EMAC */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.h b/arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.h
> new file mode 100644
> index 0000000..c31fa56
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/emac/lpc17xx_emac.h
> @@ -0,0 +1,582 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_emac.h.
> + * @brief : Contains all macro definitions and function prototypes.
> + * support for Ethernet MAC firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 02. Jun. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @defgroup EMAC.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC17XX_EMAC_H_.
> +#define LPC17XX_EMAC_H_.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "LPC17xx.h".
> +#include "lpc_types.h".
> +.
> +.
> +#ifdef __cplusplus.
> +extern "C".
> +{.
> +#endif.
> +.
> +.
> +/* Private Macros ------------------------------------------------------------- */.
> +/** @defgroup EMAC_Private_Macros.
> + * @{.
> + */.
> +.
> +.
> +/** @defgroup EMAC_REGISTER_BIT_DEFINITIONS.
> + * @{.
> + */.
> +.
> +.
> +/* EMAC Memory Buffer configuration for 16K Ethernet RAM */.
> +#define EMAC_NUM_RX_FRAG 4 /**< Num.of RX Fragments 4*1536= 6.0kB */.
> +#define EMAC_NUM_TX_FRAG 3 /**< Num.of TX Fragments 3*1536= 4.6kB */.
> +#define EMAC_ETH_MAX_FLEN 1536 /**< Max. Ethernet Frame Size */.
> +#define EMAC_TX_FRAME_TOUT 0x00100000 /**< Frame Transmit timeout count */.
> +.
> +/* Ethernet MAC register definitions --------------------------------------------------------------------- */.
> +/* MAC Configuration Register 1 */.
> +#define EMAC_MAC1_REC_EN 0x00000001 /**< Receive Enable */.
> +#define EMAC_MAC1_PASS_ALL 0x00000002 /**< Pass All Receive Frames */.
> +#define EMAC_MAC1_RX_FLOWC 0x00000004 /**< RX Flow Control */.
> +#define EMAC_MAC1_TX_FLOWC 0x00000008 /**< TX Flow Control */.
> +#define EMAC_MAC1_LOOPB 0x00000010 /**< Loop Back Mode */.
> +#define EMAC_MAC1_RES_TX 0x00000100 /**< Reset TX Logic */.
> +#define EMAC_MAC1_RES_MCS_TX 0x00000200 /**< Reset MAC TX Control Sublayer */.
> +#define EMAC_MAC1_RES_RX 0x00000400 /**< Reset RX Logic */.
> +#define EMAC_MAC1_RES_MCS_RX 0x00000800 /**< Reset MAC RX Control Sublayer */.
> +#define EMAC_MAC1_SIM_RES 0x00004000 /**< Simulation Reset */.
> +#define EMAC_MAC1_SOFT_RES 0x00008000 /**< Soft Reset MAC */.
> +.
> +/* MAC Configuration Register 2 */.
> +#define EMAC_MAC2_FULL_DUP 0x00000001 /**< Full-Duplex Mode */.
> +#define EMAC_MAC2_FRM_LEN_CHK 0x00000002 /**< Frame Length Checking */.
> +#define EMAC_MAC2_HUGE_FRM_EN 0x00000004 /**< Huge Frame Enable */.
> +#define EMAC_MAC2_DLY_CRC 0x00000008 /**< Delayed CRC Mode */.
> +#define EMAC_MAC2_CRC_EN 0x00000010 /**< Append CRC to every Frame */.
> +#define EMAC_MAC2_PAD_EN 0x00000020 /**< Pad all Short Frames */.
> +#define EMAC_MAC2_VLAN_PAD_EN 0x00000040 /**< VLAN Pad Enable */.
> +#define EMAC_MAC2_ADET_PAD_EN 0x00000080 /**< Auto Detect Pad Enable */.
> +#define EMAC_MAC2_PPREAM_ENF 0x00000100 /**< Pure Preamble Enforcement */.
> +#define EMAC_MAC2_LPREAM_ENF 0x00000200 /**< Long Preamble Enforcement */.
> +#define EMAC_MAC2_NO_BACKOFF 0x00001000 /**< No Backoff Algorithm */.
> +#define EMAC_MAC2_BACK_PRESSURE 0x00002000 /**< Backoff Presurre / No Backoff */.
> +#define EMAC_MAC2_EXCESS_DEF 0x00004000 /**< Excess Defer */.
> +.
> +/* Back-to-Back Inter-Packet-Gap Register */.
> +/** Programmable field representing the nibble time offset of the minimum possible period.
> + * between the end of any transmitted packet to the beginning of the next */.
> +#define EMAC_IPGT_BBIPG(n) (n&0x7F).
> +/** Recommended value for Full Duplex of Programmable field representing the nibble time.
> + * offset of the minimum possible period between the end of any transmitted packet to the.
> + * beginning of the next */.
> +#define EMAC_IPGT_FULL_DUP (EMAC_IPGT_BBIPG(0x15)).
> +/** Recommended value for Half Duplex of Programmable field representing the nibble time.
> + * offset of the minimum possible period between the end of any transmitted packet to the.
> + * beginning of the next */.
> +#define EMAC_IPGT_HALF_DUP (EMAC_IPGT_BBIPG(0x12)).
> +.
> +/* Non Back-to-Back Inter-Packet-Gap Register */.
> +/** Programmable field representing the Non-Back-to-Back Inter-Packet-Gap */.
> +#define EMAC_IPGR_NBBIPG_P2(n) (n&0x7F).
> +/** Recommended value for Programmable field representing the Non-Back-to-Back Inter-Packet-Gap Part 1 */.
> +#define EMAC_IPGR_P2_DEF (EMAC_IPGR_NBBIPG_P2(0x12)).
> +/** Programmable field representing the optional carrierSense window referenced in.
> + * IEEE 802.3/4.2.3.2.1 'Carrier Deference' */.
> +#define EMAC_IPGR_NBBIPG_P1(n) ((n&0x7F)<<8).
> +/** Recommended value for Programmable field representing the Non-Back-to-Back Inter-Packet-Gap Part 2 */.
> +#define EMAC_IPGR_P1_DEF EMAC_IPGR_NBBIPG_P1(0x0C).
> +.
> +/* Collision Window/Retry Register */.
> +/** Programmable field specifying the number of retransmission attempts following a collision before.
> + * aborting the packet due to excessive collisions */.
> +#define EMAC_CLRT_MAX_RETX(n) (n&0x0F).
> +/** Programmable field representing the slot time or collision window during which collisions occur.
> + * in properly configured networks */.
> +#define EMAC_CLRT_COLL(n) ((n&0x3F)<<8).
> +/** Default value for Collision Window / Retry register */.
> +#define EMAC_CLRT_DEF ((EMAC_CLRT_MAX_RETX(0x0F))|(EMAC_CLRT_COLL(0x37))).
> +.
> +/* Maximum Frame Register */.
> +/** Represents a maximum receive frame of 1536 octets */.
> +#define EMAC_MAXF_MAXFRMLEN(n) (n&0xFFFF).
> +.
> +/* PHY Support Register */.
> +#define EMAC_SUPP_SPEED 0x00000100 /**< Reduced MII Logic Current Speed */.
> +#define EMAC_SUPP_RES_RMII 0x00000800 /**< Reset Reduced MII Logic */.
> +.
> +/* Test Register */.
> +#define EMAC_TEST_SHCUT_PQUANTA 0x00000001 /**< Shortcut Pause Quanta */.
> +#define EMAC_TEST_TST_PAUSE 0x00000002 /**< Test Pause */.
> +#define EMAC_TEST_TST_BACKP 0x00000004 /**< Test Back Pressure */.
> +.
> +/* MII Management Configuration Register */.
> +#define EMAC_MCFG_SCAN_INC 0x00000001 /**< Scan Increment PHY Address */.
> +#define EMAC_MCFG_SUPP_PREAM 0x00000002 /**< Suppress Preamble */.
> +#define EMAC_MCFG_CLK_SEL(n) ((n&0x0F)<<2) /**< Clock Select Field */.
> +#define EMAC_MCFG_RES_MII 0x00008000 /**< Reset MII Management Hardware */.
> +#define EMAC_MCFG_MII_MAXCLK 2500000UL /**< MII Clock max */.
> +.
> +/* MII Management Command Register */.
> +#define EMAC_MCMD_READ 0x00000001 /**< MII Read */.
> +#define EMAC_MCMD_SCAN 0x00000002 /**< MII Scan continuously */.
> +.
> +#define EMAC_MII_WR_TOUT 0x00050000 /**< MII Write timeout count */.
> +#define EMAC_MII_RD_TOUT 0x00050000 /**< MII Read timeout count */.
> +.
> +/* MII Management Address Register */.
> +#define EMAC_MADR_REG_ADR(n) (n&0x1F) /**< MII Register Address field */.
> +#define EMAC_MADR_PHY_ADR(n) ((n&0x1F)<<8) /**< PHY Address Field */.
> +.
> +/* MII Management Write Data Register */.
> +#define EMAC_MWTD_DATA(n) (n&0xFFFF) /**< Data field for MMI Management Write Data register */.
> +.
> +/* MII Management Read Data Register */.
> +#define EMAC_MRDD_DATA(n) (n&0xFFFF) /**< Data field for MMI Management Read Data register */.
> +.
> +/* MII Management Indicators Register */.
> +#define EMAC_MIND_BUSY 0x00000001 /**< MII is Busy */.
> +#define EMAC_MIND_SCAN 0x00000002 /**< MII Scanning in Progress */.
> +#define EMAC_MIND_NOT_VAL 0x00000004 /**< MII Read Data not valid */.
> +#define EMAC_MIND_MII_LINK_FAIL 0x00000008 /**< MII Link Failed */.
> +.
> +/* Station Address 0 Register */.
> +/* Station Address 1 Register */.
> +/* Station Address 2 Register */.
> +.
> +.
> +/* Control register definitions --------------------------------------------------------------------------- */.
> +/* Command Register */.
> +#define EMAC_CR_RX_EN 0x00000001 /**< Enable Receive */.
> +#define EMAC_CR_TX_EN 0x00000002 /**< Enable Transmit */.
> +#define EMAC_CR_REG_RES 0x00000008 /**< Reset Host Registers */.
> +#define EMAC_CR_TX_RES 0x00000010 /**< Reset Transmit Datapath */.
> +#define EMAC_CR_RX_RES 0x00000020 /**< Reset Receive Datapath */.
> +#define EMAC_CR_PASS_RUNT_FRM 0x00000040 /**< Pass Runt Frames */.
> +#define EMAC_CR_PASS_RX_FILT 0x00000080 /**< Pass RX Filter */.
> +#define EMAC_CR_TX_FLOW_CTRL 0x00000100 /**< TX Flow Control */.
> +#define EMAC_CR_RMII 0x00000200 /**< Reduced MII Interface */.
> +#define EMAC_CR_FULL_DUP 0x00000400 /**< Full Duplex */.
> +.
> +/* Status Register */.
> +#define EMAC_SR_RX_EN 0x00000001 /**< Enable Receive */.
> +#define EMAC_SR_TX_EN 0x00000002 /**< Enable Transmit */.
> +.
> +/* Receive Descriptor Base Address Register */.
> +//.
> +.
> +/* Receive Status Base Address Register */.
> +//.
> +.
> +/* Receive Number of Descriptors Register */.
> +//.
> +.
> +/* Receive Produce Index Register */.
> +//.
> +.
> +/* Receive Consume Index Register */.
> +//.
> +.
> +/* Transmit Descriptor Base Address Register */.
> +//.
> +.
> +/* Transmit Status Base Address Register */.
> +//.
> +.
> +/* Transmit Number of Descriptors Register */.
> +//.
> +.
> +/* Transmit Produce Index Register */.
> +//.
> +.
> +/* Transmit Consume Index Register */.
> +//.
> +.
> +/* Transmit Status Vector 0 Register */.
> +#define EMAC_TSV0_CRC_ERR 0x00000001 /**< CRC error */.
> +#define EMAC_TSV0_LEN_CHKERR 0x00000002 /**< Length Check Error */.
> +#define EMAC_TSV0_LEN_OUTRNG 0x00000004 /**< Length Out of Range */.
> +#define EMAC_TSV0_DONE 0x00000008 /**< Tramsmission Completed */.
> +#define EMAC_TSV0_MCAST 0x00000010 /**< Multicast Destination */.
> +#define EMAC_TSV0_BCAST 0x00000020 /**< Broadcast Destination */.
> +#define EMAC_TSV0_PKT_DEFER 0x00000040 /**< Packet Deferred */.
> +#define EMAC_TSV0_EXC_DEFER 0x00000080 /**< Excessive Packet Deferral */.
> +#define EMAC_TSV0_EXC_COLL 0x00000100 /**< Excessive Collision */.
> +#define EMAC_TSV0_LATE_COLL 0x00000200 /**< Late Collision Occured */.
> +#define EMAC_TSV0_GIANT 0x00000400 /**< Giant Frame */.
> +#define EMAC_TSV0_UNDERRUN 0x00000800 /**< Buffer Underrun */.
> +#define EMAC_TSV0_BYTES 0x0FFFF000 /**< Total Bytes Transferred */.
> +#define EMAC_TSV0_CTRL_FRAME 0x10000000 /**< Control Frame */.
> +#define EMAC_TSV0_PAUSE 0x20000000 /**< Pause Frame */.
> +#define EMAC_TSV0_BACK_PRESS 0x40000000 /**< Backpressure Method Applied */.
> +#define EMAC_TSV0_VLAN 0x80000000 /**< VLAN Frame */.
> +.
> +/* Transmit Status Vector 1 Register */.
> +#define EMAC_TSV1_BYTE_CNT 0x0000FFFF /**< Transmit Byte Count */.
> +#define EMAC_TSV1_COLL_CNT 0x000F0000 /**< Transmit Collision Count */.
> +.
> +/* Receive Status Vector Register */.
> +#define EMAC_RSV_BYTE_CNT 0x0000FFFF /**< Receive Byte Count */.
> +#define EMAC_RSV_PKT_IGNORED 0x00010000 /**< Packet Previously Ignored */.
> +#define EMAC_RSV_RXDV_SEEN 0x00020000 /**< RXDV Event Previously Seen */.
> +#define EMAC_RSV_CARR_SEEN 0x00040000 /**< Carrier Event Previously Seen */.
> +#define EMAC_RSV_REC_CODEV 0x00080000 /**< Receive Code Violation */.
> +#define EMAC_RSV_CRC_ERR 0x00100000 /**< CRC Error */.
> +#define EMAC_RSV_LEN_CHKERR 0x00200000 /**< Length Check Error */.
> +#define EMAC_RSV_LEN_OUTRNG 0x00400000 /**< Length Out of Range */.
> +#define EMAC_RSV_REC_OK 0x00800000 /**< Frame Received OK */.
> +#define EMAC_RSV_MCAST 0x01000000 /**< Multicast Frame */.
> +#define EMAC_RSV_BCAST 0x02000000 /**< Broadcast Frame */.
> +#define EMAC_RSV_DRIB_NIBB 0x04000000 /**< Dribble Nibble */.
> +#define EMAC_RSV_CTRL_FRAME 0x08000000 /**< Control Frame */.
> +#define EMAC_RSV_PAUSE 0x10000000 /**< Pause Frame */.
> +#define EMAC_RSV_UNSUPP_OPC 0x20000000 /**< Unsupported Opcode */.
> +#define EMAC_RSV_VLAN 0x40000000 /**< VLAN Frame */.
> +.
> +/* Flow Control Counter Register */.
> +#define EMAC_FCC_MIRR_CNT(n) (n&0xFFFF) /**< Mirror Counter */.
> +#define EMAC_FCC_PAUSE_TIM(n) ((n&0xFFFF)<<16) /**< Pause Timer */.
> +.
> +/* Flow Control Status Register */.
> +#define EMAC_FCS_MIRR_CNT(n) (n&0xFFFF) /**< Mirror Counter Current */.
> +.
> +.
> +/* Receive filter register definitions -------------------------------------------------------- */.
> +/* Receive Filter Control Register */.
> +#define EMAC_RFC_UCAST_EN 0x00000001 /**< Accept Unicast Frames Enable */.
> +#define EMAC_RFC_BCAST_EN 0x00000002 /**< Accept Broadcast Frames Enable */.
> +#define EMAC_RFC_MCAST_EN 0x00000004 /**< Accept Multicast Frames Enable */.
> +#define EMAC_RFC_UCAST_HASH_EN 0x00000008 /**< Accept Unicast Hash Filter Frames */.
> +#define EMAC_RFC_MCAST_HASH_EN 0x00000010 /**< Accept Multicast Hash Filter Fram.*/.
> +#define EMAC_RFC_PERFECT_EN 0x00000020 /**< Accept Perfect Match Enable */.
> +#define EMAC_RFC_MAGP_WOL_EN 0x00001000 /**< Magic Packet Filter WoL Enable */.
> +#define EMAC_RFC_PFILT_WOL_EN 0x00002000 /**< Perfect Filter WoL Enable */.
> +.
> +/* Receive Filter WoL Status/Clear Registers */.
> +#define EMAC_WOL_UCAST 0x00000001 /**< Unicast Frame caused WoL */.
> +#define EMAC_WOL_BCAST 0x00000002 /**< Broadcast Frame caused WoL */.
> +#define EMAC_WOL_MCAST 0x00000004 /**< Multicast Frame caused WoL */.
> +#define EMAC_WOL_UCAST_HASH 0x00000008 /**< Unicast Hash Filter Frame WoL */.
> +#define EMAC_WOL_MCAST_HASH 0x00000010 /**< Multicast Hash Filter Frame WoL */.
> +#define EMAC_WOL_PERFECT 0x00000020 /**< Perfect Filter WoL */.
> +#define EMAC_WOL_RX_FILTER 0x00000080 /**< RX Filter caused WoL */.
> +#define EMAC_WOL_MAG_PACKET 0x00000100 /**< Magic Packet Filter caused WoL */.
> +#define EMAC_WOL_BITMASK 0x01BF /**< Receive Filter WoL Status/Clear bitmasl value */.
> +.
> +/* Hash Filter Table LSBs Register */.
> +//.
> +.
> +/* Hash Filter Table MSBs Register */.
> +//.
> +.
> +.
> +/* Module control register definitions ---------------------------------------------------- */.
> +/* Interrupt Status/Enable/Clear/Set Registers */.
> +#define EMAC_INT_RX_OVERRUN 0x00000001 /**< Overrun Error in RX Queue */.
> +#define EMAC_INT_RX_ERR 0x00000002 /**< Receive Error */.
> +#define EMAC_INT_RX_FIN 0x00000004 /**< RX Finished Process Descriptors */.
> +#define EMAC_INT_RX_DONE 0x00000008 /**< Receive Done */.
> +#define EMAC_INT_TX_UNDERRUN 0x00000010 /**< Transmit Underrun */.
> +#define EMAC_INT_TX_ERR 0x00000020 /**< Transmit Error */.
> +#define EMAC_INT_TX_FIN 0x00000040 /**< TX Finished Process Descriptors */.
> +#define EMAC_INT_TX_DONE 0x00000080 /**< Transmit Done */.
> +#define EMAC_INT_SOFT_INT 0x00001000 /**< Software Triggered Interrupt */.
> +#define EMAC_INT_WAKEUP 0x00002000 /**< Wakeup Event Interrupt */.
> +.
> +/* Power Down Register */.
> +#define EMAC_PD_POWER_DOWN 0x80000000 /**< Power Down MAC */.
> +.
> +/* RX Descriptor Control Word */.
> +#define EMAC_RCTRL_SIZE(n) (n&0x7FF) /**< Buffer size field */.
> +#define EMAC_RCTRL_INT 0x80000000 /**< Generate RxDone Interrupt */.
> +.
> +/* RX Status Hash CRC Word */.
> +#define EMAC_RHASH_SA 0x000001FF /**< Hash CRC for Source Address */.
> +#define EMAC_RHASH_DA 0x001FF000 /**< Hash CRC for Destination Address */.
> +.
> +/* RX Status Information Word */.
> +#define EMAC_RINFO_SIZE 0x000007FF /**< Data size in bytes */.
> +#define EMAC_RINFO_CTRL_FRAME 0x00040000 /**< Control Frame */.
> +#define EMAC_RINFO_VLAN 0x00080000 /**< VLAN Frame */.
> +#define EMAC_RINFO_FAIL_FILT 0x00100000 /**< RX Filter Failed */.
> +#define EMAC_RINFO_MCAST 0x00200000 /**< Multicast Frame */.
> +#define EMAC_RINFO_BCAST 0x00400000 /**< Broadcast Frame */.
> +#define EMAC_RINFO_CRC_ERR 0x00800000 /**< CRC Error in Frame */.
> +#define EMAC_RINFO_SYM_ERR 0x01000000 /**< Symbol Error from PHY */.
> +#define EMAC_RINFO_LEN_ERR 0x02000000 /**< Length Error */.
> +#define EMAC_RINFO_RANGE_ERR 0x04000000 /**< Range Error (exceeded max. size) */.
> +#define EMAC_RINFO_ALIGN_ERR 0x08000000 /**< Alignment Error */.
> +#define EMAC_RINFO_OVERRUN 0x10000000 /**< Receive overrun */.
> +#define EMAC_RINFO_NO_DESCR 0x20000000 /**< No new Descriptor available */.
> +#define EMAC_RINFO_LAST_FLAG 0x40000000 /**< Last Fragment in Frame */.
> +#define EMAC_RINFO_ERR 0x80000000 /**< Error Occured (OR of all errors) */.
> +.
> +/** RX Status Information word mask */.
> +#define EMAC_RINFO_ERR_MASK (EMAC_RINFO_FAIL_FILT | EMAC_RINFO_CRC_ERR | EMAC_RINFO_SYM_ERR | \.
> +EMAC_RINFO_LEN_ERR | EMAC_RINFO_ALIGN_ERR | EMAC_RINFO_OVERRUN).
> +.
> +/* TX Descriptor Control Word */.
> +#define EMAC_TCTRL_SIZE 0x000007FF /**< Size of data buffer in bytes */.
> +#define EMAC_TCTRL_OVERRIDE 0x04000000 /**< Override Default MAC Registers */.
> +#define EMAC_TCTRL_HUGE 0x08000000 /**< Enable Huge Frame */.
> +#define EMAC_TCTRL_PAD 0x10000000 /**< Pad short Frames to 64 bytes */.
> +#define EMAC_TCTRL_CRC 0x20000000 /**< Append a hardware CRC to Frame */.
> +#define EMAC_TCTRL_LAST 0x40000000 /**< Last Descriptor for TX Frame */.
> +#define EMAC_TCTRL_INT 0x80000000 /**< Generate TxDone Interrupt */.
> +.
> +/* TX Status Information Word */.
> +#define EMAC_TINFO_COL_CNT 0x01E00000 /**< Collision Count */.
> +#define EMAC_TINFO_DEFER 0x02000000 /**< Packet Deferred (not an error) */.
> +#define EMAC_TINFO_EXCESS_DEF 0x04000000 /**< Excessive Deferral */.
> +#define EMAC_TINFO_EXCESS_COL 0x08000000 /**< Excessive Collision */.
> +#define EMAC_TINFO_LATE_COL 0x10000000 /**< Late Collision Occured */.
> +#define EMAC_TINFO_UNDERRUN 0x20000000 /**< Transmit Underrun */.
> +#define EMAC_TINFO_NO_DESCR 0x40000000 /**< No new Descriptor available */.
> +#define EMAC_TINFO_ERR 0x80000000 /**< Error Occured (OR of all errors) */.
> +.
> +.
> +/* DP83848C PHY definition ------------------------------------------------------------ */.
> +.
> +/** PHY device reset time out definition */.
> +#define EMAC_PHY_RESP_TOUT 0x100000UL.
> +.
> +/* ENET Device Revision ID */.
> +#define EMAC_OLD_EMAC_MODULE_ID 0x39022000 /**< Rev. ID for first rev '-' */.
> +.
> +/* DP83848C PHY Registers */.
> +#define EMAC_PHY_REG_BMCR 0x00 /**< Basic Mode Control Register */.
> +#define EMAC_PHY_REG_BMSR 0x01 /**< Basic Mode Status Register */.
> +#define EMAC_PHY_REG_IDR1 0x02 /**< PHY Identifier 1 */.
> +#define EMAC_PHY_REG_IDR2 0x03 /**< PHY Identifier 2 */.
> +#define EMAC_PHY_REG_ANAR 0x04 /**< Auto-Negotiation Advertisement */.
> +#define EMAC_PHY_REG_ANLPAR 0x05 /**< Auto-Neg. Link Partner Abitily */.
> +#define EMAC_PHY_REG_ANER 0x06 /**< Auto-Neg. Expansion Register */.
> +#define EMAC_PHY_REG_ANNPTR 0x07 /**< Auto-Neg. Next Page TX */.
> +#define EMAC_PHY_REG_LPNPA 0x08.
> +.
> +.
> +/* PHY Extended Registers */.
> +#define EMAC_PHY_REG_STS 0x10 /**< Status Register */.
> +#define EMAC_PHY_REG_MICR 0x11 /**< MII Interrupt Control Register */.
> +#define EMAC_PHY_REG_MISR 0x12 /**< MII Interrupt Status Register */.
> +#define EMAC_PHY_REG_FCSCR 0x14 /**< False Carrier Sense Counter */.
> +#define EMAC_PHY_REG_RECR 0x15 /**< Receive Error Counter */.
> +#define EMAC_PHY_REG_PCSR 0x16 /**< PCS Sublayer Config. and Status */.
> +#define EMAC_PHY_REG_RBR 0x17 /**< RMII and Bypass Register */.
> +#define EMAC_PHY_REG_LEDCR 0x18 /**< LED Direct Control Register */.
> +#define EMAC_PHY_REG_PHYCR 0x19 /**< PHY Control Register */.
> +#define EMAC_PHY_REG_10BTSCR 0x1A /**< 10Base-T Status/Control Register */.
> +#define EMAC_PHY_REG_CDCTRL1 0x1B /**< CD Test Control and BIST Extens. */.
> +#define EMAC_PHY_REG_EDCR 0x1D /**< Energy Detect Control Register */.
> +.
> +.
> +/* PHY Basic Mode Control Register (BMCR) bitmap definitions */.
> +#define EMAC_PHY_BMCR_RESET (1<<15) /**< Reset bit */.
> +#define EMAC_PHY_BMCR_LOOPBACK (1<<14) /**< Loop back */.
> +#define EMAC_PHY_BMCR_SPEED_SEL (1<<13) /**< Speed selection */.
> +#define EMAC_PHY_BMCR_AN (1<<12) /**< Auto Negotiation */.
> +#define EMAC_PHY_BMCR_POWERDOWN (1<<11) /**< Power down mode */.
> +#define EMAC_PHY_BMCR_ISOLATE (1<<10) /**< Isolate */.
> +#define EMAC_PHY_BMCR_RE_AN (1<<9) /**< Restart auto negotiation */.
> +#define EMAC_PHY_BMCR_DUPLEX (1<<8) /**< Duplex mode */.
> +.
> +/* PHY Basic Mode Status Status Register (BMSR) bitmap definitions */.
> +#define EMAC_PHY_BMSR_100BE_T4 (1<<15) /**< 100 base T4 */.
> +#define EMAC_PHY_BMSR_100TX_FULL (1<<14) /**< 100 base full duplex */.
> +#define EMAC_PHY_BMSR_100TX_HALF (1<<13) /**< 100 base half duplex */.
> +#define EMAC_PHY_BMSR_10BE_FULL (1<<12) /**< 10 base T full duplex */.
> +#define EMAC_PHY_BMSR_10BE_HALF (1<<11) /**< 10 base T half duplex */.
> +#define EMAC_PHY_BMSR_NOPREAM (1<<6) /**< MF Preamable Supress */.
> +#define EMAC_PHY_BMSR_AUTO_DONE (1<<5) /**< Auto negotiation complete */.
> +#define EMAC_PHY_BMSR_REMOTE_FAULT (1<<4) /**< Remote fault */.
> +#define EMAC_PHY_BMSR_NO_AUTO (1<<3) /**< Auto Negotiation ability */.
> +#define EMAC_PHY_BMSR_LINK_ESTABLISHED (1<<2) /**< Link status */.
> +.
> +/* PHY Status Register bitmap definitions */.
> +#define EMAC_PHY_SR_REMOTE_FAULT (1<<6) /**< Remote Fault */.
> +#define EMAC_PHY_SR_JABBER (1<<5) /**< Jabber detect */.
> +#define EMAC_PHY_SR_AUTO_DONE (1<<4) /**< Auto Negotiation complete */.
> +#define EMAC_PHY_SR_LOOPBACK (1<<3) /**< Loop back status */.
> +#define EMAC_PHY_SR_DUP (1<<2) /**< Duplex status */.
> +#define EMAC_PHY_SR_SPEED (1<<1) /**< Speed status */.
> +#define EMAC_PHY_SR_LINK (1<<0) /**< Link Status */.
> +.
> +.
> +#define EMAC_PHY_FULLD_100M 0x2100 /**< Full Duplex 100Mbit */.
> +#define EMAC_PHY_HALFD_100M 0x2000 /**< Half Duplex 100Mbit */.
> +#define EMAC_PHY_FULLD_10M 0x0100 /**< Full Duplex 10Mbit */.
> +#define EMAC_PHY_HALFD_10M 0x0000 /**< Half Duplex 10MBit */.
> +#define EMAC_PHY_AUTO_NEG 0x3000 /**< Select Auto Negotiation */.
> +.
> +#define EMAC_DP83848C_DEF_ADR 0x0100 /**< Default PHY device address */.
> +#define EMAC_DP83848C_ID 0x20005C90 /**< PHY Identifier */.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Types --------------------------------------------------------------- */.
> +/** @defgroup EMAC_Public_Types.
> + * @{.
> + */.
> +.
> +/* Descriptor and status formats ---------------------------------------------- */.
> +.
> +/**.
> + * @brief RX Descriptor structure type definition.
> + */.
> +typedef struct {.
> + uint32_t Packet; /**< Receive Packet Descriptor */.
> + uint32_t Ctrl; /**< Receive Control Descriptor */.
> +} RX_Desc;.
> +.
> +/**.
> + * @brief RX Status structure type definition.
> + */.
> +typedef struct {.
> + uint32_t Info; /**< Receive Information Status */.
> + uint32_t HashCRC; /**< Receive Hash CRC Status */.
> +} RX_Stat;.
> +.
> +/**.
> + * @brief TX Descriptor structure type definition.
> + */.
> +typedef struct {.
> + uint32_t Packet; /**< Transmit Packet Descriptor */.
> + uint32_t Ctrl; /**< Transmit Control Descriptor */.
> +} TX_Desc;.
> +.
> +/**.
> + * @brief TX Status structure type definition.
> + */.
> +typedef struct {.
> + uint32_t Info; /**< Transmit Information Status */.
> +} TX_Stat;.
> +.
> +.
> +/**.
> + * @brief TX Data Buffer structure definition.
> + */.
> +typedef struct {.
> + uint32_t ulDataLen; /**< Data length */.
> + uint32_t *pbDataBuf; /**< A word-align data pointer to data buffer */.
> +} EMAC_PACKETBUF_Type;.
> +.
> +/**.
> + * @brief EMAC configuration structure definition.
> + */.
> +typedef struct {.
> + uint32_t Mode; /**< Supported EMAC PHY device speed, should be one of the following:.
> + - EMAC_MODE_AUTO.
> + - EMAC_MODE_10M_FULL.
> + - EMAC_MODE_10M_HALF.
> + - EMAC_MODE_100M_FULL.
> + - EMAC_MODE_100M_HALF.
> + */.
> + uint8_t *pbEMAC_Addr; /**< Pointer to EMAC Station address that contains 6-bytes.
> + of MAC address, it must be sorted in order (bEMAC_Addr[0]..[5]).
> + */.
> +} EMAC_CFG_Type;.
> +.
> +/** EMAC Call back function type definition */.
> +typedef void (EMAC_IntCBSType)(void);.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Macros -------------------------------------------------------------- */.
> +/** @defgroup EMAC_Public_Macros.
> + * @{.
> + */.
> +.
> +.
> +/* EMAC PHY status type definitions */.
> +#define EMAC_PHY_STAT_LINK (0) /**< Link Status */.
> +#define EMAC_PHY_STAT_SPEED (1) /**< Speed Status */.
> +#define EMAC_PHY_STAT_DUP (2) /**< Duplex Status */.
> +.
> +/* EMAC PHY device Speed definitions */.
> +#define EMAC_MODE_AUTO (0) /**< Auto-negotiation mode */.
> +#define EMAC_MODE_10M_FULL (1) /**< 10Mbps FullDuplex mode */.
> +#define EMAC_MODE_10M_HALF (2) /**< 10Mbps HalfDuplex mode */.
> +#define EMAC_MODE_100M_FULL (3) /**< 100Mbps FullDuplex mode */.
> +#define EMAC_MODE_100M_HALF (4) /**< 100Mbps HalfDuplex mode */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup EMAC_Public_Functions.
> + * @{.
> + */.
> +.
> +Status EMAC_Init(EMAC_CFG_Type *EMAC_ConfigStruct);.
> +void EMAC_DeInit(void);.
> +int32_t EMAC_CheckPHYStatus(uint32_t ulPHYState);.
> +int32_t EMAC_SetPHYMode(uint32_t ulPHYMode);.
> +int32_t EMAC_UpdatePHYStatus(void);.
> +void EMAC_SetHashFilter(uint8_t dstMAC_addr[], FunctionalState NewState);.
> +int32_t EMAC_CRCCalc(uint8_t frame_no_fcs[], int32_t frame_len);.
> +void EMAC_SetFilterMode(uint32_t ulFilterMode, FunctionalState NewState);.
> +FlagStatus EMAC_GetWoLStatus(uint32_t ulWoLMode);.
> +void EMAC_WritePacketBuffer(EMAC_PACKETBUF_Type *pDataStruct);.
> +void EMAC_ReadPacketBuffer(EMAC_PACKETBUF_Type *pDataStruct);.
> +void EMAC_StandardIRQHandler(void);.
> +void EMAC_SetupIntCBS(uint32_t ulIntType, EMAC_IntCBSType *pfnIntCb);.
> +void EMAC_IntCmd(uint32_t ulIntType, FunctionalState NewState);.
> +IntStatus EMAC_IntGetStatus(uint32_t ulIntType);.
> +Bool EMAC_CheckReceiveIndex(void);.
> +Bool EMAC_CheckTransmitIndex(void);.
> +FlagStatus EMAC_CheckReceiveDataStatus(uint32_t ulRxStatType);.
> +uint32_t EMAC_GetReceiveDataSize(void);.
> +void EMAC_UpdateRxConsumeIndex(void);.
> +void EMAC_UpdateTxProduceIndex(void);.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +#ifdef __cplusplus.
> +}.
> +#endif.
> +.
> +#endif /* LPC17XX_EMAC_H_ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/gpio/Makefile b/arch/arm/mach-lpc17cmsis/libs/gpio/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/gpio/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/gpio/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/gpio/Makefile.omk
> new file mode 100644
> index 0000000..545ec67
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/gpio/Makefile.omk
> @@ -0,0 +1,8 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = gpio
> +
> +gpio_SOURCES = lpc17xx_gpio.c
> +include_HEADERS = lpc17xx_gpio.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.c b/arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.c
> new file mode 100644
> index 0000000..1004a7a
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.c
> @@ -0,0 +1,657 @@
> +/**.
> + * @file : lpc17xx_gpio.c.
> + * @brief : Contains all functions support for GPIO firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 11. Jun. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **********************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @addtogroup GPIO.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_gpio.h".
> +.
> +/* If this source file built with example, the LPC17xx FW library configuration.
> + * file in each example directory ("lpc17xx_libcfg.h") must be included,.
> + * otherwise the default FW library configuration file must be included instead.
> + */.
> +#ifdef __BUILD_WITH_EXAMPLE__.
> +#include "lpc17xx_libcfg.h".
> +#else.
> +#include "lpc17xx_libcfg_default.h".
> +#endif /* __BUILD_WITH_EXAMPLE__ */.
> +.
> +.
> +#ifdef _GPIO.
> +.
> +/* Private Functions ---------------------------------------------------------- */.
> +/** @addtogroup GPIO_Private_Functions.
> + * @{.
> + */.
> +/*********************************************************************//**.
> + * @brief Get pointer to GPIO peripheral due to GPIO port.
> + * @param[in] portNum Port Number value, should be in range from 0 to 4..
> + * @return Pointer to GPIO peripheral.
> + **********************************************************************/.
> +static LPC_GPIO_TypeDef *GPIO_GetPointer(uint8_t portNum).
> +{.
> + LPC_GPIO_TypeDef *pGPIO = NULL;.
> +.
> + switch (portNum) {.
> + case 0:.
> + pGPIO = LPC_GPIO0;.
> + break;.
> + case 1:.
> + pGPIO = LPC_GPIO1;.
> + break;.
> + case 2:.
> + pGPIO = LPC_GPIO2;.
> + break;.
> + case 3:.
> + pGPIO = LPC_GPIO3;.
> + break;.
> + case 4:.
> + pGPIO = LPC_GPIO4;.
> + break;.
> + default:.
> + break;.
> + }.
> +.
> + return pGPIO;.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Get pointer to FIO peripheral in halfword accessible style.
> + * due to FIO port.
> + * @param[in] portNum Port Number value, should be in range from 0 to 4..
> + * @return Pointer to FIO peripheral.
> + **********************************************************************/.
> +static GPIO_HalfWord_TypeDef *FIO_HalfWordGetPointer(uint8_t portNum).
> +{.
> + GPIO_HalfWord_TypeDef *pFIO = NULL;.
> +.
> + switch (portNum) {.
> + case 0:.
> + pFIO = GPIO0_HalfWord;.
> + break;.
> + case 1:.
> + pFIO = GPIO1_HalfWord;.
> + break;.
> + case 2:.
> + pFIO = GPIO2_HalfWord;.
> + break;.
> + case 3:.
> + pFIO = GPIO3_HalfWord;.
> + break;.
> + case 4:.
> + pFIO = GPIO4_HalfWord;.
> + break;.
> + default:.
> + break;.
> + }.
> +.
> + return pFIO;.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Get pointer to FIO peripheral in byte accessible style.
> + * due to FIO port.
> + * @param[in] portNum Port Number value, should be in range from 0 to 4..
> + * @return Pointer to FIO peripheral.
> + **********************************************************************/.
> +static GPIO_Byte_TypeDef *FIO_ByteGetPointer(uint8_t portNum).
> +{.
> + GPIO_Byte_TypeDef *pFIO = NULL;.
> +.
> + switch (portNum) {.
> + case 0:.
> + pFIO = GPIO0_Byte;.
> + break;.
> + case 1:.
> + pFIO = GPIO1_Byte;.
> + break;.
> + case 2:.
> + pFIO = GPIO2_Byte;.
> + break;.
> + case 3:.
> + pFIO = GPIO3_Byte;.
> + break;.
> + case 4:.
> + pFIO = GPIO4_Byte;.
> + break;.
> + default:.
> + break;.
> + }.
> +.
> + return pFIO;.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup GPIO_Public_Functions.
> + * @{.
> + */.
> +.
> +.
> +/* GPIO ------------------------------------------------------------------------------ */.
> +.
> +/*********************************************************************//**.
> + * @brief Set Direction for GPIO port..
> + * @param[in] portNum Port Number value, should be in range from 0 to 4.
> + * @param[in] bitValue Value that contains all bits to set direction,.
> + * in range from 0 to 0xFFFFFFFF..
> + * example: value 0x5 to set direction for bit 0 and bit 1..
> + * @param[in] dir Direction value, should be:.
> + * - 0: Input..
> + * - 1: Output..
> + * @return None.
> + *.
> + * Note: All remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + **********************************************************************/.
> +void GPIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir).
> +{.
> + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum);.
> +.
> + if (pGPIO != NULL) {.
> + // Enable Output.
> + if (dir) {.
> + pGPIO->FIODIR |= bitValue;.
> + }.
> + // Enable Input.
> + else {.
> + pGPIO->FIODIR &= ~bitValue;.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Set Value for bits that have output direction on GPIO port..
> + * @param[in] portNum Port number value, should be in range from 0 to 4.
> + * @param[in] bitValue Value that contains all bits on GPIO to set,.
> + * in range from 0 to 0xFFFFFFFF..
> + * example: value 0x5 to set bit 0 and bit 1..
> + * @return None.
> + *.
> + * Note:.
> + * - For all bits that has been set as input direction, this function will.
> + * not effect..
> + * - For all remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + **********************************************************************/.
> +void GPIO_SetValue(uint8_t portNum, uint32_t bitValue).
> +{.
> + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum);.
> +.
> + if (pGPIO != NULL) {.
> + pGPIO->FIOSET = bitValue;.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Clear Value for bits that have output direction on GPIO port..
> + * @param[in] portNum Port number value, should be in range from 0 to 4.
> + * @param[in] bitValue Value that contains all bits on GPIO to clear,.
> + * in range from 0 to 0xFFFFFFFF..
> + * example: value 0x5 to clear bit 0 and bit 1..
> + * @return None.
> + *.
> + * Note:.
> + * - For all bits that has been set as input direction, this function will.
> + * not effect..
> + * - For all remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + **********************************************************************/.
> +void GPIO_ClearValue(uint8_t portNum, uint32_t bitValue).
> +{.
> + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum);.
> +.
> + if (pGPIO != NULL) {.
> + pGPIO->FIOCLR = bitValue;.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Read Current state on port pin that have input direction of GPIO.
> + * @param[in] portNum Port number to read value, in range from 0 to 4.
> + * @return Current value of GPIO port..
> + *.
> + * Note: Return value contain state of each port pin (bit) on that GPIO regardless.
> + * its direction is input or output..
> + **********************************************************************/.
> +uint32_t GPIO_ReadValue(uint8_t portNum).
> +{.
> + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum);.
> +.
> + if (pGPIO != NULL) {.
> + return pGPIO->FIOPIN;.
> + }.
> +.
> + return (0);.
> +}.
> +.
> +/* FIO word accessible ----------------------------------------------------------------- */.
> +/* Stub function for FIO (word-accessible) style */.
> +.
> +/**.
> + * @brief The same with GPIO_SetDir().
> + */.
> +void FIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir).
> +{.
> + GPIO_SetDir(portNum, bitValue, dir);.
> +}.
> +.
> +/**.
> + * @brief The same with GPIO_SetValue().
> + */.
> +void FIO_SetValue(uint8_t portNum, uint32_t bitValue).
> +{.
> + GPIO_SetValue(portNum, bitValue);.
> +}.
> +.
> +/**.
> + * @brief The same with GPIO_ClearValue().
> + */.
> +void FIO_ClearValue(uint8_t portNum, uint32_t bitValue).
> +{.
> + GPIO_ClearValue(portNum, bitValue);.
> +}.
> +.
> +/**.
> + * @brief The same with GPIO_ReadValue().
> + */.
> +uint32_t FIO_ReadValue(uint8_t portNum).
> +{.
> + return (GPIO_ReadValue(portNum));.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Set mask value for bits in FIO port.
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] bitValue Value that contains all bits in to set,.
> + * in range from 0 to 0xFFFFFFFF..
> + * @param[in] maskValue Mask value contains state value for each bit:.
> + * - 0: not mask..
> + * - 1: mask..
> + * @return None.
> + *.
> + * Note:.
> + * - All remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + * - After executing this function, in mask register, value '0' on each bit.
> + * enables an access to the corresponding physical pin via a read or write access,.
> + * while value '1' on bit (masked) that corresponding pin will not be changed.
> + * with write access and if read, will not be reflected in the updated pin..
> + **********************************************************************/.
> +void FIO_SetMask(uint8_t portNum, uint32_t bitValue, uint8_t maskValue).
> +{.
> + LPC_GPIO_TypeDef *pFIO = GPIO_GetPointer(portNum);.
> + if(pFIO != NULL) {.
> + // Mask.
> + if (maskValue){.
> + pFIO->FIOMASK |= bitValue;.
> + }.
> + // Un-mask.
> + else {.
> + pFIO->FIOMASK &= ~bitValue;.
> + }.
> + }.
> +}.
> +.
> +.
> +/* FIO halfword accessible ------------------------------------------------------------- */.
> +.
> +/*********************************************************************//**.
> + * @brief Set direction for FIO port in halfword accessible style.
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper).
> + * @param[in] bitValue Value that contains all bits in to set direction,.
> + * in range from 0 to 0xFFFF..
> + * @param[in] dir Direction value, should be:.
> + * - 0: Input..
> + * - 1: Output..
> + * @return None.
> + *.
> + * Note: All remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + **********************************************************************/.
> +void FIO_HalfWordSetDir(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue, uint8_t dir).
> +{.
> + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum);.
> + if(pFIO != NULL) {.
> + // Output direction.
> + if (dir) {.
> + // Upper.
> + if(halfwordNum) {.
> + pFIO->FIODIRU |= bitValue;.
> + }.
> + // lower.
> + else {.
> + pFIO->FIODIRL |= bitValue;.
> + }.
> + }.
> + // Input direction.
> + else {.
> + // Upper.
> + if(halfwordNum) {.
> + pFIO->FIODIRU &= ~bitValue;.
> + }.
> + // lower.
> + else {.
> + pFIO->FIODIRL &= ~bitValue;.
> + }.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Set mask value for bits in FIO port in halfword accessible style.
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper).
> + * @param[in] bitValue Value that contains all bits in to set,.
> + * in range from 0 to 0xFFFF..
> + * @param[in] maskValue Mask value contains state value for each bit:.
> + * - 0: not mask..
> + * - 1: mask..
> + * @return None.
> + *.
> + * Note:.
> + * - All remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + * - After executing this function, in mask register, value '0' on each bit.
> + * enables an access to the corresponding physical pin via a read or write access,.
> + * while value '1' on bit (masked) that corresponding pin will not be changed.
> + * with write access and if read, will not be reflected in the updated pin..
> + **********************************************************************/.
> +void FIO_HalfWordSetMask(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue, uint8_t maskValue).
> +{.
> + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum);.
> + if(pFIO != NULL) {.
> + // Mask.
> + if (maskValue){.
> + // Upper.
> + if(halfwordNum) {.
> + pFIO->FIOMASKU |= bitValue;.
> + }.
> + // lower.
> + else {.
> + pFIO->FIOMASKL |= bitValue;.
> + }.
> + }.
> + // Un-mask.
> + else {.
> + // Upper.
> + if(halfwordNum) {.
> + pFIO->FIOMASKU &= ~bitValue;.
> + }.
> + // lower.
> + else {.
> + pFIO->FIOMASKL &= ~bitValue;.
> + }.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Set bits for FIO port in halfword accessible style.
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper).
> + * @param[in] bitValue Value that contains all bits in to set,.
> + * in range from 0 to 0xFFFF..
> + * @return None.
> + *.
> + * Note:.
> + * - For all bits that has been set as input direction, this function will.
> + * not effect..
> + * - For all remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + **********************************************************************/.
> +void FIO_HalfWordSetValue(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue).
> +{.
> + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum);.
> + if(pFIO != NULL) {.
> + // Upper.
> + if(halfwordNum) {.
> + pFIO->FIOSETU = bitValue;.
> + }.
> + // lower.
> + else {.
> + pFIO->FIOSETL = bitValue;.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Clear bits for FIO port in halfword accessible style.
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper).
> + * @param[in] bitValue Value that contains all bits in to clear,.
> + * in range from 0 to 0xFFFF..
> + * @return None.
> + *.
> + * Note:.
> + * - For all bits that has been set as input direction, this function will.
> + * not effect..
> + * - For all remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + **********************************************************************/.
> +void FIO_HalfWordClearValue(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue).
> +{.
> + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum);.
> + if(pFIO != NULL) {.
> + // Upper.
> + if(halfwordNum) {.
> + pFIO->FIOCLRU = bitValue;.
> + }.
> + // lower.
> + else {.
> + pFIO->FIOCLRL = bitValue;.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Read Current state on port pin that have input direction of GPIO.
> + * in halfword accessible style..
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper).
> + * @return Current value of FIO port pin of specified halfword..
> + * Note: Return value contain state of each port pin (bit) on that FIO regardless.
> + * its direction is input or output..
> + **********************************************************************/.
> +uint16_t FIO_HalfWordReadValue(uint8_t portNum, uint8_t halfwordNum).
> +{.
> + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum);.
> + if(pFIO != NULL) {.
> + // Upper.
> + if(halfwordNum) {.
> + return (pFIO->FIOPINU);.
> + }.
> + // lower.
> + else {.
> + return (pFIO->FIOPINL);.
> + }.
> + }.
> + return (0);.
> +}.
> +.
> +.
> +/* FIO Byte accessible ------------------------------------------------------------ */.
> +.
> +/*********************************************************************//**.
> + * @brief Set direction for FIO port in byte accessible style.
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] byteNum Byte part number, should be in range from 0 to 3.
> + * @param[in] bitValue Value that contains all bits in to set direction,.
> + * in range from 0 to 0xFF..
> + * @param[in] dir Direction value, should be:.
> + * - 0: Input..
> + * - 1: Output..
> + * @return None.
> + *.
> + * Note: All remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + **********************************************************************/.
> +void FIO_ByteSetDir(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t dir).
> +{.
> + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum);.
> + if(pFIO != NULL) {.
> + // Output direction.
> + if (dir) {.
> + if ((byteNum >= 0) && (byteNum <= 3)) {.
> + pFIO->FIODIR[byteNum] |= bitValue;.
> + }.
> + }.
> + // Input direction.
> + else {.
> + if ((byteNum >= 0) && (byteNum <= 3)) {.
> + pFIO->FIODIR[byteNum] &= ~bitValue;.
> + }.
> + }.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Set mask value for bits in FIO port in byte accessible style.
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] byteNum Byte part number, should be in range from 0 to 3.
> + * @param[in] bitValue Value that contains all bits in to set mask,.
> + * in range from 0 to 0xFF..
> + * @param[in] maskValue Mask value contains state value for each bit:.
> + * - 0: not mask..
> + * - 1: mask..
> + * @return None.
> + *.
> + * Note:.
> + * - All remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + * - After executing this function, in mask register, value '0' on each bit.
> + * enables an access to the corresponding physical pin via a read or write access,.
> + * while value '1' on bit (masked) that corresponding pin will not be changed.
> + * with write access and if read, will not be reflected in the updated pin..
> + **********************************************************************/.
> +void FIO_ByteSetMask(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t maskValue).
> +{.
> + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum);.
> + if(pFIO != NULL) {.
> + // Mask.
> + if (maskValue) {.
> + if ((byteNum >= 0) && (byteNum <= 3)) {.
> + pFIO->FIOMASK[byteNum] |= bitValue;.
> + }.
> + }.
> + // Un-mask.
> + else {.
> + if ((byteNum >= 0) && (byteNum <= 3)) {.
> + pFIO->FIOMASK[byteNum] &= ~bitValue;.
> + }.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Set bits for FIO port in byte accessible style.
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] byteNum Byte part number, should be in range from 0 to 3.
> + * @param[in] bitValue Value that contains all bits in to set,.
> + * in range from 0 to 0xFF..
> + * @return None.
> + *.
> + * Note:.
> + * - For all bits that has been set as input direction, this function will.
> + * not effect..
> + * - For all remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + **********************************************************************/.
> +void FIO_ByteSetValue(uint8_t portNum, uint8_t byteNum, uint8_t bitValue).
> +{.
> + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum);.
> + if (pFIO != NULL) {.
> + if ((byteNum >= 0) && (byteNum <= 3)){.
> + pFIO->FIOSET[byteNum] = bitValue;.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Clear bits for FIO port in byte accessible style.
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] byteNum Byte part number, should be in range from 0 to 3.
> + * @param[in] bitValue Value that contains all bits in to clear,.
> + * in range from 0 to 0xFF..
> + * @return None.
> + *.
> + * Note:.
> + * - For all bits that has been set as input direction, this function will.
> + * not effect..
> + * - For all remaining bits that are not activated in bitValue (value '0').
> + * will not be effected by this function..
> + **********************************************************************/.
> +void FIO_ByteClearValue(uint8_t portNum, uint8_t byteNum, uint8_t bitValue).
> +{.
> + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum);.
> + if (pFIO != NULL) {.
> + if ((byteNum >= 0) && (byteNum <= 3)){.
> + pFIO->FIOCLR[byteNum] = bitValue;.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Read Current state on port pin that have input direction of GPIO.
> + * in byte accessible style..
> + * @param[in] portNum Port number, in range from 0 to 4.
> + * @param[in] byteNum Byte part number, should be in range from 0 to 3.
> + * @return Current value of FIO port pin of specified byte part..
> + * Note: Return value contain state of each port pin (bit) on that FIO regardless.
> + * its direction is input or output..
> + **********************************************************************/.
> +uint8_t FIO_ByteReadValue(uint8_t portNum, uint8_t byteNum).
> +{.
> + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum);.
> + if (pFIO != NULL) {.
> + if ((byteNum >= 0) && (byteNum <= 3)){.
> + return (pFIO->FIOPIN[byteNum]);.
> + }.
> + }.
> + return (0);.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +#endif /* _GPIO */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.h b/arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.h
> new file mode 100644
> index 0000000..8c05153
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/gpio/lpc17xx_gpio.h
> @@ -0,0 +1,166 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_gpio.h.
> + * @brief : Contains all macro definitions and function prototypes.
> + * support for GPIO firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 23. Apr. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @defgroup GPIO.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC17XX_GPIO_H_.
> +#define LPC17XX_GPIO_H_.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "LPC17xx.h".
> +#include "lpc_types.h".
> +.
> +.
> +#ifdef __cplusplus.
> +extern "C".
> +{.
> +#endif.
> +.
> +.
> +/* Public Types --------------------------------------------------------------- */.
> +/** @defgroup GPIO_Public_Types.
> + * @{.
> + */.
> +.
> +/**.
> + * @brief Fast GPIO port byte type definition.
> + */.
> +typedef struct {.
> + __IO uint8_t FIODIR[4]; /**< FIO direction register in byte-align */.
> + uint32_t RESERVED0[3]; /**< Reserved */.
> + __IO uint8_t FIOMASK[4]; /**< FIO mask register in byte-align */.
> + __IO uint8_t FIOPIN[4]; /**< FIO pin register in byte align */.
> + __IO uint8_t FIOSET[4]; /**< FIO set register in byte-align */.
> + __O uint8_t FIOCLR[4]; /**< FIO clear register in byte-align */.
> +} GPIO_Byte_TypeDef;.
> +.
> +.
> +/**.
> + * @brief Fast GPIO port half-word type definition.
> + */.
> +typedef struct {.
> + __IO uint16_t FIODIRL; /**< FIO direction register lower halfword part */.
> + __IO uint16_t FIODIRU; /**< FIO direction register upper halfword part */.
> + uint32_t RESERVED0[3]; /**< Reserved */.
> + __IO uint16_t FIOMASKL; /**< FIO mask register lower halfword part */.
> + __IO uint16_t FIOMASKU; /**< FIO mask register upper halfword part */.
> + __IO uint16_t FIOPINL; /**< FIO pin register lower halfword part */.
> + __IO uint16_t FIOPINU; /**< FIO pin register upper halfword part */.
> + __IO uint16_t FIOSETL; /**< FIO set register lower halfword part */.
> + __IO uint16_t FIOSETU; /**< FIO set register upper halfword part */.
> + __O uint16_t FIOCLRL; /**< FIO clear register lower halfword part */.
> + __O uint16_t FIOCLRU; /**< FIO clear register upper halfword part */.
> +} GPIO_HalfWord_TypeDef;.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Macros -------------------------------------------------------------- */.
> +/** @defgroup GPIO_Public_Macros.
> + * @{.
> + */.
> +.
> +/** Fast GPIO port 0 byte accessible definition */.
> +#define GPIO0_Byte ((GPIO_Byte_TypeDef *)(LPC_GPIO0_BASE)).
> +/** Fast GPIO port 1 byte accessible definition */.
> +#define GPIO1_Byte ((GPIO_Byte_TypeDef *)(LPC_GPIO1_BASE)).
> +/** Fast GPIO port 2 byte accessible definition */.
> +#define GPIO2_Byte ((GPIO_Byte_TypeDef *)(LPC_GPIO2_BASE)).
> +/** Fast GPIO port 3 byte accessible definition */.
> +#define GPIO3_Byte ((GPIO_Byte_TypeDef *)(LPC_GPIO3_BASE)).
> +/** Fast GPIO port 4 byte accessible definition */.
> +#define GPIO4_Byte ((GPIO_Byte_TypeDef *)(LPC_GPIO4_BASE)).
> +.
> +.
> +.
> +/** Fast GPIO port 0 half-word accessible definition */.
> +#define GPIO0_HalfWord ((GPIO_HalfWord_TypeDef *)(LPC_GPIO0_BASE)).
> +/** Fast GPIO port 1 half-word accessible definition */.
> +#define GPIO1_HalfWord ((GPIO_HalfWord_TypeDef *)(LPC_GPIO1_BASE)).
> +/** Fast GPIO port 2 half-word accessible definition */.
> +#define GPIO2_HalfWord ((GPIO_HalfWord_TypeDef *)(LPC_GPIO2_BASE)).
> +/** Fast GPIO port 3 half-word accessible definition */.
> +#define GPIO3_HalfWord ((GPIO_HalfWord_TypeDef *)(LPC_GPIO3_BASE)).
> +/** Fast GPIO port 4 half-word accessible definition */.
> +#define GPIO4_HalfWord ((GPIO_HalfWord_TypeDef *)(LPC_GPIO4_BASE)).
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup GPIO_Public_Functions.
> + * @{.
> + */.
> +.
> +/* GPIO style ------------------------------- */.
> +void GPIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir);.
> +void GPIO_SetValue(uint8_t portNum, uint32_t bitValue);.
> +void GPIO_ClearValue(uint8_t portNum, uint32_t bitValue);.
> +uint32_t GPIO_ReadValue(uint8_t portNum);.
> +.
> +/* FIO (word-accessible) style ------------------------------- */.
> +void FIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir);.
> +void FIO_SetValue(uint8_t portNum, uint32_t bitValue);.
> +void FIO_ClearValue(uint8_t portNum, uint32_t bitValue);.
> +uint32_t FIO_ReadValue(uint8_t portNum);.
> +void FIO_SetMask(uint8_t portNum, uint32_t bitValue, uint8_t maskValue);.
> +.
> +/* FIO (halfword-accessible) style ------------------------------- */.
> +void FIO_HalfWordSetDir(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue, uint8_t dir);.
> +void FIO_HalfWordSetMask(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue, uint8_t maskValue);.
> +void FIO_HalfWordSetValue(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue);.
> +void FIO_HalfWordClearValue(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue);.
> +uint16_t FIO_HalfWordReadValue(uint8_t portNum, uint8_t halfwordNum);.
> +.
> +/* FIO (byte-accessible) style ------------------------------- */.
> +void FIO_ByteSetDir(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t dir);.
> +void FIO_ByteSetMask(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t maskValue);.
> +void FIO_ByteSetValue(uint8_t portNum, uint8_t byteNum, uint8_t bitValue);.
> +void FIO_ByteClearValue(uint8_t portNum, uint8_t byteNum, uint8_t bitValue);.
> +uint8_t FIO_ByteReadValue(uint8_t portNum, uint8_t byteNum);.
> +.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +#ifdef __cplusplus.
> +}.
> +#endif.
> +.
> +#endif /* LPC17XX_GPIO_H_ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/ldscripts/Makefile b/arch/arm/mach-lpc17cmsis/libs/ldscripts/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/ldscripts/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/ldscripts/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/ldscripts/Makefile.omk
> new file mode 100644
> index 0000000..e47cf33
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/ldscripts/Makefile.omk
> @@ -0,0 +1,3 @@
> +# -*- makefile -*-
> +
> +lib_LDSCRIPTS = $(notdir $(wildcard $(SOURCES_DIR)/*.ld*))
> diff --git a/arch/arm/mach-lpc17cmsis/libs/ldscripts/lpc1768.ld-flash b/arch/arm/mach-lpc17cmsis/libs/ldscripts/lpc1768.ld-flash
> new file mode 100644
> index 0000000..b80cf7c
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/ldscripts/lpc1768.ld-flash
> @@ -0,0 +1,25 @@
> +/*
> + * LPC1768 internal FLASH (512KB FLASH + 32KB SRAM + 16K USB SRAM + 16K ETH SRAM)
> + */
> +
> +STARTUP(crt0_17xx.o)
> +INCLUDE board.ld /* Allow to INPUT board specific files */
> +
> +ENTRY(_start)
> +STACK_SIZE = 0x400;
> +
> +/* memory definitions */
> +
> +MEMORY
> +{
> + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K
> + RAM (rwx) : ORIGIN = 0x10000000, LENGTH = 32K
> +
> + RAM1(rwx) : ORIGIN = 0x2007C000, LENGTH = 16k
> + RAM2(rwx) : ORIGIN = 0x20080000, LENGTH = 16k
> +}
> +
> +
> +
> +/* include section definitions */
> +INCLUDE lpc17xx-flash.ld
> diff --git a/arch/arm/mach-lpc17cmsis/libs/ldscripts/lpc17xx-flash.ld b/arch/arm/mach-lpc17cmsis/libs/ldscripts/lpc17xx-flash.ld
> new file mode 100644
> index 0000000..ea49193
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/ldscripts/lpc17xx-flash.ld
> @@ -0,0 +1,117 @@
> +/***
> + * LPC17xx internal FLASH loadable by ISP
> + * uses internal FLASH and whole RAM at runtime
> + *
> + * by Marek Peca <mp(a)duch.cz> 2009/09, 2010/06
> + * Updated by Jiri Kubias <jiri.kubias(a)addat.cz>
> + ***/
> +
> +/*!* to be included by chip-specific linkerscript, containing memory defs *!*/
> +
> +/* section definitions only */
> +
> +SECTIONS
> +{
> + .ivec :
> + {
> + *(.ivec) /* interrupt entry points */
> + } > FLASH
> +
> + /* first section is .text which is used for code */
> + .text :
> + {
> + *crt0_17xx.o (.text) /* Startup code */
> + *(.text) /* remaining code */
> + *(.glue_7)
> + *(.glue_7t)
> + . = ALIGN(4);
> + _etext = .;
> + } > FLASH
> +
> + .rodata :
> + {
> + *(.rodata) /* read-only data (constants) */
> + *(.rodata*)
> + . = ALIGN(4);
> + } > FLASH
> +
> + /* .init_array - pointers to functions called before main */
> + PROVIDE(__init_array_start = .);
> + .init_array :
> + {
> + *(.init_array)
> + . = ALIGN(4);
> + } > FLASH = 0
> + PROVIDE (__init_array_end = .);
> +
> + /* .data section which is used for initialized data */
> + _datainit = LOADADDR(.data);
> + .data :
> + {
> + _data = .;
> + *(.data)
> + SORT(CONSTRUCTORS)
> + . = ALIGN(4);
> + _edata = .;
> + } > RAM AT> FLASH
> +
> + /* .bss section which is used for uninitialized data */
> + .bss (NOLOAD) :
> + {
> + __bss_start = .;
> + __bss_start__ = .;
> + *(.bss)
> + *(COMMON)
> + . = ALIGN(4);
> + __bss_end__ = .;
> + } > RAM
> +
> + .stack :
> + {
> + . += STACK_SIZE;
> + PROVIDE (_stack = .);
> + } > RAM
> +
> + _end = . ;
> + PROVIDE (end = .);
> +
> + /* This used for USB RAM section */
> + .usb_ram (NOLOAD):
> + {
> + *.o (USB_RAM)
> + } > RAM2
> +
> + /* Stabs debugging sections. */
> + .stab 0 : { *(.stab) }
> + .stabstr 0 : { *(.stabstr) }
> + .stab.excl 0 : { *(.stab.excl) }
> + .stab.exclstr 0 : { *(.stab.exclstr) }
> + .stab.index 0 : { *(.stab.index) }
> + .stab.indexstr 0 : { *(.stab.indexstr) }
> + .comment 0 : { *(.comment) }
> + /* DWARF debug sections.
> + Symbols in the DWARF debugging sections are relative to the beginning
> + of the section so we begin them at 0. */
> + /* DWARF 1 */
> + .debug 0 : { *(.debug) }
> + .line 0 : { *(.line) }
> + /* GNU DWARF 1 extensions */
> + .debug_srcinfo 0 : { *(.debug_srcinfo) }
> + .debug_sfnames 0 : { *(.debug_sfnames) }
> + /* DWARF 1.1 and DWARF 2 */
> + .debug_aranges 0 : { *(.debug_aranges) }
> + .debug_pubnames 0 : { *(.debug_pubnames) }
> + /* DWARF 2 */
> + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
> + .debug_abbrev 0 : { *(.debug_abbrev) }
> + .debug_line 0 : { *(.debug_line) }
> + .debug_frame 0 : { *(.debug_frame) }
> + .debug_str 0 : { *(.debug_str) }
> + .debug_loc 0 : { *(.debug_loc) }
> + .debug_macinfo 0 : { *(.debug_macinfo) }
> + /* SGI/MIPS DWARF 2 extensions */
> + .debug_weaknames 0 : { *(.debug_weaknames) }
> + .debug_funcnames 0 : { *(.debug_funcnames) }
> + .debug_typenames 0 : { *(.debug_typenames) }
> + .debug_varnames 0 : { *(.debug_varnames) }
> +}
> diff --git a/arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile b/arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile.omk
> new file mode 100644
> index 0000000..1f0edb3
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/libcfg/Makefile.omk
> @@ -0,0 +1,8 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = libcfg
> +
> +libcfg_SOURCES = lpc17xx_libcfg_default.c
> +include_HEADERS = lpc17xx_libcfg_default.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/libcfg/lpc17xx_libcfg_default.c b/arch/arm/mach-lpc17cmsis/libs/libcfg/lpc17xx_libcfg_default.c
> new file mode 100644
> index 0000000..14914e8
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/libcfg/lpc17xx_libcfg_default.c
> @@ -0,0 +1,64 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_libcfg_default.c.
> + * @brief : Library configuration source file (default),.
> + * used to build library without examples..
> + * @version : 1.0.
> + * @date : 26. Mar. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Library group ----------------------------------------------------------- */.
> +/** @addtogroup LIBCFG_DEFAULT.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_libcfg_default.h".
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup LIBCFG_DEFAULT_Public_Functions.
> + * @{.
> + */.
> +.
> +#ifndef __BUILD_WITH_EXAMPLE__.
> +.
> +#ifdef DEBUG.
> +/*******************************************************************************.
> +* @brief Reports the name of the source file and the source line number.
> +* where the CHECK_PARAM error has occurred..
> +* @param[in] file Pointer to the source file name.
> +* @param[in] line assert_param error line source number.
> +* @return None.
> +*******************************************************************************/.
> +void check_failed(uint8_t *file, uint32_t line).
> +{.
> + /* User can add his own implementation to report the file name and line number,.
> + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */.
> +.
> + /* Infinite loop */.
> + while(1);.
> +}.
> +#endif /* DEBUG */.
> +.
> +#endif /* __BUILD_WITH_EXAMPLE__ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/libcfg/lpc17xx_libcfg_default.h b/arch/arm/mach-lpc17cmsis/libs/libcfg/lpc17xx_libcfg_default.h
> new file mode 100644
> index 0000000..3430e0a
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/libcfg/lpc17xx_libcfg_default.h
> @@ -0,0 +1,163 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_libcfg_default.h.
> + * @brief : Default Library configuration header file.
> + * @version : 1.0.
> + * @date : 26. Mar. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Library Configuration group ----------------------------------------------------------- */.
> +/** @defgroup LIBCFG_DEFAULT.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC17XX_LIBCFG_DEFAULT_H_.
> +#define LPC17XX_LIBCFG_DEFAULT_H_.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc_types.h".
> +.
> +.
> +/* Public Macros -------------------------------------------------------------- */.
> +/** @defgroup LIBCFG_DEFAULT_Public_Macros.
> + * @{.
> + */.
> +.
> +/************************** DEBUG MODE DEFINITIONS *********************************/.
> +/* Un-comment the line below to compile the library in DEBUG mode, this will expanse.
> + the "CHECK_PARAM" macro in the FW library code */.
> +.
> +#define DEBUG 1.
> +.
> +.
> +/******************* PERIPHERAL FW LIBRARY CONFIGURATION DEFINITIONS ***********************/.
> +.
> +/* Comment the line below to disable the specific peripheral inclusion */.
> +.
> +/* GPIO ------------------------------- */.
> +#define _GPIO 1.
> +.
> +/* UART ------------------------------- */.
> +#define _UART 1.
> +#define _UART0 1.
> +#define _UART1 1.
> +#define _UART2 1.
> +#define _UART3 1.
> +.
> +/* SPI ------------------------------- */.
> +#define _SPI 1.
> +.
> +/* SSP ------------------------------- */.
> +#define _SSP 1.
> +#define _SSP0 1.
> +#define _SSP1 1.
> +.
> +.
> +/* I2C ------------------------------- */.
> +#define _I2C 1.
> +#define _I2C0 1.
> +#define _I2C1 1.
> +#define _I2C2 1.
> +.
> +/* TIMER ------------------------------- */.
> +#define _TIM 1.
> +.
> +/* WDT ------------------------------- */.
> +#define _WDT 1.
> +.
> +.
> +/* GPDMA ------------------------------- */.
> +#define _GPDMA 1.
> +.
> +.
> +/* DAC ------------------------------- */.
> +#define _DAC 1.
> +.
> +/* DAC ------------------------------- */.
> +#define _ADC 1.
> +.
> +.
> +/* PWM ------------------------------- */.
> +#define _PWM 1.
> +#define _PWM1 1.
> +.
> +/* RTC ------------------------------- */.
> +#define _RTC 1.
> +.
> +/* I2S ------------------------------- */.
> +#define _I2S 1.
> +.
> +/* USB device ------------------------------- */.
> +#define _USBDEV 1.
> +#define _USB_DMA 1.
> +.
> +/* QEI ------------------------------- */.
> +#define _QEI 1.
> +.
> +/* MCPWM ------------------------------- */.
> +#define _MCPWM 1.
> +.
> +/* CAN--------------------------------*/.
> +#define _CAN 1.
> +.
> +/* RIT ------------------------------- */.
> +#define _RIT 1.
> +.
> +/* EMAC ------------------------------ */.
> +#define _EMAC 1.
> +.
> +.
> +/************************** GLOBAL/PUBLIC MACRO DEFINITIONS *********************************/.
> +.
> +#ifdef DEBUG.
> +/*******************************************************************************.
> +* @brief The CHECK_PARAM macro is used for function's parameters check..
> +* It is used only if the library is compiled in DEBUG mode..
> +* @param[in] expr - If expr is false, it calls check_failed() function.
> +* which reports the name of the source file and the source.
> +* line number of the call that failed..
> +* - If expr is true, it returns no value..
> +* @return None.
> +*******************************************************************************/.
> +#define CHECK_PARAM(expr) ((expr) ? (void)0 : check_failed((uint8_t *)__FILE__, __LINE__)).
> +#else.
> +#define CHECK_PARAM(expr).
> +#endif /* DEBUG */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup LIBCFG_DEFAULT_Public_Functions.
> + * @{.
> + */.
> +.
> +#ifdef DEBUG.
> +void check_failed(uint8_t *file, uint32_t line);.
> +#endif.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +#endif /* LPC17XX_LIBCFG_DEFAULT_H_ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/nvic/Makefile b/arch/arm/mach-lpc17cmsis/libs/nvic/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/nvic/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/nvic/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/nvic/Makefile.omk
> new file mode 100644
> index 0000000..325d9ad
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/nvic/Makefile.omk
> @@ -0,0 +1,8 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = nvic
> +
> +nvic_SOURCES = lpc17xx_nvic.c
> +include_HEADERS = lpc17xx_nvic.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.c b/arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.c
> new file mode 100644
> index 0000000..98a6878
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.c
> @@ -0,0 +1,135 @@
> +/**.
> + * @file : lpc17xx_nvic.c.
> + * @brief : Contains all expansion functions support for.
> + * NVIC firmware library on LPC17xx. The main.
> + * NVIC functions are defined in core_cm3.h.
> + * @version : 1.0.
> + * @date : 18. Mar. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **********************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @addtogroup NVIC.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_nvic.h".
> +.
> +.
> +/* Private Macros ------------------------------------------------------------- */.
> +/** @addtogroup NVIC_Private_Macros.
> + * @{.
> + */.
> +.
> +/* Vector table offset bit mask */.
> +#define NVIC_VTOR_MASK 0x3FFFFF80.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup NVIC_Public_Functions.
> + * @{.
> + */.
> +.
> +.
> +/*****************************************************************************//**.
> + * @brief De-initializes the NVIC peripheral registers to their default.
> + * reset values..
> + * @param None.
> + * @return None.
> + *.
> + * These following NVIC peripheral registers will be de-initialized:.
> + * - Disable Interrupt (32 IRQ interrupt sources that matched with LPC17xx).
> + * - Clear all Pending Interrupts (32 IRQ interrupt source that matched with LPC17xx).
> + * - Clear all Interrupt Priorities (32 IRQ interrupt source that matched with LPC17xx).
> + *******************************************************************************/.
> +void NVIC_DeInit(void).
> +{.
> + uint8_t tmp;.
> +.
> + /* Disable all interrupts */.
> + NVIC->ICER[0] = 0xFFFFFFFF;.
> + NVIC->ICER[1] = 0x00000001;.
> + /* Clear all pending interrupts */.
> + NVIC->ICPR[0] = 0xFFFFFFFF;.
> + NVIC->ICPR[1] = 0x00000001;.
> +.
> + /* Clear all interrupt priority */.
> + for (tmp = 0; tmp < 32; tmp++) {.
> + NVIC->IP[tmp] = 0x00;.
> + }.
> +}.
> +.
> +/*****************************************************************************//**.
> + * @brief De-initializes the SCB peripheral registers to their default.
> + * reset values..
> + * @param none.
> + * @return none.
> + *.
> + * These following SCB NVIC peripheral registers will be de-initialized:.
> + * - Interrupt Control State register.
> + * - Interrupt Vector Table Offset register.
> + * - Application Interrupt/Reset Control register.
> + * - System Control register.
> + * - Configuration Control register.
> + * - System Handlers Priority Registers.
> + * - System Handler Control and State Register.
> + * - Configurable Fault Status Register.
> + * - Hard Fault Status Register.
> + * - Debug Fault Status Register.
> + *******************************************************************************/.
> +void NVIC_SCBDeInit(void).
> +{.
> + uint8_t tmp;.
> +.
> + SCB->ICSR = 0x0A000000;.
> + SCB->VTOR = 0x00000000;.
> + SCB->AIRCR = 0x05FA0000;.
> + SCB->SCR = 0x00000000;.
> + SCB->CCR = 0x00000000;.
> +.
> + for (tmp = 0; tmp < 32; tmp++) {.
> + SCB->SHP[tmp] = 0x00;.
> + }.
> +.
> + SCB->SHCSR = 0x00000000;.
> + SCB->CFSR = 0xFFFFFFFF;.
> + SCB->HFSR = 0xFFFFFFFF;.
> + SCB->DFSR = 0xFFFFFFFF;.
> +}.
> +.
> +.
> +/*****************************************************************************//**.
> + * @brief Set Vector Table Offset value.
> + * @param offset Offset value.
> + * @return None.
> + *******************************************************************************/.
> +void NVIC_SetVTOR(uint32_t offset).
> +{.
> + SCB->VTOR = (offset & NVIC_VTOR_MASK);.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.h b/arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.h
> new file mode 100644
> index 0000000..072a654
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/nvic/lpc17xx_nvic.h
> @@ -0,0 +1,64 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_nvic.h.
> + * @brief : Contains all macro definitions and function prototypes.
> + * support for Nesting Vectored Interrupt firmware library.
> + * on LPC17xx.
> + * @version : 1.0.
> + * @date : 18. Mar. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @defgroup NVIC.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC17XX_NVIC_H_.
> +#define LPC17XX_NVIC_H_.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "LPC17xx.h".
> +#include "lpc_types.h".
> +.
> +#ifdef __cplusplus.
> +extern "C".
> +{.
> +#endif.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup NVIC_Public_Functions.
> + * @{.
> + */.
> +.
> +void NVIC_DeInit(void);.
> +void NVIC_SCBDeInit(void);.
> +void NVIC_SetVTOR(uint32_t offset);.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +#ifdef __cplusplus.
> +}.
> +#endif.
> +.
> +#endif /* LPC17XX_NVIC_H_ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile b/arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile.omk
> new file mode 100644
> index 0000000..0d95e11
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/pinsel/Makefile.omk
> @@ -0,0 +1,8 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = pinsel
> +
> +pinsel_SOURCES = lpc17xx_pinsel.c
> +include_HEADERS = lpc17xx_pinsel.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.c b/arch/arm/mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.c
> new file mode 100644
> index 0000000..c459217
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.c
> @@ -0,0 +1,308 @@
> +/**.
> + * @file : lpc17xx_pinsel.c.
> + * @brief : Contains all functions support for Pin connect block firmware.
> + * library on LPC17xx.
> + * @version : 1.0.
> + * @date : 25. Feb. 2009.
> + * @author : HoanTran.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **********************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @addtogroup PINSEL.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_pinsel.h".
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup PINSEL_Public_Functions.
> + * @{.
> + */.
> +.
> +/*********************************************************************//**.
> + * @brief Setup the pin selection function.
> + * @param[in] portnum PORT number,.
> + * should be one of the following:.
> + * - PINSEL_PORT_0 : Port 0.
> + * - PINSEL_PORT_1 : Port 1.
> + * - PINSEL_PORT_2 : Port 2.
> + * - PINSEL_PORT_3 : Port 3.
> + *.
> + * @param[in] pinnum Pin number,.
> + * should be one of the following:.
> + - PINSEL_PIN_0 : Pin 0.
> + - PINSEL_PIN_1 : Pin 1.
> + - PINSEL_PIN_2 : Pin 2.
> + - PINSEL_PIN_3 : Pin 3.
> + - PINSEL_PIN_4 : Pin 4.
> + - PINSEL_PIN_5 : Pin 5.
> + - PINSEL_PIN_6 : Pin 6.
> + - PINSEL_PIN_7 : Pin 7.
> + - PINSEL_PIN_8 : Pin 8.
> + - PINSEL_PIN_9 : Pin 9.
> + - PINSEL_PIN_10 : Pin 10.
> + - PINSEL_PIN_11 : Pin 11.
> + - PINSEL_PIN_12 : Pin 12.
> + - PINSEL_PIN_13 : Pin 13.
> + - PINSEL_PIN_14 : Pin 14.
> + - PINSEL_PIN_15 : Pin 15.
> + - PINSEL_PIN_16 : Pin 16.
> + - PINSEL_PIN_17 : Pin 17.
> + - PINSEL_PIN_18 : Pin 18.
> + - PINSEL_PIN_19 : Pin 19.
> + - PINSEL_PIN_20 : Pin 20.
> + - PINSEL_PIN_21 : Pin 21.
> + - PINSEL_PIN_22 : Pin 22.
> + - PINSEL_PIN_23 : Pin 23.
> + - PINSEL_PIN_24 : Pin 24.
> + - PINSEL_PIN_25 : Pin 25.
> + - PINSEL_PIN_26 : Pin 26.
> + - PINSEL_PIN_27 : Pin 27.
> + - PINSEL_PIN_28 : Pin 28.
> + - PINSEL_PIN_29 : Pin 29.
> + - PINSEL_PIN_30 : Pin 30.
> + - PINSEL_PIN_31 : Pin 31.
> +.
> + * @param[in] funcnum Function number,.
> + * should be one of the following:.
> + * - PINSEL_FUNC_0 : default function.
> + * - PINSEL_FUNC_1 : first alternate function.
> + * - PINSEL_FUNC_2 : second alternate function.
> + * - PINSEL_FUNC_3 : third alternate function.
> + *.
> + * @return None.
> + **********************************************************************/.
> +void PINSEL_SetPinFunc ( uint8_t portnum, uint8_t pinnum, uint8_t funcnum).
> +{.
> + uint32_t pinnum_t = pinnum;.
> + uint32_t pinselreg_idx = 2 * portnum;.
> + uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINSEL0;.
> +.
> + if (pinnum_t >= 16) {.
> + pinnum_t -= 16;.
> + pinselreg_idx++;.
> + }.
> + *(uint32_t *)(pPinCon + pinselreg_idx) &= ~(0x03UL << (pinnum_t * 2));.
> + *(uint32_t *)(pPinCon + pinselreg_idx) |= ((uint32_t)funcnum) << (pinnum_t * 2);.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Configure trace function.
> + * @param[in] NewState State of the Trace function configuration,.
> + * should be one of the following:.
> + * - ENABLE : Enable Trace Function.
> + * - DISABLE : Disable Trace Function.
> + *.
> + * @return None.
> + **********************************************************************/.
> +void PINSEL_ConfigTraceFunc(FunctionalState NewState).
> +{.
> + if (NewState == ENABLE) {.
> + LPC_PINCON->PINSEL10 |= (0x01UL << 3);.
> + } else if (NewState == DISABLE) {.
> + LPC_PINCON->PINSEL10 &= ~(0x01UL << 3);.
> + }.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Setup resistor mode for each pin.
> + * @param[in] portnum PORT number,.
> + * should be one of the following:.
> + * - PINSEL_PORT_0 : Port 0.
> + * - PINSEL_PORT_1 : Port 1.
> + * - PINSEL_PORT_2 : Port 2.
> + * - PINSEL_PORT_3 : Port 3.
> + * @param[in] pinnum Pin number,.
> + * should be one of the following:.
> + - PINSEL_PIN_0 : Pin 0.
> + - PINSEL_PIN_1 : Pin 1.
> + - PINSEL_PIN_2 : Pin 2.
> + - PINSEL_PIN_3 : Pin 3.
> + - PINSEL_PIN_4 : Pin 4.
> + - PINSEL_PIN_5 : Pin 5.
> + - PINSEL_PIN_6 : Pin 6.
> + - PINSEL_PIN_7 : Pin 7.
> + - PINSEL_PIN_8 : Pin 8.
> + - PINSEL_PIN_9 : Pin 9.
> + - PINSEL_PIN_10 : Pin 10.
> + - PINSEL_PIN_11 : Pin 11.
> + - PINSEL_PIN_12 : Pin 12.
> + - PINSEL_PIN_13 : Pin 13.
> + - PINSEL_PIN_14 : Pin 14.
> + - PINSEL_PIN_15 : Pin 15.
> + - PINSEL_PIN_16 : Pin 16.
> + - PINSEL_PIN_17 : Pin 17.
> + - PINSEL_PIN_18 : Pin 18.
> + - PINSEL_PIN_19 : Pin 19.
> + - PINSEL_PIN_20 : Pin 20.
> + - PINSEL_PIN_21 : Pin 21.
> + - PINSEL_PIN_22 : Pin 22.
> + - PINSEL_PIN_23 : Pin 23.
> + - PINSEL_PIN_24 : Pin 24.
> + - PINSEL_PIN_25 : Pin 25.
> + - PINSEL_PIN_26 : Pin 26.
> + - PINSEL_PIN_27 : Pin 27.
> + - PINSEL_PIN_28 : Pin 28.
> + - PINSEL_PIN_29 : Pin 29.
> + - PINSEL_PIN_30 : Pin 30.
> + - PINSEL_PIN_31 : Pin 31.
> +.
> + * @param[in] modenum: Mode number,.
> + * should be one of the following:.
> + - PINSEL_PINMODE_PULLUP : Internal pull-up resistor.
> + - PINSEL_PINMODE_TRISTATE : Tri-state.
> + - PINSEL_PINMODE_PULLDOWN : Internal pull-down resistor.
> +.
> + * @return None.
> + **********************************************************************/.
> +void PINSEL_SetResistorMode ( uint8_t portnum, uint8_t pinnum, uint8_t modenum).
> +{.
> + uint32_t pinnum_t = pinnum;.
> + uint32_t pinmodereg_idx = 2 * portnum;.
> + uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINMODE0;.
> +.
> + if (pinnum_t >= 16) {.
> + pinnum_t -= 16;.
> + pinmodereg_idx++ ;.
> + }.
> +.
> + *(uint32_t *)(pPinCon + pinmodereg_idx) &= ~(0x03UL << (pinnum_t * 2));.
> + *(uint32_t *)(pPinCon + pinmodereg_idx) |= ((uint32_t)modenum) << (pinnum_t * 2);.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Setup Open drain mode for each pin.
> + * @param[in] portnum PORT number,.
> + * should be one of the following:.
> + * - PINSEL_PORT_0 : Port 0.
> + * - PINSEL_PORT_1 : Port 1.
> + * - PINSEL_PORT_2 : Port 2.
> + * - PINSEL_PORT_3 : Port 3.
> + *.
> + * @param[in] pinnum Pin number,.
> + * should be one of the following:.
> + - PINSEL_PIN_0 : Pin 0.
> + - PINSEL_PIN_1 : Pin 1.
> + - PINSEL_PIN_2 : Pin 2.
> + - PINSEL_PIN_3 : Pin 3.
> + - PINSEL_PIN_4 : Pin 4.
> + - PINSEL_PIN_5 : Pin 5.
> + - PINSEL_PIN_6 : Pin 6.
> + - PINSEL_PIN_7 : Pin 7.
> + - PINSEL_PIN_8 : Pin 8.
> + - PINSEL_PIN_9 : Pin 9.
> + - PINSEL_PIN_10 : Pin 10.
> + - PINSEL_PIN_11 : Pin 11.
> + - PINSEL_PIN_12 : Pin 12.
> + - PINSEL_PIN_13 : Pin 13.
> + - PINSEL_PIN_14 : Pin 14.
> + - PINSEL_PIN_15 : Pin 15.
> + - PINSEL_PIN_16 : Pin 16.
> + - PINSEL_PIN_17 : Pin 17.
> + - PINSEL_PIN_18 : Pin 18.
> + - PINSEL_PIN_19 : Pin 19.
> + - PINSEL_PIN_20 : Pin 20.
> + - PINSEL_PIN_21 : Pin 21.
> + - PINSEL_PIN_22 : Pin 22.
> + - PINSEL_PIN_23 : Pin 23.
> + - PINSEL_PIN_24 : Pin 24.
> + - PINSEL_PIN_25 : Pin 25.
> + - PINSEL_PIN_26 : Pin 26.
> + - PINSEL_PIN_27 : Pin 27.
> + - PINSEL_PIN_28 : Pin 28.
> + - PINSEL_PIN_29 : Pin 29.
> + - PINSEL_PIN_30 : Pin 30.
> + - PINSEL_PIN_31 : Pin 31.
> +.
> + * @param[in] modenum Open drain mode number,.
> + * should be one of the following:.
> + * - PINSEL_PINMODE_NORMAL : Pin is in the normal (not open drain) mode.
> + * - PINSEL_PINMODE_OPENDRAIN : Pin is in the open drain mode.
> + *.
> + * @return None.
> + **********************************************************************/.
> +void PINSEL_SetOpenDrainMode( uint8_t portnum, uint8_t pinnum, uint8_t modenum).
> +{.
> + uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINMODE_OD0;.
> +.
> + if (modenum == PINSEL_PINMODE_OPENDRAIN){.
> + *(uint32_t *)(pPinCon + portnum) |= (0x01UL << pinnum);.
> + } else {.
> + *(uint32_t *)(pPinCon + portnum) &= ~(0x01UL << pinnum);.
> + }.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Setup I2C0 pins.
> + * @param[in] i2cPinMode I2C pin mode,.
> + * should be one of the following:.
> + * - PINSEL_I2C_Normal_Mode : The standard drive mode.
> + * - PINSEL_I2C_Fast_Mode : Fast Mode Plus drive mode.
> + *.
> + * @param[in] filterSlewRateEnable should be:.
> + * - ENABLE: Enable filter and slew rate..
> + * - DISABLE: Disable filter and slew rate..
> + *.
> + * @return None.
> + **********************************************************************/.
> +void PINSEL_SetI2C0Pins(uint8_t i2cPinMode, FunctionalState filterSlewRateEnable).
> +{.
> + uint32_t regVal;.
> +.
> + if (i2cPinMode == PINSEL_I2C_Fast_Mode){.
> + regVal = PINSEL_I2CPADCFG_SCLDRV0 | PINSEL_I2CPADCFG_SDADRV0;.
> + }.
> +.
> + if (filterSlewRateEnable == DISABLE){.
> + regVal = PINSEL_I2CPADCFG_SCLI2C0 | PINSEL_I2CPADCFG_SDAI2C0;.
> + }.
> + LPC_PINCON->I2CPADCFG = regVal;.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Configure Pin corresponding to specified parameters passed.
> + * in the PinCfg.
> + * @param[in] PinCfg Pointer to a PINSEL_CFG_Type structure.
> + * that contains the configuration information for the.
> + * specified pin..
> + * @return None.
> + **********************************************************************/.
> +void PINSEL_ConfigPin(PINSEL_CFG_Type *PinCfg).
> +{.
> + PINSEL_SetPinFunc(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->Funcnum);.
> + PINSEL_SetResistorMode(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->Pinmode);.
> + PINSEL_SetOpenDrainMode(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->OpenDrain);.
> +}.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.h b/arch/arm/mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.h
> new file mode 100644
> index 0000000..ac1ba8a
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/pinsel/lpc17xx_pinsel.h
> @@ -0,0 +1,210 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_pinsel.h.
> + * @brief : Contains all macro definitions and function prototypes.
> + * support for Pin connect block firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 25. Feb. 2009.
> + * @author : HoanTran.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @defgroup PINSEL.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC17XX_PINSEL_H_.
> +#define LPC17XX_PINSEL_H_.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx.h".
> +#include "lpc_types.h".
> +.
> +#ifdef __cplusplus.
> +extern "C".
> +{.
> +#endif.
> +.
> +.
> +/* Private Macros ------------------------------------------------------------- */.
> +/** @defgroup PINSEL_Private_Macros.
> + * @{.
> + */.
> +.
> +/** @defgroup PINSEL_REGISTER_BIT_DEFINITIONS.
> + * @{.
> + */.
> +.
> +/* Pin selection define */.
> +/* I2C Pin Configuration register bit description */.
> +#define PINSEL_I2CPADCFG_SDADRV0 _BIT(0) /**< Drive mode control for the SDA0 pin, P0.27 */.
> +#define PINSEL_I2CPADCFG_SDAI2C0 _BIT(1) /**< I2C mode control for the SDA0 pin, P0.27 */.
> +#define PINSEL_I2CPADCFG_SCLDRV0 _BIT(2) /**< Drive mode control for the SCL0 pin, P0.28 */.
> +#define PINSEL_I2CPADCFG_SCLI2C0 _BIT(3) /**< I2C mode control for the SCL0 pin, P0.28 */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Macros -------------------------------------------------------------- */.
> +/** @defgroup PINSEL_Public_Macros.
> + * @{.
> + */.
> +.
> +/*********************************************************************//**.
> + *!< Macros define for PORT Selection.
> + ***********************************************************************/.
> +#define PINSEL_PORT_0 ((0)) /**< PORT 0*/.
> +#define PINSEL_PORT_1 ((1)) /**< PORT 1*/.
> +#define PINSEL_PORT_2 ((2)) /**< PORT 2*/.
> +#define PINSEL_PORT_3 ((3)) /**< PORT 3*/.
> +#define PINSEL_PORT_4 ((4)) /**< PORT 4*/.
> +.
> +.
> +/***********************************************************************.
> + * Macros define for Pin Function selection.
> + **********************************************************************/.
> +#define PINSEL_FUNC_0 ((0)) /**< default function*/.
> +#define PINSEL_FUNC_1 ((1)) /**< first alternate function*/.
> +#define PINSEL_FUNC_2 ((2)) /**< second alternate function*/.
> +#define PINSEL_FUNC_3 ((3)) /**< third or reserved alternate function*/.
> +.
> +.
> +.
> +/***********************************************************************.
> + * Macros define for Pin Number of Port.
> + **********************************************************************/.
> +#define PINSEL_PIN_0 ((0)) /**< Pin 0 */.
> +#define PINSEL_PIN_1 ((1)) /**< Pin 1 */.
> +#define PINSEL_PIN_2 ((2)) /**< Pin 2 */.
> +#define PINSEL_PIN_3 ((3)) /**< Pin 3 */.
> +#define PINSEL_PIN_4 ((4)) /**< Pin 4 */.
> +#define PINSEL_PIN_5 ((5)) /**< Pin 5 */.
> +#define PINSEL_PIN_6 ((6)) /**< Pin 6 */.
> +#define PINSEL_PIN_7 ((7)) /**< Pin 7 */.
> +#define PINSEL_PIN_8 ((8)) /**< Pin 8 */.
> +#define PINSEL_PIN_9 ((9)) /**< Pin 9 */.
> +#define PINSEL_PIN_10 ((10)) /**< Pin 10 */.
> +#define PINSEL_PIN_11 ((11)) /**< Pin 11 */.
> +#define PINSEL_PIN_12 ((12)) /**< Pin 12 */.
> +#define PINSEL_PIN_13 ((13)) /**< Pin 13 */.
> +#define PINSEL_PIN_14 ((14)) /**< Pin 14 */.
> +#define PINSEL_PIN_15 ((15)) /**< Pin 15 */.
> +#define PINSEL_PIN_16 ((16)) /**< Pin 16 */.
> +#define PINSEL_PIN_17 ((17)) /**< Pin 17 */.
> +#define PINSEL_PIN_18 ((18)) /**< Pin 18 */.
> +#define PINSEL_PIN_19 ((19)) /**< Pin 19 */.
> +#define PINSEL_PIN_20 ((20)) /**< Pin 20 */.
> +#define PINSEL_PIN_21 ((21)) /**< Pin 21 */.
> +#define PINSEL_PIN_22 ((22)) /**< Pin 22 */.
> +#define PINSEL_PIN_23 ((23)) /**< Pin 23 */.
> +#define PINSEL_PIN_24 ((24)) /**< Pin 24 */.
> +#define PINSEL_PIN_25 ((25)) /**< Pin 25 */.
> +#define PINSEL_PIN_26 ((26)) /**< Pin 26 */.
> +#define PINSEL_PIN_27 ((27)) /**< Pin 27 */.
> +#define PINSEL_PIN_28 ((28)) /**< Pin 28 */.
> +#define PINSEL_PIN_29 ((29)) /**< Pin 29 */.
> +#define PINSEL_PIN_30 ((30)) /**< Pin 30 */.
> +#define PINSEL_PIN_31 ((31)) /**< Pin 31 */.
> +.
> +.
> +/***********************************************************************.
> + * Macros define for Pin mode.
> + **********************************************************************/.
> +#define PINSEL_PINMODE_PULLUP ((0)) /**< Internal pull-up resistor*/.
> +#define PINSEL_PINMODE_TRISTATE ((2)) /**< Tri-state */.
> +#define PINSEL_PINMODE_PULLDOWN ((3)) /**< Internal pull-down resistor */.
> +.
> +.
> +/***********************************************************************.
> + * Macros define for Pin mode (normal/open drain).
> + **********************************************************************/.
> +#define PINSEL_PINMODE_NORMAL ((0)) /**< Pin is in the normal (not open drain) mode.*/.
> +#define PINSEL_PINMODE_OPENDRAIN ((1)) /**< Pin is in the open drain mode */.
> +.
> +.
> +/***********************************************************************.
> + * Macros define for I2C mode.
> + ***********************************************************************/.
> +#define PINSEL_I2C_Normal_Mode ((0)) /**< The standard drive mode */.
> +#define PINSEL_I2C_Fast_Mode ((1)) /**< Fast Mode Plus drive mode */.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Types --------------------------------------------------------------- */.
> +/** @defgroup PINSEL_Public_Types.
> + * @{.
> + */.
> +.
> +/** @brief Pin configuration structure */.
> +typedef struct.
> +{.
> + uint8_t Portnum; /**< Port Number, should be PINSEL_PORT_x,.
> + where x should be in range from 0 to 4 */.
> + uint8_t Pinnum; /**< Pin Number, should be PINSEL_PIN_x,.
> + where x should be in range from 0 to 31 */.
> + uint8_t Funcnum; /**< Function Number, should be PINSEL_FUNC_x,.
> + where x should be in range from 0 to 3 */.
> + uint8_t Pinmode; /**< Pin Mode, should be:.
> + - PINSEL_PINMODE_PULLUP: Internal pull-up resistor.
> + - PINSEL_PINMODE_TRISTATE: Tri-state.
> + - PINSEL_PINMODE_PULLDOWN: Internal pull-down resistor */.
> + uint8_t OpenDrain; /**< OpenDrain mode, should be:.
> + - PINSEL_PINMODE_NORMAL: Pin is in the normal (not open drain) mode.
> + - PINSEL_PINMODE_OPENDRAIN: Pin is in the open drain mode */.
> +} PINSEL_CFG_Type;.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup PINSEL_Public_Functions.
> + * @{.
> + */.
> +.
> +void PINSEL_SetPinFunc ( uint8_t portnum, uint8_t pinnum, uint8_t funcnum);.
> +void PINSEL_ConfigTraceFunc (FunctionalState NewState);.
> +void PINSEL_SetResistorMode ( uint8_t portnum, uint8_t pinnum, uint8_t modenum);.
> +void PINSEL_SetOpenDrainMode( uint8_t portnum, uint8_t pinnum, uint8_t modenum);.
> +void PINSEL_SetI2C0Pins(uint8_t i2cPinMode, FunctionalState filterSlewRateEnable);.
> +void PINSEL_ConfigPin(PINSEL_CFG_Type *PinCfg);.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +#ifdef __cplusplus.
> +}.
> +#endif.
> +.
> +#endif /* LPC17XX_PINSEL_H_ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> +.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/ssp/Makefile b/arch/arm/mach-lpc17cmsis/libs/ssp/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/ssp/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/ssp/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/ssp/Makefile.omk
> new file mode 100644
> index 0000000..82f21a8
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/ssp/Makefile.omk
> @@ -0,0 +1,8 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = ssp
> +
> +ssp_SOURCES = lpc17xx_ssp.c
> +include_HEADERS = lpc17xx_ssp.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.c b/arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.c
> new file mode 100644
> index 0000000..967a2e2
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.c
> @@ -0,0 +1,831 @@
> +/**.
> + * @file : lpc17xx_ssp.c.
> + * @brief : Contains all functions support for SSP firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 9. April. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **********************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @addtogroup SSP.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_ssp.h".
> +#include "lpc17xx_clkpwr.h".
> +.
> +.
> +/* If this source file built with example, the LPC17xx FW library configuration.
> + * file in each example directory ("lpc17xx_libcfg.h") must be included,.
> + * otherwise the default FW library configuration file must be included instead.
> + */.
> +#ifdef __BUILD_WITH_EXAMPLE__.
> +#include "lpc17xx_libcfg.h".
> +#else.
> +#include "lpc17xx_libcfg_default.h".
> +#endif /* __BUILD_WITH_EXAMPLE__ */.
> +.
> +.
> +#ifdef _SSP.
> +.
> +/* Private Types -------------------------------------------------------------- */.
> +/** @defgroup SSP_Private_Types.
> + * @{.
> + */.
> +.
> +/** @brief SSP device configuration structure type */.
> +typedef struct.
> +{.
> + int32_t dataword; /* Current data word: 0 - 8 bit; 1 - 16 bit */.
> + uint32_t txrx_setup; /* Transmission setup */.
> + void (*inthandler)(LPC_SSP_TypeDef *SSPx); /* Transmission interrupt handler */.
> +} SSP_CFG_T;.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* Private Variables ---------------------------------------------------------- */.
> +/* SSP configuration data */.
> +static SSP_CFG_T sspdat[2];.
> +.
> +.
> +/* Private Functions ---------------------------------------------------------- */.
> +/** @defgroup SSP_Private_Functions.
> + * @{.
> + */.
> +.
> +/**.
> + * @brief Convert from SSP peripheral to number.
> + */.
> +static int32_t SSP_getNum(LPC_SSP_TypeDef *SSPx){.
> + if (SSPx == LPC_SSP0) {.
> + return (0);.
> + } else if (SSPx == LPC_SSP1) {.
> + return (1);.
> + }.
> + return (-1);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Standard Private SSP Interrupt handler.
> + * @param SSPx: SSP peripheral definition, should be.
> + * SSP0 or SSP1..
> + * @return None.
> + ***********************************************************************/.
> +void SSP_IntHandler(LPC_SSP_TypeDef *SSPx).
> +{.
> + SSP_DATA_SETUP_Type *xf_setup;.
> + uint16_t tmp;.
> + int32_t sspnum;.
> +.
> + // Disable interrupt.
> + SSPx->IMSC = 0;.
> +.
> + sspnum = SSP_getNum(SSPx);.
> + xf_setup = (SSP_DATA_SETUP_Type *)sspdat[sspnum].txrx_setup;.
> +.
> + // save status.
> + tmp = SSPx->RIS;.
> + xf_setup->status = tmp;.
> +.
> + // Check overrun error.
> + if (tmp & SSP_RIS_ROR){.
> + // Clear interrupt.
> + SSPx->ICR = SSP_RIS_ROR;.
> + // update status.
> + xf_setup->status |= SSP_STAT_ERROR;.
> + // Callback.
> + if (xf_setup->callback != NULL){.
> + xf_setup->callback();.
> + }.
> + return;.
> + }.
> +.
> + if ((xf_setup->tx_cnt != xf_setup->length) || (xf_setup->rx_cnt != xf_setup->length)){.
> + /* check if RX FIFO contains data */.
> + while ((SSPx->SR & SSP_SR_RNE) && (xf_setup->rx_cnt != xf_setup->length)){.
> + // Read data from SSP data.
> + tmp = SSP_ReceiveData(SSPx);.
> +.
> + // Store data to destination.
> + if (xf_setup->rx_data != NULL).
> + {.
> + if (sspdat[sspnum].dataword == 0){.
> + *(uint8_t *)((uint32_t)xf_setup->rx_data + xf_setup->rx_cnt) = (uint8_t) tmp;.
> + } else {.
> + *(uint16_t *)((uint32_t)xf_setup->rx_data + xf_setup->rx_cnt) = (uint16_t) tmp;.
> + }.
> + }.
> + // Increase counter.
> + if (sspdat[sspnum].dataword == 0){.
> + xf_setup->rx_cnt++;.
> + } else {.
> + xf_setup->rx_cnt += 2;.
> + }.
> + }.
> +.
> + while ((SSPx->SR & SSP_SR_TNF) && (xf_setup->tx_cnt != xf_setup->length)){.
> + // Write data to buffer.
> + if(xf_setup->tx_data == NULL){.
> + if (sspdat[sspnum].dataword == 0){.
> + SSP_SendData(SSPx, 0xFF);.
> + xf_setup->tx_cnt++;.
> + } else {.
> + SSP_SendData(SSPx, 0xFFFF);.
> + xf_setup->tx_cnt += 2;.
> + }.
> + } else {.
> + if (sspdat[sspnum].dataword == 0){.
> + SSP_SendData(SSPx, (*(uint8_t *)((uint32_t)xf_setup->tx_data + xf_setup->tx_cnt)));.
> + xf_setup->tx_cnt++;.
> + } else {.
> + SSP_SendData(SSPx, (*(uint16_t *)((uint32_t)xf_setup->tx_data + xf_setup->tx_cnt)));.
> + xf_setup->tx_cnt += 2;.
> + }.
> + }.
> +.
> + // Check overrun error.
> + if ((tmp = SSPx->RIS) & SSP_RIS_ROR){.
> + // update status.
> + xf_setup->status |= SSP_STAT_ERROR;.
> + // Callback.
> + if (xf_setup->callback != NULL){.
> + xf_setup->callback();.
> + }.
> + return;.
> + }.
> +.
> + // Check for any data available in RX FIFO.
> + while ((SSPx->SR & SSP_SR_RNE) && (xf_setup->rx_cnt != xf_setup->length)){.
> + // Read data from SSP data.
> + tmp = SSP_ReceiveData(SSPx);.
> +.
> + // Store data to destination.
> + if (xf_setup->rx_data != NULL).
> + {.
> + if (sspdat[sspnum].dataword == 0){.
> + *(uint8_t *)((uint32_t)xf_setup->rx_data + xf_setup->rx_cnt) = (uint8_t) tmp;.
> + } else {.
> + *(uint16_t *)((uint32_t)xf_setup->rx_data + xf_setup->rx_cnt) = (uint16_t) tmp;.
> + }.
> + }.
> + // Increase counter.
> + if (sspdat[sspnum].dataword == 0){.
> + xf_setup->rx_cnt++;.
> + } else {.
> + xf_setup->rx_cnt += 2;.
> + }.
> + }.
> + }.
> + }.
> +.
> + // If there more data to sent or receive.
> + if ((xf_setup->rx_cnt != xf_setup->length) || (xf_setup->tx_cnt != xf_setup->length)){.
> + // Enable all interrupt.
> + SSPx->IMSC = SSP_IMSC_BITMASK;.
> + } else {.
> + // Save status.
> + xf_setup->status = SSP_STAT_DONE;.
> + // Callback.
> + if (xf_setup->callback != NULL){.
> + xf_setup->callback();.
> + }.
> + }.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup SSP_Public_Functions.
> + * @{.
> + */.
> +.
> +/*********************************************************************//**.
> + * @brief Setup clock rate for SSP device.
> + * @param[in] SSPx SSP peripheral definition, should be.
> + * SSP0 or SSP1..
> + * @param[in] target_clock : clock of SSP (Hz).
> + * @return None.
> + ***********************************************************************/.
> +void SSP_SetClock (LPC_SSP_TypeDef *SSPx, uint32_t target_clock).
> +{.
> + uint32_t prescale, cr0_div, cmp_clk, ssp_clk;.
> +.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> +.
> + /* The SSP clock is derived from the (main system oscillator / 2),.
> + so compute the best divider from that clock */.
> + if (SSPx == LPC_SSP0){.
> + ssp_clk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SSP0);.
> + } else if (SSPx == LPC_SSP1) {.
> + ssp_clk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SSP1);.
> + } else {.
> + return;.
> + }.
> +.
> + /* Find closest divider to get at or under the target frequency..
> + Use smallest prescale possible and rely on the divider to get.
> + the closest target frequency */.
> + cr0_div = 0;.
> + cmp_clk = 0xFFFFFFFF;.
> + prescale = 2;.
> + while (cmp_clk > target_clock).
> + {.
> + cmp_clk = ssp_clk / ((cr0_div + 1) * prescale);.
> + if (cmp_clk > target_clock).
> + {.
> + cr0_div++;.
> + if (cr0_div > 0xFF).
> + {.
> + cr0_div = 0;.
> + prescale += 2;.
> + }.
> + }.
> + }.
> +.
> + /* Write computed prescaler and divider back to register */.
> + SSPx->CR0 &= (~SSP_CR0_SCR(0xFF)) & SSP_CR0_BITMASK;.
> + SSPx->CR0 |= (SSP_CR0_SCR(cr0_div)) & SSP_CR0_BITMASK;.
> + SSPx->CPSR = prescale & SSP_CPSR_BITMASK;.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief De-initializes the SSPx peripheral registers to their.
> +* default reset values..
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @return None.
> + **********************************************************************/.
> +void SSP_DeInit(LPC_SSP_TypeDef* SSPx).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> +.
> + if (SSPx == LPC_SSP0){.
> + /* Set up clock and power for SSP0 module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP0, DISABLE);.
> + } else if (SSPx == LPC_SSP1) {.
> + /* Set up clock and power for SSP1 module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP1, DISABLE);.
> + }.
> +}.
> +.
> +.
> +.
> +/********************************************************************//**.
> + * @brief Initializes the SSPx peripheral according to the specified.
> +* parameters in the SSP_ConfigStruct..
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @param[in] SSP_ConfigStruct Pointer to a SSP_CFG_Type structure.
> +* that contains the configuration information for the.
> +* specified SSP peripheral..
> + * @return None.
> + *********************************************************************/.
> +void SSP_Init(LPC_SSP_TypeDef *SSPx, SSP_CFG_Type *SSP_ConfigStruct).
> +{.
> + uint32_t tmp;.
> +.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> +.
> + if(SSPx == LPC_SSP0) {.
> + /* Set up clock and power for SSP0 module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP0, ENABLE);.
> + } else if(SSPx == LPC_SSP1) {.
> + /* Set up clock and power for SSP1 module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP1, ENABLE);.
> + } else {.
> + return;.
> + }.
> +.
> + /* Configure SSP, interrupt is disable, LoopBack mode is disable,.
> + * SSP is disable, Slave output is disable as default.
> + */.
> + tmp = ((SSP_ConfigStruct->CPHA) | (SSP_ConfigStruct->CPOL) \.
> + | (SSP_ConfigStruct->FrameFormat) | (SSP_ConfigStruct->Databit)).
> + & SSP_CR0_BITMASK;.
> + // write back to SSP control register.
> + SSPx->CR0 = tmp;.
> + tmp = SSP_getNum(SSPx);.
> + if (SSP_ConfigStruct->Databit > SSP_DATABIT_8){.
> + sspdat[tmp].dataword = 1;.
> + } else {.
> + sspdat[tmp].dataword = 0;.
> + }.
> +.
> + tmp = SSP_ConfigStruct->Mode & SSP_CR1_BITMASK;.
> + // Write back to CR1.
> + SSPx->CR1 = tmp;.
> +.
> + // Set clock rate for SSP peripheral.
> + SSP_SetClock(SSPx, SSP_ConfigStruct->ClockRate);.
> +}.
> +.
> +.
> +.
> +/*****************************************************************************//**.
> +* @brief Fills each SSP_InitStruct member with its default value:.
> +* - CPHA = SSP_CPHA_FIRST.
> +* - CPOL = SSP_CPOL_HI.
> +* - ClockRate = 1000000.
> +* - Databit = SSP_DATABIT_8.
> +* - Mode = SSP_MASTER_MODE.
> +* - FrameFormat = SSP_FRAME_SSP.
> +* @param[in] SSP_InitStruct Pointer to a SSP_CFG_Type structure.
> +* which will be initialized..
> +* @return None.
> +*******************************************************************************/.
> +void SSP_ConfigStructInit(SSP_CFG_Type *SSP_InitStruct).
> +{.
> + SSP_InitStruct->CPHA = SSP_CPHA_FIRST;.
> + SSP_InitStruct->CPOL = SSP_CPOL_HI;.
> + SSP_InitStruct->ClockRate = 1000000;.
> + SSP_InitStruct->Databit = SSP_DATABIT_8;.
> + SSP_InitStruct->Mode = SSP_MASTER_MODE;.
> + SSP_InitStruct->FrameFormat = SSP_FRAME_SPI;.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Enable or disable SSP peripheral's operation.
> + * @param[in] SSPx SSP peripheral, should be SSP0 or SSP1.
> + * @param[in] NewState New State of SSPx peripheral's operation.
> + * @return none.
> + **********************************************************************/.
> +void SSP_Cmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + if (NewState == ENABLE).
> + {.
> + SSPx->CR1 |= SSP_CR1_SSP_EN;.
> + }.
> + else.
> + {.
> + SSPx->CR1 &= (~SSP_CR1_SSP_EN) & SSP_CR1_BITMASK;.
> + }.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Enable or disable Loop Back mode function in SSP peripheral.
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @param[in] NewState New State of Loop Back mode, should be:.
> + * - ENABLE: Enable this function.
> + * - DISABLE: Disable this function.
> + * @return None.
> + **********************************************************************/.
> +void SSP_LoopBackCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + if (NewState == ENABLE).
> + {.
> + SSPx->CR1 |= SSP_CR1_LBM_EN;.
> + }.
> + else.
> + {.
> + SSPx->CR1 &= (~SSP_CR1_LBM_EN) & SSP_CR1_BITMASK;.
> + }.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Enable or disable Slave Output function in SSP peripheral.
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @param[in] NewState New State of Slave Output function, should be:.
> + * - ENABLE: Slave Output in normal operation.
> + * - DISABLE: Slave Output is disabled. This blocks.
> + * SSP controller from driving the transmit data.
> + * line (MISO).
> + * Note: This function is available when SSP peripheral in Slave mode.
> + * @return None.
> + **********************************************************************/.
> +void SSP_SlaveOutputCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + if (NewState == ENABLE).
> + {.
> + SSPx->CR1 &= (~SSP_CR1_SO_DISABLE) & SSP_CR1_BITMASK;.
> + }.
> + else.
> + {.
> + SSPx->CR1 |= SSP_CR1_SO_DISABLE;.
> + }.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Transmit a single data through SSPx peripheral.
> + * @param[in] SSPx SSP peripheral selected, should be SSP.
> + * @param[in] Data Data to transmit (must be 16 or 8-bit long,.
> + * this depend on SSP data bit number configured).
> + * @return none.
> + **********************************************************************/.
> +void SSP_SendData(LPC_SSP_TypeDef* SSPx, uint16_t Data).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> +.
> + SSPx->DR = SSP_DR_BITMASK(Data);.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Receive a single data from SSPx peripheral.
> + * @param[in] SSPx SSP peripheral selected, should be SSP.
> + * @return Data received (16-bit long).
> + **********************************************************************/.
> +uint16_t SSP_ReceiveData(LPC_SSP_TypeDef* SSPx).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> +.
> + return ((uint16_t) (SSP_DR_BITMASK(SSPx->DR)));.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief SSP Read write data function.
> + * @param[in] SSPx Pointer to SSP peripheral, should be SSP0 or SSP1.
> + * @param[in] dataCfg Pointer to a SSP_DATA_SETUP_Type structure that.
> + * contains specified information about transmit.
> + * data configuration..
> + * @param[in] xfType Transfer type, should be:.
> + * - SSP_TRANSFER_POLLING: Polling mode.
> + * - SSP_TRANSFER_INTERRUPT: Interrupt mode.
> + * @return Actual Data length has been transferred in polling mode..
> + * In interrupt mode, always return (0).
> + * Return (-1) if error..
> + * Note: This function can be used in both master and slave mode..
> + ***********************************************************************/.
> +int32_t SSP_ReadWrite (LPC_SSP_TypeDef *SSPx, SSP_DATA_SETUP_Type *dataCfg, \.
> + SSP_TRANSFER_Type xfType).
> +{.
> + uint8_t *rdata8;.
> + uint8_t *wdata8;.
> + uint16_t *rdata16;.
> + uint16_t *wdata16;.
> + uint32_t stat;.
> + uint32_t tmp;.
> + int32_t sspnum;.
> + int32_t dataword;.
> +.
> + dataCfg->rx_cnt = 0;.
> + dataCfg->tx_cnt = 0;.
> + dataCfg->status = 0;.
> +.
> +.
> + /* Clear all remaining data in RX FIFO */.
> + while (SSPx->SR & SSP_SR_RNE){.
> + tmp = (uint32_t) SSP_ReceiveData(SSPx);.
> + }.
> +.
> + // Clear status.
> + SSPx->ICR = SSP_ICR_BITMASK;.
> +.
> + sspnum = SSP_getNum(SSPx);.
> + dataword = sspdat[sspnum].dataword;.
> +.
> + // Polling mode ----------------------------------------------------------------------.
> + if (xfType == SSP_TRANSFER_POLLING){.
> + if (dataword == 0){.
> + rdata8 = (uint8_t *)dataCfg->rx_data;.
> + wdata8 = (uint8_t *)dataCfg->tx_data;.
> + } else {.
> + rdata16 = (uint16_t *)dataCfg->rx_data;.
> + wdata16 = (uint16_t *)dataCfg->tx_data;.
> + }.
> + while ((dataCfg->tx_cnt != dataCfg->length) || (dataCfg->rx_cnt != dataCfg->length)){.
> + if ((SSPx->SR & SSP_SR_TNF) && (dataCfg->tx_cnt != dataCfg->length)){.
> + // Write data to buffer.
> + if(dataCfg->tx_data == NULL){.
> + if (dataword == 0){.
> + SSP_SendData(SSPx, 0xFF);.
> + dataCfg->tx_cnt++;.
> + } else {.
> + SSP_SendData(SSPx, 0xFFFF);.
> + dataCfg->tx_cnt += 2;.
> + }.
> + } else {.
> + if (dataword == 0){.
> + SSP_SendData(SSPx, *wdata8);.
> + wdata8++;.
> + dataCfg->tx_cnt++;.
> + } else {.
> + SSP_SendData(SSPx, *wdata16);.
> + wdata16++;.
> + dataCfg->tx_cnt += 2;.
> + }.
> + }.
> + }.
> +.
> + // Check overrun error.
> + if ((stat = SSPx->RIS) & SSP_RIS_ROR){.
> + // save status and return.
> + dataCfg->status = stat | SSP_STAT_ERROR;.
> + return (-1);.
> + }.
> +.
> + // Check for any data available in RX FIFO.
> + while ((SSPx->SR & SSP_SR_RNE) && (dataCfg->rx_cnt != dataCfg->length)){.
> + // Read data from SSP data.
> + tmp = SSP_ReceiveData(SSPx);.
> +.
> + // Store data to destination.
> + if (dataCfg->rx_data != NULL).
> + {.
> + if (dataword == 0){.
> + *(rdata8) = (uint8_t) tmp;.
> + rdata8++;.
> + } else {.
> + *(rdata16) = (uint16_t) tmp;.
> + rdata16++;.
> + }.
> + }.
> + // Increase counter.
> + if (dataword == 0){.
> + dataCfg->rx_cnt++;.
> + } else {.
> + dataCfg->rx_cnt += 2;.
> + }.
> + }.
> + }.
> +.
> + // save status.
> + dataCfg->status = SSP_STAT_DONE;.
> +.
> + if (dataCfg->tx_data != NULL){.
> + return dataCfg->tx_cnt;.
> + } else if (dataCfg->rx_data != NULL){.
> + return dataCfg->rx_cnt;.
> + } else {.
> + return (0);.
> + }.
> + }.
> +.
> + // Interrupt mode ----------------------------------------------------------------------.
> + else if (xfType == SSP_TRANSFER_INTERRUPT){.
> + sspdat[sspnum].inthandler = SSP_IntHandler;.
> + sspdat[sspnum].txrx_setup = (uint32_t)dataCfg;.
> +.
> + while ((SSPx->SR & SSP_SR_TNF) && (dataCfg->tx_cnt != dataCfg->length)){.
> + // Write data to buffer.
> + if(dataCfg->tx_data == NULL){.
> + if (sspdat[sspnum].dataword == 0){.
> + SSP_SendData(SSPx, 0xFF);.
> + dataCfg->tx_cnt++;.
> + } else {.
> + SSP_SendData(SSPx, 0xFFFF);.
> + dataCfg->tx_cnt += 2;.
> + }.
> + } else {.
> + if (sspdat[sspnum].dataword == 0){.
> + SSP_SendData(SSPx, (*(uint8_t *)((uint32_t)dataCfg->tx_data + dataCfg->tx_cnt)));.
> + dataCfg->tx_cnt++;.
> + } else {.
> + SSP_SendData(SSPx, (*(uint16_t *)((uint32_t)dataCfg->tx_data + dataCfg->tx_cnt)));.
> + dataCfg->tx_cnt += 2;.
> + }.
> + }.
> +.
> + // Check error.
> + if ((stat = SSPx->RIS) & SSP_RIS_ROR){.
> + // save status and return.
> + dataCfg->status = stat | SSP_STAT_ERROR;.
> + return (-1);.
> + }.
> +.
> + // Check for any data available in RX FIFO.
> + while ((SSPx->SR & SSP_SR_RNE) && (dataCfg->rx_cnt != dataCfg->length)){.
> + // Read data from SSP data.
> + tmp = SSP_ReceiveData(SSPx);.
> +.
> + // Store data to destination.
> + if (dataCfg->rx_data != NULL).
> + {.
> + if (sspdat[sspnum].dataword == 0){.
> + *(uint8_t *)((uint32_t)dataCfg->rx_data + dataCfg->rx_cnt) = (uint8_t) tmp;.
> + } else {.
> + *(uint16_t *)((uint32_t)dataCfg->rx_data + dataCfg->rx_cnt) = (uint16_t) tmp;.
> + }.
> + }.
> + // Increase counter.
> + if (sspdat[sspnum].dataword == 0){.
> + dataCfg->rx_cnt++;.
> + } else {.
> + dataCfg->rx_cnt += 2;.
> + }.
> + }.
> + }.
> +.
> + // If there more data to sent or receive.
> + if ((dataCfg->rx_cnt != dataCfg->length) || (dataCfg->tx_cnt != dataCfg->length)){.
> + // Enable all interrupt.
> + SSPx->IMSC = SSP_IMSC_BITMASK;.
> + } else {.
> + // Save status.
> + dataCfg->status = SSP_STAT_DONE;.
> + }.
> + return (0);.
> + }.
> +.
> + return (-1);.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Checks whether the specified SSP status flag is set or not.
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @param[in] FlagType Type of flag to check status, should be one.
> + * of following:.
> + * - SSP_STAT_TXFIFO_EMPTY: TX FIFO is empty.
> + * - SSP_STAT_TXFIFO_NOTFULL: TX FIFO is not full.
> + * - SSP_STAT_RXFIFO_NOTEMPTY: RX FIFO is not empty.
> + * - SSP_STAT_RXFIFO_FULL: RX FIFO is full.
> + * - SSP_STAT_BUSY: SSP peripheral is busy.
> + * @return New State of specified SSP status flag.
> + **********************************************************************/.
> +FlagStatus SSP_GetStatus(LPC_SSP_TypeDef* SSPx, uint32_t FlagType).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> + CHECK_PARAM(PARAM_SSP_STAT(FlagType));.
> +.
> + return ((SSPx->SR & FlagType) ? SET : RESET);.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Enable or disable specified interrupt type in SSP peripheral.
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @param[in] IntType Interrupt type in SSP peripheral, should be:.
> + * - SSP_INTCFG_ROR: Receive Overrun interrupt.
> + * - SSP_INTCFG_RT: Receive Time out interrupt.
> + * - SSP_INTCFG_RX: RX FIFO is at least half full interrupt.
> + * - SSP_INTCFG_TX: TX FIFO is at least half empty interrupt.
> + * @param[in] NewState New State of specified interrupt type, should be:.
> + * - ENABLE: Enable this interrupt type.
> + * - DISABLE: Disable this interrupt type.
> + * @return None.
> + **********************************************************************/.
> +void SSP_IntConfig(LPC_SSP_TypeDef *SSPx, uint32_t IntType, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> + CHECK_PARAM(PARAM_SSP_INTCFG(IntType));.
> +.
> + if (NewState == ENABLE).
> + {.
> + SSPx->IMSC |= IntType;.
> + }.
> + else.
> + {.
> + SSPx->IMSC &= (~IntType) & SSP_IMSC_BITMASK;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Check whether the specified Raw interrupt status flag is.
> + * set or not.
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @param[in] RawIntType Raw Interrupt Type, should be:.
> + * - SSP_INTSTAT_RAW_ROR: Receive Overrun interrupt.
> + * - SSP_INTSTAT_RAW_RT: Receive Time out interrupt.
> + * - SSP_INTSTAT_RAW_RX: RX FIFO is at least half full interrupt.
> + * - SSP_INTSTAT_RAW_TX: TX FIFO is at least half empty interrupt.
> + * @return New State of specified Raw interrupt status flag in SSP peripheral.
> + * Note: Enabling/Disabling specified interrupt in SSP peripheral does not.
> + * effect to Raw Interrupt Status flag..
> + **********************************************************************/.
> +IntStatus SSP_GetRawIntStatus(LPC_SSP_TypeDef *SSPx, uint32_t RawIntType).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> + CHECK_PARAM(PARAM_SSP_INTSTAT_RAW(RawIntType));.
> +.
> + return ((SSPx->RIS & RawIntType) ? SET : RESET);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Check whether the specified interrupt status flag is.
> + * set or not.
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @param[in] IntType Raw Interrupt Type, should be:.
> + * - SSP_INTSTAT_ROR: Receive Overrun interrupt.
> + * - SSP_INTSTAT_RT: Receive Time out interrupt.
> + * - SSP_INTSTAT_RX: RX FIFO is at least half full interrupt.
> + * - SSP_INTSTAT_TX: TX FIFO is at least half empty interrupt.
> + * @return New State of specified interrupt status flag in SSP peripheral.
> + * Note: Enabling/Disabling specified interrupt in SSP peripheral effects.
> + * to Interrupt Status flag..
> + **********************************************************************/.
> +IntStatus SSP_GetIntStatus (LPC_SSP_TypeDef *SSPx, uint32_t IntType).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> + CHECK_PARAM(PARAM_SSP_INTSTAT(IntType));.
> +.
> + return ((SSPx->MIS & IntType) ? SET :RESET);.
> +}.
> +.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Clear specified interrupt pending in SSP peripheral.
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @param[in] IntType Interrupt pending to clear, should be:.
> + * - SSP_INTCLR_ROR: clears the "frame was received when.
> + * RxFIFO was full" interrupt..
> + * - SSP_INTCLR_RT: clears the "Rx FIFO was not empty and.
> + * has not been read for a timeout period" interrupt..
> + * @return None.
> + **********************************************************************/.
> +void SSP_ClearIntPending(LPC_SSP_TypeDef *SSPx, uint32_t IntType).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> + CHECK_PARAM(PARAM_SSP_INTCLR(IntType));.
> +.
> + SSPx->ICR = IntType;.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Enable/Disable DMA function for SSP peripheral.
> + * @param[in] SSPx SSP peripheral selected, should be SSP0 or SSP1.
> + * @param[in] DMAMode Type of DMA, should be:.
> + * - SSP_DMA_TX: DMA for the transmit FIFO.
> + * - SSP_DMA_RX: DMA for the Receive FIFO.
> + * @param[in] NewState New State of DMA function on SSP peripheral,.
> + * should be:.
> + * - ENALBE: Enable this function.
> + * - DISABLE: Disable this function.
> + * @return None.
> + **********************************************************************/.
> +void SSP_DMACmd(LPC_SSP_TypeDef *SSPx, uint32_t DMAMode, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_SSPx(SSPx));.
> + CHECK_PARAM(PARAM_SSP_DMA(DMAMode));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + if (NewState == ENABLE).
> + {.
> + SSPx->DMACR |= DMAMode;.
> + }.
> + else.
> + {.
> + SSPx->DMACR &= (~DMAMode) & SSP_DMA_BITMASK;.
> + }.
> +}.
> +.
> +/**.
> + * @brief Standard SSP0 Interrupt handler.
> + * @param[in] None.
> + * @return None.
> + */.
> +void SSP0_StdIntHandler(void).
> +{.
> + // Call relevant handler.
> + sspdat[0].inthandler(LPC_SSP0);.
> +}.
> +.
> +/**.
> + * @brief Standard SSP1 Interrupt handler.
> + * @param[in] None.
> + * @return None.
> + */.
> +void SSP1_StdIntHandler(void).
> +{.
> + // Call relevant handler.
> + sspdat[1].inthandler(LPC_SSP1);.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +#endif /* _SSP */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> +.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.h b/arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.h
> new file mode 100644
> index 0000000..6ec5746
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/ssp/lpc17xx_ssp.h
> @@ -0,0 +1,457 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_ssp.h.
> + * @brief : Contains all macro definitions and function prototypes.
> + * support for SSP firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 9. April. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @defgroup SSP.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef LPC17XX_SSP_H_.
> +#define LPC17XX_SSP_H_.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "LPC17xx.h".
> +#include "lpc_types.h".
> +.
> +.
> +#ifdef __cplusplus.
> +extern "C".
> +{.
> +#endif.
> +.
> +.
> +/* Private Macros ------------------------------------------------------------- */.
> +/** @defgroup SSP_Private_Macros.
> + * @{.
> + */.
> +.
> +/*********************************************************************//**.
> + * Macro defines for CR0 register.
> + **********************************************************************/.
> +.
> +/** @defgroup SSP_REGISTER_BIT_DEFINITION.
> + * @{.
> + */.
> +.
> +/** SSP data size select, must be 4 bits to 16 bits */.
> +#define SSP_CR0_DSS(n) ((uint32_t)((n-1)&0xF)).
> +/** SSP control 0 Motorola SPI mode */.
> +#define SSP_CR0_FRF_SPI ((uint32_t)(0<<4)).
> +/** SSP control 0 TI synchronous serial mode */.
> +#define SSP_CR0_FRF_TI ((uint32_t)(1<<4)).
> +/** SSP control 0 National Micro-wire mode */.
> +#define SSP_CR0_FRF_MICROWIRE ((uint32_t)(2<<4)).
> +/** SPI clock polarity bit (used in SPI mode only), (1) = maintains the.
> + bus clock high between frames, (0) = low */.
> +#define SSP_CR0_CPOL_HI ((uint32_t)(1<<6)).
> +/** SPI clock out phase bit (used in SPI mode only), (1) = captures data.
> + on the second clock transition of the frame, (0) = first */.
> +#define SSP_CR0_CPHA_SECOND ((uint32_t)(1<<7)).
> +/** SSP serial clock rate value load macro, divider rate is.
> + PERIPH_CLK / (cpsr * (SCR + 1)) */.
> +#define SSP_CR0_SCR(n) ((uint32_t)((n&0xFF)<<8)).
> +/** SSP CR0 bit mask */.
> +#define SSP_CR0_BITMASK ((uint32_t)(0xFFFF)).
> +.
> +.
> +/*********************************************************************//**.
> + * Macro defines for CR1 register.
> + **********************************************************************/.
> +/** SSP control 1 loopback mode enable bit */.
> +#define SSP_CR1_LBM_EN ((uint32_t)(1<<0)).
> +/** SSP control 1 enable bit */.
> +#define SSP_CR1_SSP_EN ((uint32_t)(1<<1)).
> +/** SSP control 1 slave enable */.
> +#define SSP_CR1_SLAVE_EN ((uint32_t)(1<<2)).
> +/** SSP control 1 slave out disable bit, disables transmit line in slave.
> + mode */.
> +#define SSP_CR1_SO_DISABLE ((uint32_t)(1<<3)).
> +/** SSP CR1 bit mask */.
> +#define SSP_CR1_BITMASK ((uint32_t)(0x0F)).
> +.
> +.
> +/*********************************************************************//**.
> + * Macro defines for DR register.
> + **********************************************************************/.
> +/** SSP data bit mask */.
> +#define SSP_DR_BITMASK(n) ((n)&0xFFFF).
> +.
> +/*********************************************************************//**.
> + * Macro defines for SR register.
> + **********************************************************************/.
> +/** SSP status TX FIFO Empty bit */.
> +#define SSP_SR_TFE ((uint32_t)(1<<0)).
> +/** SSP status TX FIFO not full bit */.
> +#define SSP_SR_TNF ((uint32_t)(1<<1)).
> +/** SSP status RX FIFO not empty bit */.
> +#define SSP_SR_RNE ((uint32_t)(1<<2)).
> +/** SSP status RX FIFO full bit */.
> +#define SSP_SR_RFF ((uint32_t)(1<<3)).
> +/** SSP status SSP Busy bit */.
> +#define SSP_SR_BSY ((uint32_t)(1<<4)).
> +/** SSP SR bit mask */.
> +#define SSP_SR_BITMASK ((uint32_t)(0x1F)).
> +.
> +.
> +/*********************************************************************//**.
> + * Macro defines for CPSR register.
> + **********************************************************************/.
> +/** SSP clock prescaler */.
> +#define SSP_CPSR_CPDVSR(n) ((uint32_t)(n&0xFF)).
> +/** SSP CPSR bit mask */.
> +#define SSP_CPSR_BITMASK ((uint32_t)(0xFF)).
> +.
> +.
> +/*********************************************************************//**.
> + * Macro define for (IMSC) Interrupt Mask Set/Clear registers.
> + **********************************************************************/.
> +/** Receive Overrun */.
> +#define SSP_IMSC_ROR ((uint32_t)(1<<0)).
> +/** Receive TimeOut */.
> +#define SSP_IMSC_RT ((uint32_t)(1<<1)).
> +/** Rx FIFO is at least half full */.
> +#define SSP_IMSC_RX ((uint32_t)(1<<2)).
> +/** Tx FIFO is at least half empty */.
> +#define SSP_IMSC_TX ((uint32_t)(1<<3)).
> +/** IMSC bit mask */.
> +#define SSP_IMSC_BITMASK ((uint32_t)(0x0F)).
> +.
> +/*********************************************************************//**.
> + * Macro define for (RIS) Raw Interrupt Status registers.
> + **********************************************************************/.
> +/** Receive Overrun */.
> +#define SSP_RIS_ROR ((uint32_t)(1<<0)).
> +/** Receive TimeOut */.
> +#define SSP_RIS_RT ((uint32_t)(1<<1)).
> +/** Rx FIFO is at least half full */.
> +#define SSP_RIS_RX ((uint32_t)(1<<2)).
> +/** Tx FIFO is at least half empty */.
> +#define SSP_RIS_TX ((uint32_t)(1<<3)).
> +/** RIS bit mask */.
> +#define SSP_RIS_BITMASK ((uint32_t)(0x0F)).
> +.
> +.
> +/*********************************************************************//**.
> + * Macro define for (MIS) Masked Interrupt Status registers.
> + **********************************************************************/.
> +/** Receive Overrun */.
> +#define SSP_MIS_ROR ((uint32_t)(1<<0)).
> +/** Receive TimeOut */.
> +#define SSP_MIS_RT ((uint32_t)(1<<1)).
> +/** Rx FIFO is at least half full */.
> +#define SSP_MIS_RX ((uint32_t)(1<<2)).
> +/** Tx FIFO is at least half empty */.
> +#define SSP_MIS_TX ((uint32_t)(1<<3)).
> +/** MIS bit mask */.
> +#define SSP_MIS_BITMASK ((uint32_t)(0x0F)).
> +.
> +.
> +/*********************************************************************//**.
> + * Macro define for (ICR) Interrupt Clear registers.
> + **********************************************************************/.
> +/** Writing a 1 to this bit clears the "frame was received when.
> + * RxFIFO was full" interrupt */.
> +#define SSP_ICR_ROR ((uint32_t)(1<<0)).
> +/** Writing a 1 to this bit clears the "Rx FIFO was not empty and.
> + * has not been read for a timeout period" interrupt */.
> +#define SSP_ICR_RT ((uint32_t)(1<<1)).
> +/** ICR bit mask */.
> +#define SSP_ICR_BITMASK ((uint32_t)(0x03)).
> +.
> +.
> +/*********************************************************************//**.
> + * Macro defines for DMACR register.
> + **********************************************************************/.
> +/** SSP bit for enabling RX DMA */.
> +#define SSP_DMA_RXDMA_EN ((uint32_t)(1<<0)).
> +/** SSP bit for enabling TX DMA */.
> +#define SSP_DMA_TXDMA_EN ((uint32_t)(1<<1)).
> +/** DMACR bit mask */.
> +#define SSP_DMA_BITMASK ((uint32_t)(0x03)).
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Types --------------------------------------------------------------- */.
> +/** @defgroup SSP_Public_Types.
> + * @{.
> + */.
> +.
> +/** @brief SSP configuration structure */.
> +typedef struct {.
> + uint32_t Databit; /** Databit number, should be SSP_DATABIT_x,.
> + where x is in range from 4 - 16 */.
> + uint32_t CPHA; /** Clock phase, should be:.
> + - SSP_CPHA_FIRST: first clock edge.
> + - SSP_CPHA_SECOND: second clock edge */.
> + uint32_t CPOL; /** Clock polarity, should be:.
> + - SSP_CPOL_HI: high level.
> + - SSP_CPOL_LO: low level */.
> + uint32_t Mode; /** SSP mode, should be:.
> + - SSP_MASTER_MODE: Master mode.
> + - SSP_SLAVE_MODE: Slave mode */.
> + uint32_t FrameFormat; /** Frame Format:.
> + - SSP_FRAME_SPI: Motorola SPI frame format.
> + - SSP_FRAME_TI: TI frame format.
> + - SSP_FRAME_MICROWIRE: National Microwire frame format */.
> + uint32_t ClockRate; /** Clock rate,in Hz */.
> +} SSP_CFG_Type;.
> +.
> +/**.
> + * @brief SSP Transfer Type definitions.
> + */.
> +typedef enum {.
> + SSP_TRANSFER_POLLING = 0, /**< Polling transfer */.
> + SSP_TRANSFER_INTERRUPT /**< Interrupt transfer */.
> +} SSP_TRANSFER_Type;.
> +.
> +/**.
> + * @brief SPI Data configuration structure definitions.
> + */.
> +typedef struct {.
> + void *tx_data; /**< Pointer to transmit data */.
> + uint32_t tx_cnt; /**< Transmit counter */.
> + void *rx_data; /**< Pointer to transmit data */.
> + uint32_t rx_cnt; /**< Receive counter */.
> + uint32_t length; /**< Length of transfer data */.
> + uint32_t status; /**< Current status of SSP activity */.
> + void (*callback)(void); /**< Pointer to Call back function when transmission complete.
> + used in interrupt transfer mode */.
> +} SSP_DATA_SETUP_Type;.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Macros -------------------------------------------------------------- */.
> +/** @defgroup SSP_Public_Macros.
> + * @{.
> + */.
> +.
> +/** Macro to determine if it is valid SSP port number */.
> +#define PARAM_SSPx(n) ((((uint32_t *)n)==((uint32_t *)LPC_SSP0)) \.
> +|| (((uint32_t *)n)==((uint32_t *)LPC_SSP1))).
> +.
> +/*********************************************************************//**.
> + * SSP configuration parameter defines.
> + **********************************************************************/.
> +/** Clock phase control bit */.
> +#define SSP_CPHA_FIRST ((uint32_t)(0)).
> +#define SSP_CPHA_SECOND SSP_CR0_CPHA_SECOND.
> +#define PARAM_SSP_CPHA(n) ((n==SSP_CPHA_FIRST) || (n==SSP_CPHA_SECOND)).
> +.
> +/** Clock polarity control bit */.
> +/* There's no bug here!!!.
> + * - If bit[6] in SSPnCR0 is 0: SSP controller maintains the bus clock low between frames..
> + * That means the active clock is in HI state..
> + * - If bit[6] in SSPnCR0 is 1 (SSP_CR0_CPOL_HI): SSP controller maintains the bus clock.
> + * high between frames. That means the active clock is in LO state..
> + */.
> +#define SSP_CPOL_HI ((uint32_t)(0)).
> +#define SSP_CPOL_LO SSP_CR0_CPOL_HI.
> +#define PARAM_SSP_CPOL(n) ((n==SSP_CPOL_HI) || (n==SSP_CPOL_LO)).
> +.
> +/** SSP master mode enable */.
> +#define SSP_SLAVE_MODE SSP_CR1_SLAVE_EN.
> +#define SSP_MASTER_MODE ((uint32_t)(0)).
> +#define PARAM_SSP_MODE(n) ((n==SSP_SLAVE_MODE) || (n==SSP_MASTER_MODE)).
> +.
> +/** SSP data bit number defines */.
> +#define SSP_DATABIT_4 SSP_CR0_DSS(4) /*!< Databit number = 4 */.
> +#define SSP_DATABIT_5 SSP_CR0_DSS(5) /*!< Databit number = 5 */.
> +#define SSP_DATABIT_6 SSP_CR0_DSS(6) /*!< Databit number = 6 */.
> +#define SSP_DATABIT_7 SSP_CR0_DSS(7) /*!< Databit number = 7 */.
> +#define SSP_DATABIT_8 SSP_CR0_DSS(8) /*!< Databit number = 8 */.
> +#define SSP_DATABIT_9 SSP_CR0_DSS(9) /*!< Databit number = 9 */.
> +#define SSP_DATABIT_10 SSP_CR0_DSS(10) /*!< Databit number = 10 */.
> +#define SSP_DATABIT_11 SSP_CR0_DSS(11) /*!< Databit number = 11 */.
> +#define SSP_DATABIT_12 SSP_CR0_DSS(12) /*!< Databit number = 12 */.
> +#define SSP_DATABIT_13 SSP_CR0_DSS(13) /*!< Databit number = 13 */.
> +#define SSP_DATABIT_14 SSP_CR0_DSS(14) /*!< Databit number = 14 */.
> +#define SSP_DATABIT_15 SSP_CR0_DSS(15) /*!< Databit number = 15 */.
> +#define SSP_DATABIT_16 SSP_CR0_DSS(16) /*!< Databit number = 16 */.
> +#define PARAM_SSP_DATABIT(n) ((n==SSP_DATABIT_4) || (n==SSP_DATABIT_5) \.
> +|| (n==SSP_DATABIT_6) || (n==SSP_DATABIT_16) \.
> +|| (n==SSP_DATABIT_7) || (n==SSP_DATABIT_8) \.
> +|| (n==SSP_DATABIT_9) || (n==SSP_DATABIT_10) \.
> +|| (n==SSP_DATABIT_11) || (n==SSP_DATABIT_12) \.
> +|| (n==SSP_DATABIT_13) || (n==SSP_DATABIT_14) \.
> +|| (n==SSP_DATABIT_15)).
> +.
> +/** SSP Frame Format definition */.
> +/** Motorola SPI mode */.
> +#define SSP_FRAME_SPI SSP_CR0_FRF_SPI.
> +/** TI synchronous serial mode */.
> +#define SSP_FRAME_TI SSP_CR0_FRF_TI.
> +/** National Micro-wire mode */.
> +#define SSP_FRAME_MICROWIRE SSP_CR0_FRF_MICROWIRE.
> +.
> +#define PARAM_SSP_FRAME(n) ((n==SSP_FRAME_SPI) || (n==SSP_FRAME_TI)\.
> +|| (n==SSP_FRAME_MICROWIRE)).
> +.
> +.
> +/*********************************************************************//**.
> + * SSP Status defines.
> + **********************************************************************/.
> +/** SSP status TX FIFO Empty bit */.
> +#define SSP_STAT_TXFIFO_EMPTY SSP_SR_TFE.
> +/** SSP status TX FIFO not full bit */.
> +#define SSP_STAT_TXFIFO_NOTFULL SSP_SR_TNF.
> +/** SSP status RX FIFO not empty bit */.
> +#define SSP_STAT_RXFIFO_NOTEMPTY SSP_SR_RNE.
> +/** SSP status RX FIFO full bit */.
> +#define SSP_STAT_RXFIFO_FULL SSP_SR_RFF.
> +/** SSP status SSP Busy bit */.
> +#define SSP_STAT_BUSY SSP_SR_BSY.
> +.
> +#define PARAM_SSP_STAT(n) ((n==SSP_STAT_TXFIFO_EMPTY) || (n==SSP_STAT_TXFIFO_NOTFULL) \.
> +|| (n==SSP_STAT_RXFIFO_NOTEMPTY) || (n==SSP_STAT_RXFIFO_FULL) \.
> +|| (n==SSP_STAT_BUSY)).
> +.
> +.
> +/*********************************************************************//**.
> + * SSP Interrupt Configuration defines.
> + **********************************************************************/.
> +/** Receive Overrun */.
> +#define SSP_INTCFG_ROR SSP_IMSC_ROR.
> +/** Receive TimeOut */.
> +#define SSP_INTCFG_RT SSP_IMSC_RT.
> +/** Rx FIFO is at least half full */.
> +#define SSP_INTCFG_RX SSP_IMSC_RX.
> +/** Tx FIFO is at least half empty */.
> +#define SSP_INTCFG_TX SSP_IMSC_TX.
> +.
> +#define PARAM_SSP_INTCFG(n) ((n==SSP_INTCFG_ROR) || (n==SSP_INTCFG_RT) \.
> +|| (n==SSP_INTCFG_RX) || (n==SSP_INTCFG_TX)).
> +.
> +.
> +/*********************************************************************//**.
> + * SSP Configured Interrupt Status defines.
> + **********************************************************************/.
> +/** Receive Overrun */.
> +#define SSP_INTSTAT_ROR SSP_MIS_ROR.
> +/** Receive TimeOut */.
> +#define SSP_INTSTAT_RT SSP_MIS_RT.
> +/** Rx FIFO is at least half full */.
> +#define SSP_INTSTAT_RX SSP_MIS_RX.
> +/** Tx FIFO is at least half empty */.
> +#define SSP_INTSTAT_TX SSP_MIS_TX.
> +.
> +#define PARAM_SSP_INTSTAT(n) ((n==SSP_INTSTAT_ROR) || (n==SSP_INTSTAT_RT) \.
> +|| (n==SSP_INTSTAT_RX) || (n==SSP_INTSTAT_TX)).
> +.
> +.
> +/*********************************************************************//**.
> + * SSP Raw Interrupt Status defines.
> + **********************************************************************/.
> +/** Receive Overrun */.
> +#define SSP_INTSTAT_RAW_ROR SSP_RIS_ROR.
> +/** Receive TimeOut */.
> +#define SSP_INTSTAT_RAW_RT SSP_RIS_RT.
> +/** Rx FIFO is at least half full */.
> +#define SSP_INTSTAT_RAW_RX SSP_RIS_RX.
> +/** Tx FIFO is at least half empty */.
> +#define SSP_INTSTAT_RAW_TX SSP_RIS_TX.
> +.
> +#define PARAM_SSP_INTSTAT_RAW(n) ((n==SSP_INTSTAT_RAW_ROR) || (n==SSP_INTSTAT_RAW_RT) \.
> +|| (n==SSP_INTSTAT_RAW_RX) || (n==SSP_INTSTAT_RAW_TX)).
> +.
> +.
> +/*********************************************************************//**.
> + * SSP Interrupt Clear defines.
> + **********************************************************************/.
> +/** Writing a 1 to this bit clears the "frame was received when.
> + * RxFIFO was full" interrupt */.
> +#define SSP_INTCLR_ROR SSP_ICR_ROR.
> +/** Writing a 1 to this bit clears the "Rx FIFO was not empty and.
> + * has not been read for a timeout period" interrupt */.
> +#define SSP_INTCLR_RT SSP_ICR_RT.
> +.
> +#define PARAM_SSP_INTCLR(n) ((n==SSP_INTCLR_ROR) || (n==SSP_INTCLR_RT)).
> +.
> +.
> +/*********************************************************************//**.
> + * SSP DMA defines.
> + **********************************************************************/.
> +/** SSP bit for enabling RX DMA */.
> +#define SSP_DMA_TX SSP_DMA_RXDMA_EN.
> +/** SSP bit for enabling TX DMA */.
> +#define SSP_DMA_RX SSP_DMA_TXDMA_EN.
> +.
> +#define PARAM_SSP_DMA(n) ((n==SSP_DMA_TX) || (n==SSP_DMA_RX)).
> +.
> +/* SSP Status Implementation definitions */.
> +#define SSP_STAT_DONE (1UL<<8) /**< Done */.
> +#define SSP_STAT_ERROR (1UL<<9) /**< Error */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup SSP_Public_Functions.
> + * @{.
> + */.
> +.
> +void SSP_SetClock (LPC_SSP_TypeDef *SSPx, uint32_t target_clock);.
> +void SSP_DeInit(LPC_SSP_TypeDef* SSPx);.
> +void SSP_Init(LPC_SSP_TypeDef *SSPx, SSP_CFG_Type *SSP_ConfigStruct);.
> +void SSP_ConfigStructInit(SSP_CFG_Type *SSP_InitStruct);.
> +void SSP_Cmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState);.
> +void SSP_LoopBackCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState);.
> +void SSP_SlaveOutputCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState);.
> +void SSP_SendData(LPC_SSP_TypeDef* SSPx, uint16_t Data);.
> +uint16_t SSP_ReceiveData(LPC_SSP_TypeDef* SSPx);.
> +int32_t SSP_ReadWrite (LPC_SSP_TypeDef *SSPx, SSP_DATA_SETUP_Type *dataCfg, \.
> + SSP_TRANSFER_Type xfType);.
> +FlagStatus SSP_GetStatus(LPC_SSP_TypeDef* SSPx, uint32_t FlagType);.
> +void SSP_IntConfig(LPC_SSP_TypeDef *SSPx, uint32_t IntType, FunctionalState NewState);.
> +IntStatus SSP_GetRawIntStatus(LPC_SSP_TypeDef *SSPx, uint32_t RawIntType);.
> +IntStatus SSP_GetIntStatus (LPC_SSP_TypeDef *SSPx, uint32_t IntType);.
> +void SSP_ClearIntPending(LPC_SSP_TypeDef *SSPx, uint32_t IntType);.
> +void SSP_DMACmd(LPC_SSP_TypeDef *SSPx, uint32_t DMAMode, FunctionalState NewState);.
> +void SSP0_StdIntHandler(void);.
> +void SSP1_StdIntHandler(void);.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +#ifdef __cplusplus.
> +}.
> +#endif.
> +.
> +#endif /* LPC17XX_SSP_H_ */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/system/Makefile b/arch/arm/mach-lpc17cmsis/libs/system/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/system/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/system/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/system/Makefile.omk
> new file mode 100644
> index 0000000..401ed33
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/system/Makefile.omk
> @@ -0,0 +1,8 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = system
> +
> +system_SOURCES = system_LPC17xx.c
> +include_HEADERS = system_LPC17xx.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/system/system_LPC17xx.c b/arch/arm/mach-lpc17cmsis/libs/system/system_LPC17xx.c
> new file mode 100644
> index 0000000..8fe2b41
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/system/system_LPC17xx.c
> @@ -0,0 +1,574 @@
> +/**************************************************************************//**
> + * @file system_LPC17xx.c
> + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Source File
> + * for the NXP LPC17xx Device Series
> + * @version V1.03
> + * @date 07. October 2009
> + *
> + * @note
> + * Copyright (C) 2009 ARM Limited. All rights reserved.
> + *
> + * @par
> + * ARM Limited (ARM) is supplying this software for use with Cortex-M
> + * processor based microcontrollers. This file can be freely distributed
> + * within development tools that are supporting such ARM based processors.
> + *
> + * @par
> + * 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.
> + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
> + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
> + *
> + ******************************************************************************/
> +
> +
> +#include <stdint.h>
> +#include "LPC17xx.h"
> +
> +/*
> +//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
> +*/
> +
> +/*--------------------- Clock Configuration ----------------------------------
> +//
> +// <e> Clock Configuration
> +// <h> System Controls and Status Register (SCS)
> +// <o1.4> OSCRANGE: Main Oscillator Range Select
> +// <0=> 1 MHz to 20 MHz
> +// <1=> 15 MHz to 24 MHz
> +// <e1.5> OSCEN: Main Oscillator Enable
> +// </e>
> +// </h>
> +//
> +// <h> Clock Source Select Register (CLKSRCSEL)
> +// <o2.0..1> CLKSRC: PLL Clock Source Selection
> +// <0=> Internal RC oscillator
> +// <1=> Main oscillator
> +// <2=> RTC oscillator
> +// </h>
> +//
> +
> +*/
> +#define CLOCK_SETUP 1
> +#define SCS_Val 0x00000030
> +#define CLKSRCSEL_Val 0x00000001
> +
> +
> +/*
> +
> +
> +
> +// <e3> PLL0 Configuration (Main PLL)
> +// <h> PLL0 Configuration Register (PLL0CFG)
> +// <i> F_cco0 = (2 * M * F_in) / N
> +// <i> F_in must be in the range of 32 kHz to 50 MHz
> +// <i> F_cco0 must be in the range of 275 MHz to 550 MHz
> +// <o4.0..14> MSEL: PLL Multiplier Selection
> +// <6-32768><#-1>
> +// <i> M Value
> +// <o4.16..23> NSEL: PLL Divider Selection
> +// <1-256><#-1>
> +// <i> N Value
> +// </h>
> +// </e>
> +//
> +
> +
> +*/
> +#define PLL0_SETUP 1
> +#define PLL0CFG_Val 0x0003001B
> +
> +/*
> +// <e5> PLL1 Configuration (USB PLL)
> +// <h> PLL1 Configuration Register (PLL1CFG)
> +// <i> F_usb = M * F_osc or F_usb = F_cco1 / (2 * P)
> +// <i> F_cco1 = F_osc * M * 2 * P
> +// <i> F_cco1 must be in the range of 156 MHz to 320 MHz
> +// <o6.0..4> MSEL: PLL Multiplier Selection
> +// <1-32><#-1>
> +// <i> M Value (for USB maximum value is 4)
> +// <o6.5..6> PSEL: PLL Divider Selection
> +// <0=> 1
> +// <1=> 2
> +// <2=> 4
> +// <3=> 8
> +// <i> P Value
> +// </h>
> +// </e>
> +//
> +// <h> CPU Clock Configuration Register (CCLKCFG)
> +// <o7.0..7> CCLKSEL: Divide Value for CPU Clock from PLL0
> +// <3-256><#-1>
> +// </h>
> +//
> +// <h> USB Clock Configuration Register (USBCLKCFG)
> +// <o8.0..3> USBSEL: Divide Value for USB Clock from PLL0
> +// <0-15>
> +// <i> Divide is USBSEL + 1
> +// </h>
> +//
> +// <h> Peripheral Clock Selection Register 0 (PCLKSEL0)
> +// <o9.0..1> PCLK_WDT: Peripheral Clock Selection for WDT
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.2..3> PCLK_TIMER0: Peripheral Clock Selection for TIMER0
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.4..5> PCLK_TIMER1: Peripheral Clock Selection for TIMER1
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.6..7> PCLK_UART0: Peripheral Clock Selection for UART0
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.8..9> PCLK_UART1: Peripheral Clock Selection for UART1
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.12..13> PCLK_PWM1: Peripheral Clock Selection for PWM1
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.14..15> PCLK_I2C0: Peripheral Clock Selection for I2C0
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.16..17> PCLK_SPI: Peripheral Clock Selection for SPI
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.20..21> PCLK_SSP1: Peripheral Clock Selection for SSP1
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.22..23> PCLK_DAC: Peripheral Clock Selection for DAC
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.24..25> PCLK_ADC: Peripheral Clock Selection for ADC
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o9.26..27> PCLK_CAN1: Peripheral Clock Selection for CAN1
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 6
> +// <o9.28..29> PCLK_CAN2: Peripheral Clock Selection for CAN2
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 6
> +// <o9.30..31> PCLK_ACF: Peripheral Clock Selection for ACF
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 6
> +// </h>
> +//
> +// <h> Peripheral Clock Selection Register 1 (PCLKSEL1)
> +// <o10.0..1> PCLK_QEI: Peripheral Clock Selection for the Quadrature Encoder Interface
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.2..3> PCLK_GPIO: Peripheral Clock Selection for GPIOs
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.4..5> PCLK_PCB: Peripheral Clock Selection for the Pin Connect Block
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.6..7> PCLK_I2C1: Peripheral Clock Selection for I2C1
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.10..11> PCLK_SSP0: Peripheral Clock Selection for SSP0
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.12..13> PCLK_TIMER2: Peripheral Clock Selection for TIMER2
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.14..15> PCLK_TIMER3: Peripheral Clock Selection for TIMER3
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.16..17> PCLK_UART2: Peripheral Clock Selection for UART2
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.18..19> PCLK_UART3: Peripheral Clock Selection for UART3
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.20..21> PCLK_I2C2: Peripheral Clock Selection for I2C2
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.22..23> PCLK_I2S: Peripheral Clock Selection for I2S
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.26..27> PCLK_RIT: Peripheral Clock Selection for the Repetitive Interrupt Timer
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.28..29> PCLK_SYSCON: Peripheral Clock Selection for the System Control Block
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// <o10.30..31> PCLK_MC: Peripheral Clock Selection for the Motor Control PWM
> +// <0=> Pclk = Cclk / 4
> +// <1=> Pclk = Cclk
> +// <2=> Pclk = Cclk / 2
> +// <3=> Pclk = Hclk / 8
> +// </h>
> +//
> +// <h> Power Control for Peripherals Register (PCONP)
> +// <o11.1> PCTIM0: Timer/Counter 0 power/clock enable
> +// <o11.2> PCTIM1: Timer/Counter 1 power/clock enable
> +// <o11.3> PCUART0: UART 0 power/clock enable
> +// <o11.4> PCUART1: UART 1 power/clock enable
> +// <o11.6> PCPWM1: PWM 1 power/clock enable
> +// <o11.7> PCI2C0: I2C interface 0 power/clock enable
> +// <o11.8> PCSPI: SPI interface power/clock enable
> +// <o11.9> PCRTC: RTC power/clock enable
> +// <o11.10> PCSSP1: SSP interface 1 power/clock enable
> +// <o11.12> PCAD: A/D converter power/clock enable
> +// <o11.13> PCCAN1: CAN controller 1 power/clock enable
> +// <o11.14> PCCAN2: CAN controller 2 power/clock enable
> +// <o11.15> PCGPIO: GPIOs power/clock enable
> +// <o11.16> PCRIT: Repetitive interrupt timer power/clock enable
> +// <o11.17> PCMC: Motor control PWM power/clock enable
> +// <o11.18> PCQEI: Quadrature encoder interface power/clock enable
> +// <o11.19> PCI2C1: I2C interface 1 power/clock enable
> +// <o11.21> PCSSP0: SSP interface 0 power/clock enable
> +// <o11.22> PCTIM2: Timer 2 power/clock enable
> +// <o11.23> PCTIM3: Timer 3 power/clock enable
> +// <o11.24> PCUART2: UART 2 power/clock enable
> +// <o11.25> PCUART3: UART 3 power/clock enable
> +// <o11.26> PCI2C2: I2C interface 2 power/clock enable
> +// <o11.27> PCI2S: I2S interface power/clock enable
> +// <o11.29> PCGPDMA: GP DMA function power/clock enable
> +// <o11.30> PCENET: Ethernet block power/clock enable
> +// <o11.31> PCUSB: USB interface power/clock enable
> +// </h>
> +//
> +// <h> Clock Output Configuration Register (CLKOUTCFG)
> +// <o12.0..3> CLKOUTSEL: Selects clock source for CLKOUT
> +// <0=> CPU clock
> +// <1=> Main oscillator
> +// <2=> Internal RC oscillator
> +// <3=> USB clock
> +// <4=> RTC oscillator
> +// <o12.4..7> CLKOUTDIV: Selects clock divider for CLKOUT
> +// <1-16><#-1>
> +// <o12.8> CLKOUT_EN: CLKOUT enable control
> +// </h>
> +//
> +// </e>
> +*/
> +
> +
> +#define PLL1_SETUP 0
> +#define PLL1CFG_Val 0x00000023
> +#define CCLKCFG_Val 0x00000003
> +#define USBCLKCFG_Val 0x00000000
> +#define PCLKSEL0_Val 0x00000000
> +#define PCLKSEL1_Val 0x00000000
> +#define PCONP_Val 0x042887DE
> +#define CLKOUTCFG_Val 0x00000000
> +
> +
> +/*--------------------- Flash Accelerator Configuration ----------------------
> +//
> +// <e> Flash Accelerator Configuration
> +// <o1.0..11> Reserved
> +// <o1.12..15> FLASHTIM: Flash Access Time
> +// <0=> 1 CPU clock (for CPU clock up to 20 MHz)
> +// <1=> 2 CPU clocks (for CPU clock up to 40 MHz)
> +// <2=> 3 CPU clocks (for CPU clock up to 60 MHz)
> +// <3=> 4 CPU clocks (for CPU clock up to 80 MHz)
> +// <4=> 5 CPU clocks (for CPU clock up to 100 MHz)
> +// <5=> 6 CPU clocks (for any CPU clock)
> +// </e>
> +*/
> +#define FLASH_SETUP 1
> +#define FLASHCFG_Val 0x0000403A
> +
> +/*
> +//-------- <<< end of configuration section >>> ------------------------------
> +*/
> +
> +/*----------------------------------------------------------------------------
> + Check the register settings
> + *----------------------------------------------------------------------------*/
> +#define CHECK_RANGE(val, min, max) ((val < min) || (val > max))
> +#define CHECK_RSVD(val, mask) (val & mask)
> +
> +/* Clock Configuration -------------------------------------------------------*/
> +#if (CHECK_RSVD((SCS_Val), ~0x00000030))
> + #error "SCS: Invalid values of reserved bits!"
> +#endif
> +
> +#if (CHECK_RANGE((CLKSRCSEL_Val), 0, 2))
> + #error "CLKSRCSEL: Value out of range!"
> +#endif
> +
> +#if (CHECK_RSVD((PLL0CFG_Val), ~0x00FF7FFF))
> + #error "PLL0CFG: Invalid values of reserved bits!"
> +#endif
> +
> +#if (CHECK_RSVD((PLL1CFG_Val), ~0x0000007F))
> + #error "PLL1CFG: Invalid values of reserved bits!"
> +#endif
> +
> +#if ((CCLKCFG_Val != 0) && (((CCLKCFG_Val - 1) % 2)))
> + #error "CCLKCFG: CCLKSEL field does not contain only odd values or 0!"
> +#endif
> +
> +#if (CHECK_RSVD((USBCLKCFG_Val), ~0x0000000F))
> + #error "USBCLKCFG: Invalid values of reserved bits!"
> +#endif
> +
> +#if (CHECK_RSVD((PCLKSEL0_Val), 0x000C0C00))
> + #error "PCLKSEL0: Invalid values of reserved bits!"
> +#endif
> +
> +#if (CHECK_RSVD((PCLKSEL1_Val), 0x03000300))
> + #error "PCLKSEL1: Invalid values of reserved bits!"
> +#endif
> +
> +#if (CHECK_RSVD((PCONP_Val), 0x10100821))
> + #error "PCONP: Invalid values of reserved bits!"
> +#endif
> +
> +#if (CHECK_RSVD((CLKOUTCFG_Val), ~0x000001FF))
> + #error "CLKOUTCFG: Invalid values of reserved bits!"
> +#endif
> +
> +/* Flash Accelerator Configuration -------------------------------------------*/
> +#if (CHECK_RSVD((FLASHCFG_Val), ~0x0000F07F))
> + #error "FLASHCFG: Invalid values of reserved bits!"
> +#endif
> +
> +
> +/*----------------------------------------------------------------------------
> + DEFINES
> + *----------------------------------------------------------------------------*/
> +
> +/*----------------------------------------------------------------------------
> + Define clocks
> + *----------------------------------------------------------------------------*/
> +#define XTAL (12000000UL) /* Oscillator frequency */
> +#define OSC_CLK ( XTAL) /* Main oscillator frequency */
> +#define RTC_CLK ( 32000UL) /* RTC oscillator frequency */
> +#define IRC_OSC ( 4000000UL) /* Internal RC oscillator frequency */
> +
> +
> +/* F_cco0 = (2 * M * F_in) / N */
> +#define __M (((PLL0CFG_Val ) & 0x7FFF) + 1)
> +#define __N (((PLL0CFG_Val >> 16) & 0x00FF) + 1)
> +#define __FCCO(__F_IN) ((2 * __M * __F_IN) / __N)
> +#define __CCLK_DIV (((CCLKCFG_Val ) & 0x00FF) + 1)
> +
> +/* Determine core clock frequency according to settings */
> + #if (PLL0_SETUP)
> + #if ((CLKSRCSEL_Val & 0x03) == 1)
> + #define __CORE_CLK (__FCCO(OSC_CLK) / __CCLK_DIV)
> + #elif ((CLKSRCSEL_Val & 0x03) == 2)
> + #define __CORE_CLK (__FCCO(RTC_CLK) / __CCLK_DIV)
> + #else
> + #define __CORE_CLK (__FCCO(IRC_OSC) / __CCLK_DIV)
> + #endif
> + #else
> + #if ((CLKSRCSEL_Val & 0x03) == 1)
> + #define __CORE_CLK (OSC_CLK / __CCLK_DIV)
> + #elif ((CLKSRCSEL_Val & 0x03) == 2)
> + #define __CORE_CLK (RTC_CLK / __CCLK_DIV)
> + #else
> + #define __CORE_CLK (IRC_OSC / __CCLK_DIV)
> + #endif
> + #endif
> +
> +
> +/*----------------------------------------------------------------------------
> + Clock Variable definitions
> + *----------------------------------------------------------------------------*/
> +uint32_t SystemCoreClock = __CORE_CLK;/*!< System Clock Frequency (Core Clock)*/
> +
> +
> +/*----------------------------------------------------------------------------
> + Clock functions
> + *----------------------------------------------------------------------------*/
> +void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */
> +{
> + /* Determine clock frequency according to clock register values */
> + if (((LPC_SC->PLL0STAT >> 24) & 3) == 3) { /* If PLL0 enabled and connected */
> + switch (LPC_SC->CLKSRCSEL & 0x03) {
> + case 0: /* Int. RC oscillator => PLL0 */
> + case 3: /* Reserved, default to Int. RC */
> + SystemCoreClock = (IRC_OSC *
> + ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) /
> + (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) /
> + ((LPC_SC->CCLKCFG & 0xFF)+ 1));
> + break;
> + case 1: /* Main oscillator => PLL0 */
> + SystemCoreClock = (OSC_CLK *
> + ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) /
> + (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) /
> + ((LPC_SC->CCLKCFG & 0xFF)+ 1));
> + break;
> + case 2: /* RTC oscillator => PLL0 */
> + SystemCoreClock = (RTC_CLK *
> + ((2 * ((LPC_SC->PLL0STAT & 0x7FFF) + 1))) /
> + (((LPC_SC->PLL0STAT >> 16) & 0xFF) + 1) /
> + ((LPC_SC->CCLKCFG & 0xFF)+ 1));
> + break;
> + }
> + } else {
> + switch (LPC_SC->CLKSRCSEL & 0x03) {
> + case 0: /* Int. RC oscillator => PLL0 */
> + case 3: /* Reserved, default to Int. RC */
> + SystemCoreClock = IRC_OSC / ((LPC_SC->CCLKCFG & 0xFF)+ 1);
> + break;
> + case 1: /* Main oscillator => PLL0 */
> + SystemCoreClock = OSC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1);
> + break;
> + case 2: /* RTC oscillator => PLL0 */
> + SystemCoreClock = RTC_CLK / ((LPC_SC->CCLKCFG & 0xFF)+ 1);
> + break;
> + }
> + }
> +
> +}
> +/* Exported types --------------------------------------------------------------*/
> +/* Exported constants --------------------------------------------------------*/
> +//extern unsigned long _sidata; /* start address for the initialization values of the .data section. defined in linker script */
> +//extern unsigned long _sdata; /* start address for the .data section. defined in linker script */
> +//extern unsigned long _edata; /* end address for the .data section. defined in linker script */
> +//
> +//extern unsigned long _sbss; /* start address for the .bss section. defined in linker script */
> +//extern unsigned long _ebss; /* end address for the .bss section. defined in linker script */
> +
> +//void _init(void)
> +//{
> +// unsigned long *pulSrc, *pulDest;
> +//
> +// //
> +// // Copy the data segment initializers from flash to SRAM in ROM mode
> +// //
> +//#if (__RAM_MODE__==0)
> +// pulSrc = &_sidata;
> +// for(pulDest = &_sdata; pulDest < &_edata; )
> +// {
> +// *(pulDest++) = *(pulSrc++);
> +// }
> +//#endif
> +//
> +//
> +// //
> +// // Zero fill the bss segment.
> +// //
> +// for(pulDest = &_sbss; pulDest < &_ebss; )
> +// {
> +// *(pulDest++) = 0;
> +// }
> +//}
> +
> +/**
> + * Initialize the system
> + *
> + * @param none
> + * @return none
> + *
> + * @brief Setup the microcontroller system.
> + * Initialize the System.
> + */
> +void SystemInit (void)
> +{
> +
> +#if (CLOCK_SETUP) /* Clock Setup */
> + LPC_SC->SCS = SCS_Val;
> + if (SCS_Val & (1 << 5)) { /* If Main Oscillator is enabled */
> + while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready */
> + }
> +
> + LPC_SC->CCLKCFG = CCLKCFG_Val; /* Setup Clock Divider */
> + LPC_SC->PCLKSEL0 = PCLKSEL0_Val; /* Peripheral Clock Selection */
> + LPC_SC->PCLKSEL1 = PCLKSEL1_Val;
> +
> +#if (PLL0_SETUP)
> + LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source for PLL0 */
> +
> + LPC_SC->PLL0CFG = PLL0CFG_Val; /* configure PLL0 */
> + LPC_SC->PLL0FEED = 0xAA;
> + LPC_SC->PLL0FEED = 0x55;
> +
> + LPC_SC->PLL0CON = 0x01; /* PLL0 Enable */
> + LPC_SC->PLL0FEED = 0xAA;
> + LPC_SC->PLL0FEED = 0x55;
> + while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0 */
> +
> + LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect */
> + LPC_SC->PLL0FEED = 0xAA;
> + LPC_SC->PLL0FEED = 0x55;
> + while (!(LPC_SC->PLL0STAT & ((1<<25) | (1<<24))));/* Wait for PLLC0_STAT & PLLE0_STAT */
> +#endif
> +
> +#if (PLL1_SETUP)
> + LPC_SC->PLL1CFG = PLL1CFG_Val;
> + LPC_SC->PLL1FEED = 0xAA;
> + LPC_SC->PLL1FEED = 0x55;
> +
> + LPC_SC->PLL1CON = 0x01; /* PLL1 Enable */
> + LPC_SC->PLL1FEED = 0xAA;
> + LPC_SC->PLL1FEED = 0x55;
> + while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1 */
> +
> + LPC_SC->PLL1CON = 0x03; /* PLL1 Enable & Connect */
> + LPC_SC->PLL1FEED = 0xAA;
> + LPC_SC->PLL1FEED = 0x55;
> + while (!(LPC_SC->PLL1STAT & ((1<< 9) | (1<< 8))));/* Wait for PLLC1_STAT & PLLE1_STAT */
> +#else
> + LPC_SC->USBCLKCFG = USBCLKCFG_Val; /* Setup USB Clock Divider */
> +#endif
> + LPC_SC->PCONP = PCONP_Val; /* Power Control for Peripherals */
> +
> + LPC_SC->CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */
> +#endif
> +
> +#if (FLASH_SETUP == 1) /* Flash Accelerator Setup */
> + LPC_SC->FLASHCFG = FLASHCFG_Val;
> +#endif
> +}
> diff --git a/arch/arm/mach-lpc17cmsis/libs/system/system_LPC17xx.h b/arch/arm/mach-lpc17cmsis/libs/system/system_LPC17xx.h
> new file mode 100644
> index 0000000..5a78d33
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/system/system_LPC17xx.h
> @@ -0,0 +1,63 @@
> +/**************************************************************************//**
> + * @file system_LPC17xx.h
> + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File
> + * for the NXP LPC17xx Device Series
> + * @version V1.02
> + * @date 08. September 2009
> + *
> + * @note
> + * Copyright (C) 2009 ARM Limited. All rights reserved.
> + *
> + * @par
> + * ARM Limited (ARM) is supplying this software for use with Cortex-M
> + * processor based microcontrollers. This file can be freely distributed
> + * within development tools that are supporting such ARM based processors.
> + *
> + * @par
> + * 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.
> + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
> + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
> + *
> + ******************************************************************************/
> +
> +
> +#ifndef __SYSTEM_LPC17xx_H
> +#define __SYSTEM_LPC17xx_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include <stdint.h>
> +
> +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */
> +
> +
> +/**
> + * Initialize the system
> + *
> + * @param none
> + * @return none
> + *
> + * @brief Setup the microcontroller system.
> + * Initialize the System and update the SystemCoreClock variable.
> + */
> +extern void SystemInit (void);
> +
> +/**
> + * Update SystemCoreClock variable
> + *
> + * @param none
> + * @return none
> + *
> + * @brief Updates the SystemCoreClock with current core Clock
> + * retrieved from cpu registers.
> + */
> +extern void SystemCoreClockUpdate (void);
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* __SYSTEM_LPC17xx_H */
> diff --git a/arch/arm/mach-lpc17cmsis/libs/uart/Makefile b/arch/arm/mach-lpc17cmsis/libs/uart/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/uart/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/uart/Makefile.omk b/arch/arm/mach-lpc17cmsis/libs/uart/Makefile.omk
> new file mode 100644
> index 0000000..b9a2b22
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/uart/Makefile.omk
> @@ -0,0 +1,12 @@
> +# -*- makefile -*-
> +
> +lib_LIBRARIES = uart
> +
> +uart_SOURCES = lpc17xx_uart.c
> +#uart_LIBS = clkpwr
> +LOADLIBES = clkpwr
> +
> +
> +include_HEADERS = lpc17xx_uart.h
> +
> +
> diff --git a/arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.c b/arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.c
> new file mode 100644
> index 0000000..35f0e94
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.c
> @@ -0,0 +1,1538 @@
> +/**.
> + * @file : lpc17xx_uart.c.
> + * @brief : Contains all functions support for UART firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 18. Mar. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **********************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @addtogroup UART.
> + * @{.
> + */.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "lpc17xx_uart.h".
> +#include "lpc17xx_clkpwr.h".
> +.
> +/* If this source file built with example, the LPC17xx FW library configuration.
> + * file in each example directory ("lpc17xx_libcfg.h") must be included,.
> + * otherwise the default FW library configuration file must be included instead.
> + */.
> +#ifdef __BUILD_WITH_EXAMPLE__.
> +#include "lpc17xx_libcfg.h".
> +#else.
> +#include "lpc17xx_libcfg_default.h".
> +#endif /* __BUILD_WITH_EXAMPLE__ */.
> +.
> +.
> +#ifdef _UART.
> +.
> +/* Private Types -------------------------------------------------------------- */.
> +/** @defgroup UART_Private_Types.
> + * @{.
> + */.
> +.
> +/**.
> + * @brief UART call-back function type definitions.
> + */.
> +typedef struct {.
> + fnTxCbs_Type *pfnTxCbs; // Transmit callback.
> + fnRxCbs_Type *pfnRxCbs; // Receive callback.
> + fnABCbs_Type *pfnABCbs; // Auto-Baudrate callback.
> + fnErrCbs_Type *pfnErrCbs; // Error callback.
> +} UART_CBS_Type;.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Private Variables ---------------------------------------------------------- */.
> +/** @defgroup UART_Private_Variables.
> + * @{.
> + */.
> +.
> +.
> +/** Call-back function pointer data */.
> +UART_CBS_Type uartCbsDat[4] = {.
> + {NULL, NULL, NULL, NULL},.
> + {NULL, NULL, NULL, NULL},.
> + {NULL, NULL, NULL, NULL},.
> + {NULL, NULL, NULL, NULL},.
> +};.
> +.
> +/** UART1 modem status interrupt callback pointer data */.
> +fnModemCbs_Type *pfnModemCbs = NULL;.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Private Functions ---------------------------------------------------------- */.
> +/** @defgroup UART_Private_Functions.
> + * @{.
> + */.
> +.
> +/**.
> + * @brief Get UART number due to UART peripheral pointer.
> + * @param[in] UARTx UART pointer.
> + * @return UART number.
> + */.
> +uint8_t getUartNum(LPC_UART_TypeDef *UARTx) {.
> + if (UARTx == LPC_UART0) return (0);.
> + else if (UARTx == (LPC_UART_TypeDef *)LPC_UART1) return (1);.
> + else if (UARTx == LPC_UART2) return (2);.
> + else return (3);.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Determines best dividers to get a target clock rate.
> + * @param[in] UARTx Pointer to selected UART peripheral, should be.
> + * UART0, UART1, UART2 or UART3..
> + * @param[in] baudrate Desired UART baud rate..
> + * @return Error status..
> + **********************************************************************/.
> +.
> +Status uart_set_divisors(LPC_UART_TypeDef *UARTx, uint32_t baudrate).
> +{.
> + Status errorStatus = ERROR;.
> +.
> + uint32_t uClk;.
> + uint32_t calcBaudrate = 0;.
> + uint32_t temp = 0;.
> +.
> + uint32_t mulFracDiv, dividerAddFracDiv;.
> + uint32_t diviser = 0 ;.
> + uint32_t mulFracDivOptimal = 1;.
> + uint32_t dividerAddOptimal = 0;.
> + uint32_t diviserOptimal = 0;.
> +.
> + uint32_t relativeError = 0;.
> + uint32_t relativeOptimalError = 100000;.
> +.
> + /* get UART block clock */.
> + if (UARTx == LPC_UART0).
> + {.
> + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART0);.
> + }.
> + else if (UARTx == (LPC_UART_TypeDef *)LPC_UART1).
> + {.
> + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART1);.
> + }.
> + else if (UARTx == LPC_UART2).
> + {.
> + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART2);.
> + }.
> + else if (UARTx == LPC_UART3).
> + {.
> + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART3);.
> + }.
> +.
> +.
> + uClk = uClk >> 4; /* div by 16 */.
> + /* In the Uart IP block, baud rate is calculated using FDR and DLL-DLM registers.
> + * The formula is :.
> + * BaudRate= uClk * (mulFracDiv/(mulFracDiv+dividerAddFracDiv) / (16 * (DLL).
> + * It involves floating point calculations. That's the reason the formulae are adjusted with.
> + * Multiply and divide method.*/.
> + /* The value of mulFracDiv and dividerAddFracDiv should comply to the following expressions:.
> + * 0 < mulFracDiv <= 15, 0 <= dividerAddFracDiv <= 15 */.
> + for (mulFracDiv = 1 ; mulFracDiv <= 15 ;mulFracDiv++).
> + {.
> + for (dividerAddFracDiv = 0 ; dividerAddFracDiv <= 15 ;dividerAddFracDiv++).
> + {.
> + temp = (mulFracDiv * uClk) / ((mulFracDiv + dividerAddFracDiv));.
> +.
> + diviser = temp / baudrate;.
> + if ((temp % baudrate) > (baudrate / 2)).
> + diviser++;.
> +.
> + if (diviser > 2 && diviser < 65536).
> + {.
> + calcBaudrate = temp / diviser;.
> +.
> + if (calcBaudrate <= baudrate).
> + relativeError = baudrate - calcBaudrate;.
> + else.
> + relativeError = calcBaudrate - baudrate;.
> +.
> + if ((relativeError < relativeOptimalError)).
> + {.
> + mulFracDivOptimal = mulFracDiv ;.
> + dividerAddOptimal = dividerAddFracDiv;.
> + diviserOptimal = diviser;.
> + relativeOptimalError = relativeError;.
> + if (relativeError == 0).
> + break;.
> + }.
> + } /* End of if */.
> + } /* end of inner for loop */.
> + if (relativeError == 0).
> + break;.
> + } /* end of outer for loop */.
> +.
> + if (relativeOptimalError < ((baudrate * UART_ACCEPTED_BAUDRATE_ERROR)/100)).
> + {.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN;.
> + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/DLM = UART_LOAD_DLM(diviserOptimal);.
> + ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/DLL = UART_LOAD_DLL(diviserOptimal);.
> + /* Then reset DLAB bit */.
> + ((LPC_UART1_TypeDef *)UARTx)->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK;.
> + ((LPC_UART1_TypeDef *)UARTx)->FDR = (UART_FDR_MULVAL(mulFracDivOptimal) \.
> + | UART_FDR_DIVADDVAL(dividerAddOptimal)) & UART_FDR_BITMASK;.
> + }.
> + else.
> + {.
> + UARTx->LCR |= UART_LCR_DLAB_EN;.
> + UARTx->/*DLIER.*/DLM = UART_LOAD_DLM(diviserOptimal);.
> + UARTx->/*RBTHDLR.*/DLL = UART_LOAD_DLL(diviserOptimal);.
> + /* Then reset DLAB bit */.
> + UARTx->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK;.
> + UARTx->FDR = (UART_FDR_MULVAL(mulFracDivOptimal) \.
> + | UART_FDR_DIVADDVAL(dividerAddOptimal)) & UART_FDR_BITMASK;.
> + }.
> + errorStatus = SUCCESS;.
> + }.
> +.
> + return errorStatus;.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief General UART interrupt handler and router.
> + * @param[in] UARTx Selected UART peripheral, should be UART0..3.
> + * @return None.
> + *.
> + * Note:.
> + * - Handles transmit, receive, and status interrupts for the UART..
> + * Based on the interrupt status, routes the interrupt to the.
> + * respective call-back to be handled by the user application using.
> + * this driver..
> + * - If callback is not installed, corresponding interrupt will be disabled.
> + * - All these interrupt source below will be checked:.
> + * - Transmit Holding Register Empty..
> + * - Received Data Available and Character Time Out..
> + * - Receive Line Status (not implemented).
> + * - End of auto-baud interrupt (not implemented).
> + * - Auto-Baudrate Time-Out interrupt (not implemented).
> + * - Modem Status interrupt (UART0 Modem functionality).
> + * - CTS signal transition interrupt (UART0 Modem functionality).
> + **********************************************************************/.
> +void UART_GenIntHandler(LPC_UART_TypeDef *UARTx).
> +{.
> + uint8_t pUart, modemsts;.
> + uint32_t intsrc, tmp, tmp1;.
> +.
> + pUart = getUartNum(UARTx);.
> +.
> + /* Determine the interrupt source */.
> + intsrc = UARTx->IIR;.
> + tmp = intsrc & UART_IIR_INTID_MASK;.
> +.
> + /*.
> + * In case of using UART1 with full modem,.
> + * interrupt ID = 0 that means modem status interrupt has been detected.
> + */.
> + if (pUart == 1) {.
> + if (tmp == 0){.
> + // Check Modem status.
> + modemsts = LPC_UART1->MSR & UART1_MSR_BITMASK;.
> + // Call modem status call-back.
> + if (pfnModemCbs != NULL){.
> + pfnModemCbs(modemsts);.
> + }.
> + // disable modem status interrupt and CTS status change interrupt.
> + // if its callback is not installed.
> + else {.
> + LPC_UART1->IER &= ~(UART1_IER_MSINT_EN | UART1_IER_CTSINT_EN);.
> + }.
> + }.
> + }.
> +.
> + // Receive Line Status.
> + if (tmp == UART_IIR_INTID_RLS){.
> + // Check line status.
> + tmp1 = UARTx->LSR;.
> + // Mask out the Receive Ready and Transmit Holding empty status.
> + tmp1 &= (UART_LSR_OE | UART_LSR_PE | UART_LSR_FE \.
> + | UART_LSR_BI | UART_LSR_RXFE);.
> + // If any error exist.
> + if (tmp1) {.
> + // Call Call-back function with error input value.
> + if (uartCbsDat[pUart].pfnErrCbs != NULL) {.
> + uartCbsDat[pUart].pfnErrCbs(tmp1);.
> + }.
> + // Disable interrupt if its call-back is not install.
> + else {.
> + UARTx->IER &= ~(UART_IER_RLSINT_EN);.
> + }.
> + }.
> + }.
> +.
> + // Receive Data Available or Character time-out.
> + if ((tmp == UART_IIR_INTID_RDA) || (tmp == UART_IIR_INTID_CTI)){.
> + // Call Rx call back function.
> + if (uartCbsDat[pUart].pfnRxCbs != NULL) {.
> + uartCbsDat[pUart].pfnRxCbs();.
> + }.
> + // Disable interrupt if its call-back is not install.
> + else {.
> + UARTx->IER &= ~(UART_IER_RBRINT_EN);.
> + }.
> + }.
> +.
> + // Transmit Holding Empty.
> + if (tmp == UART_IIR_INTID_THRE){.
> + // Call Tx call back function.
> + if (uartCbsDat[pUart].pfnTxCbs != NULL) {.
> + uartCbsDat[pUart].pfnTxCbs();.
> + }.
> + // Disable interrupt if its call-back is not install.
> + else {.
> + UARTx->IER &= ~(UART_IER_THREINT_EN);.
> + }.
> + }.
> +.
> + intsrc &= (UART_IIR_ABEO_INT | UART_IIR_ABTO_INT);.
> + // Check if End of auto-baudrate interrupt or Auto baudrate time out.
> + if (intsrc){.
> + // Clear interrupt pending.
> + UARTx->ACR |= ((intsrc & UART_IIR_ABEO_INT) ? UART_ACR_ABEOINT_CLR : 0) \.
> + | ((intsrc & UART_IIR_ABTO_INT) ? UART_ACR_ABTOINT_CLR : 0);.
> + if (uartCbsDat[pUart].pfnABCbs != NULL) {.
> + uartCbsDat[pUart].pfnABCbs(intsrc);.
> + } else {.
> + // Disable End of AB interrupt.
> + UARTx->IER &= ~(UART_IER_ABEOINT_EN | UART_IER_ABTOINT_EN);.
> + }.
> + }.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @addtogroup UART_Public_Functions.
> + * @{.
> + */.
> +.
> +/*********************************************************************//**.
> + * @brief De-initializes the UARTx peripheral registers to their.
> +* default reset values..
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @return None.
> + **********************************************************************/.
> +void UART_DeInit(LPC_UART_TypeDef* UARTx).
> +{.
> + // For debug mode.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> +.
> + UART_TxCmd(UARTx, DISABLE);.
> +.
> +#ifdef _UART0.
> + if (UARTx == LPC_UART0).
> + {.
> + /* Set up clock and power for UART module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART0, DISABLE);.
> + }.
> +#endif.
> +.
> +#ifdef _UART1.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + /* Set up clock and power for UART module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART1, DISABLE);.
> + }.
> +#endif.
> +.
> +#ifdef _UART2.
> + if (UARTx == LPC_UART2).
> + {.
> + /* Set up clock and power for UART module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, DISABLE);.
> + }.
> +#endif.
> +.
> +#ifdef _UART3.
> + if (UARTx == LPC_UART3).
> + {.
> + /* Set up clock and power for UART module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART3, DISABLE);.
> + }.
> +#endif.
> +}.
> +.
> +/********************************************************************//**.
> + * @brief Initializes the UARTx peripheral according to the specified.
> +* parameters in the UART_ConfigStruct..
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @param[in] UART_ConfigStruct Pointer to a UART_CFG_Type structure.
> +* that contains the configuration information for the.
> +* specified UART peripheral..
> + * @return None.
> + *********************************************************************/.
> +void UART_Init(LPC_UART_TypeDef *UARTx, UART_CFG_Type *UART_ConfigStruct).
> +{.
> + uint32_t tmp;.
> +.
> + // For debug mode.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> + CHECK_PARAM(PARAM_UART_DATABIT(UART_ConfigStruct->Databits));.
> + CHECK_PARAM(PARAM_UART_STOPBIT(UART_ConfigStruct->Stopbits));.
> + CHECK_PARAM(PARAM_UART_PARITY(UART_ConfigStruct->Parity));.
> +.
> +#ifdef _UART0.
> + if(UARTx == LPC_UART0).
> + {.
> + /* Set up clock and power for UART module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART0, ENABLE);.
> + }.
> +#endif.
> +.
> +#ifdef _UART1.
> + if(((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + /* Set up clock and power for UART module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART1, ENABLE);.
> + }.
> +#endif.
> +.
> +#ifdef _UART2.
> + if(UARTx == LPC_UART2).
> + {.
> + /* Set up clock and power for UART module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, ENABLE);.
> + }.
> +#endif.
> +.
> +#ifdef _UART3.
> + if(UARTx == LPC_UART3).
> + {.
> + /* Set up clock and power for UART module */.
> + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART3, ENABLE);.
> + }.
> +#endif.
> +.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + /* FIFOs are empty */.
> + ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN \.
> + | UART_FCR_RX_RS | UART_FCR_TX_RS);.
> + // Disable FIFO.
> + ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = 0;.
> +.
> + // Dummy reading.
> + while (((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_RDR).
> + {.
> + tmp = ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR;.
> + }.
> +.
> + ((LPC_UART1_TypeDef *)UARTx)->TER = UART_TER_TXEN;.
> + // Wait for current transmit complete.
> + while (!(((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_THRE));.
> + // Disable Tx.
> + ((LPC_UART1_TypeDef *)UARTx)->TER = 0;.
> +.
> + // Disable interrupt.
> + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER = 0;.
> + // Set LCR to default state.
> + ((LPC_UART1_TypeDef *)UARTx)->LCR = 0;.
> + // Set ACR to default state.
> + ((LPC_UART1_TypeDef *)UARTx)->ACR = 0;.
> + // Set Modem Control to default state.
> + ((LPC_UART1_TypeDef *)UARTx)->MCR = 0;.
> + // Set RS485 control to default state.
> + ((LPC_UART1_TypeDef *)UARTx)->RS485CTRL = 0;.
> + // Set RS485 delay timer to default state.
> + ((LPC_UART1_TypeDef *)UARTx)->RS485DLY = 0;.
> + // Set RS485 addr match to default state.
> + ((LPC_UART1_TypeDef *)UARTx)->ADRMATCH = 0;.
> + //Dummy Reading to Clear Status.
> + tmp = ((LPC_UART1_TypeDef *)UARTx)->MSR;.
> + tmp = ((LPC_UART1_TypeDef *)UARTx)->LSR;.
> + }.
> + else.
> + {.
> + /* FIFOs are empty */.
> + UARTx->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS);.
> + // Disable FIFO.
> + UARTx->/*IIFCR.*/FCR = 0;.
> +.
> + // Dummy reading.
> + while (UARTx->LSR & UART_LSR_RDR).
> + {.
> + tmp = UARTx->/*RBTHDLR.*/RBR;.
> + }.
> +.
> + UARTx->TER = UART_TER_TXEN;.
> + // Wait for current transmit complete.
> + while (!(UARTx->LSR & UART_LSR_THRE));.
> + // Disable Tx.
> + UARTx->TER = 0;.
> +.
> + // Disable interrupt.
> + UARTx->/*DLIER.*/IER = 0;.
> + // Set LCR to default state.
> + UARTx->LCR = 0;.
> + // Set ACR to default state.
> + UARTx->ACR = 0;.
> + // Dummy reading.
> + tmp = UARTx->LSR;.
> + }.
> +.
> + if (UARTx == LPC_UART3).
> + {.
> + // Set IrDA to default state.
> + UARTx->ICR = 0;.
> + }.
> +.
> + // Set Line Control register ----------------------------.
> +.
> + uart_set_divisors(UARTx, (UART_ConfigStruct->Baud_rate));.
> +.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + tmp = (((LPC_UART1_TypeDef *)UARTx)->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) \.
> + & UART_LCR_BITMASK;.
> + }.
> + else.
> + {.
> + tmp = (UARTx->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) & UART_LCR_BITMASK;.
> + }.
> +.
> + switch (UART_ConfigStruct->Databits){.
> + case UART_DATABIT_5:.
> + tmp |= UART_LCR_WLEN5;.
> + break;.
> + case UART_DATABIT_6:.
> + tmp |= UART_LCR_WLEN6;.
> + break;.
> + case UART_DATABIT_7:.
> + tmp |= UART_LCR_WLEN7;.
> + break;.
> + case UART_DATABIT_8:.
> + default:.
> + tmp |= UART_LCR_WLEN8;.
> + break;.
> + }.
> +.
> + if (UART_ConfigStruct->Parity == UART_PARITY_NONE).
> + {.
> + // Do nothing....
> + }.
> + else.
> + {.
> + tmp |= UART_LCR_PARITY_EN;.
> + switch (UART_ConfigStruct->Parity).
> + {.
> + case UART_PARITY_ODD:.
> + tmp |= UART_LCR_PARITY_ODD;.
> + break;.
> +.
> + case UART_PARITY_EVEN:.
> + tmp |= UART_LCR_PARITY_EVEN;.
> + break;.
> +.
> + case UART_PARITY_SP_1:.
> + tmp |= UART_LCR_PARITY_F_1;.
> + break;.
> +.
> + case UART_PARITY_SP_0:.
> + tmp |= UART_LCR_PARITY_F_0;.
> + break;.
> + default:.
> + break;.
> + }.
> + }.
> +.
> + switch (UART_ConfigStruct->Stopbits){.
> + case UART_STOPBIT_2:.
> + tmp |= UART_LCR_STOPBIT_SEL;.
> + break;.
> + case UART_STOPBIT_1:.
> + default:.
> + // Do no thing.
> + break;.
> + }.
> +.
> +.
> + // Write back to LCR, configure FIFO and Disable Tx.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->LCR = (uint8_t)(tmp & UART_LCR_BITMASK);.
> + }.
> + else.
> + {.
> + UARTx->LCR = (uint8_t)(tmp & UART_LCR_BITMASK);.
> + }.
> +}.
> +.
> +.
> +/*****************************************************************************//**.
> +* @brief Fills each UART_InitStruct member with its default value:.
> +* 9600 bps.
> +* 8-bit data.
> +* 1 Stopbit.
> +* None Parity.
> +* @param[in] UART_InitStruct Pointer to a UART_CFG_Type structure.
> +* which will be initialized..
> +* @return None.
> +*******************************************************************************/.
> +void UART_ConfigStructInit(UART_CFG_Type *UART_InitStruct).
> +{.
> + UART_InitStruct->Baud_rate = 9600;.
> + UART_InitStruct->Databits = UART_DATABIT_8;.
> + UART_InitStruct->Parity = UART_PARITY_NONE;.
> + UART_InitStruct->Stopbits = UART_STOPBIT_1;.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Transmit a single data through UART peripheral.
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @param[in] Data Data to transmit (must be 8-bit long).
> + * @return none.
> + **********************************************************************/.
> +void UART_SendData(LPC_UART_TypeDef* UARTx, uint8_t Data).
> +{.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> +.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT;.
> + }.
> + else.
> + {.
> + UARTx->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT;.
> + }.
> +.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Receive a single data from UART peripheral.
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @return Data received.
> + **********************************************************************/.
> +uint8_t UART_ReceiveData(LPC_UART_TypeDef* UARTx).
> +{.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> +.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + return (((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT);.
> + }.
> + else.
> + {.
> + return (UARTx->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT);.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Force BREAK character on UART line, output pin UARTx TXD is.
> + forced to logic 0..
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @return none.
> + **********************************************************************/.
> +void UART_ForceBreak(LPC_UART_TypeDef* UARTx).
> +{.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> +.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_BREAK_EN;.
> + }.
> + else.
> + {.
> + UARTx->LCR |= UART_LCR_BREAK_EN;.
> + }.
> +}.
> +.
> +.
> +#ifdef _UART3.
> +.
> +/*********************************************************************//**.
> + * @brief Enable or disable inverting serial input function of IrDA.
> + * on UART peripheral..
> + * @param[in] UARTx UART peripheral selected, should be UART3 (only).
> + * @param[in] NewState New state of inverting serial input, should be:.
> + * - ENABLE: Enable this function..
> + * - DISABLE: Disable this function..
> + * @return none.
> + **********************************************************************/.
> +void UART_IrDAInvtInputCmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_UART_IrDA(UARTx));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + if (NewState == ENABLE).
> + {.
> + UARTx->ICR |= UART_ICR_IRDAINV;.
> + }.
> + else if (NewState == DISABLE).
> + {.
> + UARTx->ICR &= (~UART_ICR_IRDAINV) & UART_ICR_BITMASK;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Enable or disable IrDA function on UART peripheral..
> + * @param[in] UARTx UART peripheral selected, should be UART3 (only).
> + * @param[in] NewState New state of IrDA function, should be:.
> + * - ENABLE: Enable this function..
> + * - DISABLE: Disable this function..
> + * @return none.
> + **********************************************************************/.
> +void UART_IrDACmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_UART_IrDA(UARTx));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + if (NewState == ENABLE).
> + {.
> + UARTx->ICR |= UART_ICR_IRDAEN;.
> + }.
> + else.
> + {.
> + UARTx->ICR &= (~UART_ICR_IRDAEN) & UART_ICR_BITMASK;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Configure Pulse divider for IrDA function on UART peripheral..
> + * @param[in] UARTx UART peripheral selected, should be UART3 (only).
> + * @param[in] PulseDiv Pulse Divider value from Peripheral clock,.
> + * should be one of the following:.
> + - UART_IrDA_PULSEDIV2 : Pulse width = 2 * Tpclk.
> + - UART_IrDA_PULSEDIV4 : Pulse width = 4 * Tpclk.
> + - UART_IrDA_PULSEDIV8 : Pulse width = 8 * Tpclk.
> + - UART_IrDA_PULSEDIV16 : Pulse width = 16 * Tpclk.
> + - UART_IrDA_PULSEDIV32 : Pulse width = 32 * Tpclk.
> + - UART_IrDA_PULSEDIV64 : Pulse width = 64 * Tpclk.
> + - UART_IrDA_PULSEDIV128 : Pulse width = 128 * Tpclk.
> + - UART_IrDA_PULSEDIV256 : Pulse width = 256 * Tpclk.
> +.
> + * @return none.
> + **********************************************************************/.
> +void UART_IrDAPulseDivConfig(LPC_UART_TypeDef *UARTx, UART_IrDA_PULSE_Type PulseDiv).
> +{.
> + uint32_t tmp, tmp1;.
> + CHECK_PARAM(PARAM_UART_IrDA(UARTx));.
> + CHECK_PARAM(PARAM_UART_IrDA_PULSEDIV(PulseDiv));.
> +.
> + tmp1 = UART_ICR_PULSEDIV(PulseDiv);.
> + tmp = UARTx->ICR & (~UART_ICR_PULSEDIV(7));.
> + tmp |= tmp1 | UART_ICR_FIXPULSE_EN;.
> + UARTx->ICR = tmp & UART_ICR_BITMASK;.
> +}.
> +.
> +#endif.
> +.
> +.
> +/********************************************************************//**.
> + * @brief Enable or disable specified UART interrupt..
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @param[in] UARTIntCfg Specifies the interrupt flag,.
> + * should be one of the following:.
> + - UART_INTCFG_RBR : RBR Interrupt enable.
> + - UART_INTCFG_THRE : THR Interrupt enable.
> + - UART_INTCFG_RLS : RX line status interrupt enable.
> + - UART1_INTCFG_MS : Modem status interrupt enable (UART1 only).
> + - UART1_INTCFG_CTS : CTS1 signal transition interrupt enable (UART1 only).
> + - UART_INTCFG_ABEO : Enables the end of auto-baud interrupt.
> + - UART_INTCFG_ABTO : Enables the auto-baud time-out interrupt.
> + * @param[in] NewState New state of specified UART interrupt type,.
> + * should be:.
> + * - ENALBE: Enable this UART interrupt type..
> +* - DISALBE: Disable this UART interrupt type..
> + * @return None.
> + *********************************************************************/.
> +void UART_IntConfig(LPC_UART_TypeDef *UARTx, UART_INT_Type UARTIntCfg, FunctionalState NewState).
> +{.
> + uint32_t tmp;.
> +.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + switch(UARTIntCfg){.
> + case UART_INTCFG_RBR:.
> + tmp = UART_IER_RBRINT_EN;.
> + break;.
> + case UART_INTCFG_THRE:.
> + tmp = UART_IER_THREINT_EN;.
> + break;.
> + case UART_INTCFG_RLS:.
> + tmp = UART_IER_RLSINT_EN;.
> + break;.
> + case UART1_INTCFG_MS:.
> + tmp = UART1_IER_MSINT_EN;.
> + break;.
> + case UART1_INTCFG_CTS:.
> + tmp = UART1_IER_CTSINT_EN;.
> + break;.
> + case UART_INTCFG_ABEO:.
> + tmp = UART_IER_ABEOINT_EN;.
> + break;.
> + case UART_INTCFG_ABTO:.
> + tmp = UART_IER_ABTOINT_EN;.
> + break;.
> + }.
> +.
> + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1).
> + {.
> + CHECK_PARAM((PARAM_UART_INTCFG(UARTIntCfg)) || (PARAM_UART1_INTCFG(UARTIntCfg)));.
> + }.
> + else.
> + {.
> + CHECK_PARAM(PARAM_UART_INTCFG(UARTIntCfg));.
> + }.
> +.
> + if (NewState == ENABLE).
> + {.
> + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1).
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER |= tmp;.
> + }.
> + else.
> + {.
> + UARTx->/*DLIER.*/IER |= tmp;.
> + }.
> + }.
> + else.
> + {.
> + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1).
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER &= (~tmp) & UART1_IER_BITMASK;.
> + }.
> + else.
> + {.
> + UARTx->/*DLIER.*/IER &= (~tmp) & UART_IER_BITMASK;.
> + }.
> + }.
> +}.
> +.
> +.
> +/********************************************************************//**.
> + * @brief Get current value of Line Status register in UART peripheral..
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @return Current value of Line Status register in UART peripheral..
> + * Note: The return value of this function must be ANDed with each member in.
> + * UART_LS_Type enumeration to determine current flag status.
> + * corresponding to each Line status type. Because some flags in.
> + * Line Status register will be cleared after reading, the next reading.
> + * Line Status register could not be correct. So this function used to.
> + * read Line status register in one time only, then the return value.
> + * used to check all flags..
> + *********************************************************************/.
> +uint8_t UART_GetLineStatus(LPC_UART_TypeDef* UARTx).
> +{.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> +.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + return ((((LPC_UART1_TypeDef *)LPC_UART1)->LSR) & UART_LSR_BITMASK);.
> + }.
> + else.
> + {.
> + return ((UARTx->LSR) & UART_LSR_BITMASK);.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Check whether if UART is busy or not.
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @return RESET if UART is not busy, otherwise return SET..
> + **********************************************************************/.
> +FlagStatus UART_CheckBusy(LPC_UART_TypeDef *UARTx).
> +{.
> + if (UARTx->LSR & UART_LSR_TEMT){.
> + return RESET;.
> + } else {.
> + return SET;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Configure FIFO function on selected UART peripheral.
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @param[in] FIFOCfg Pointer to a UART_FIFO_CFG_Type Structure that.
> + * contains specified information about FIFO configuration.
> + * @return none.
> + **********************************************************************/.
> +void UART_FIFOConfig(LPC_UART_TypeDef *UARTx, UART_FIFO_CFG_Type *FIFOCfg).
> +{.
> + uint8_t tmp = 0;.
> +.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> + CHECK_PARAM(PARAM_UART_FIFO_LEVEL(FIFOCfg->FIFO_Level));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_DMAMode));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_ResetRxBuf));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_ResetTxBuf));.
> +.
> + tmp |= UART_FCR_FIFO_EN;.
> + switch (FIFOCfg->FIFO_Level){.
> + case UART_FIFO_TRGLEV0:.
> + tmp |= UART_FCR_TRG_LEV0;.
> + break;.
> + case UART_FIFO_TRGLEV1:.
> + tmp |= UART_FCR_TRG_LEV1;.
> + break;.
> + case UART_FIFO_TRGLEV2:.
> + tmp |= UART_FCR_TRG_LEV2;.
> + break;.
> + case UART_FIFO_TRGLEV3:.
> + default:.
> + tmp |= UART_FCR_TRG_LEV3;.
> + break;.
> + }.
> +.
> + if (FIFOCfg->FIFO_ResetTxBuf == ENABLE).
> + {.
> + tmp |= UART_FCR_TX_RS;.
> + }.
> + if (FIFOCfg->FIFO_ResetRxBuf == ENABLE).
> + {.
> + tmp |= UART_FCR_RX_RS;.
> + }.
> + if (FIFOCfg->FIFO_DMAMode == ENABLE).
> + {.
> + tmp |= UART_FCR_DMAMODE_SEL;.
> + }.
> +.
> +.
> + //write to FIFO control register.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK;.
> + }.
> + else.
> + {.
> + UARTx->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK;.
> + }.
> +.
> +}.
> +.
> +.
> +/*****************************************************************************//**.
> +* @brief Fills each UART_FIFOInitStruct member with its default value:.
> +* - FIFO_DMAMode = DISABLE.
> +* - FIFO_Level = UART_FIFO_TRGLEV0.
> +* - FIFO_ResetRxBuf = ENABLE.
> +* - FIFO_ResetTxBuf = ENABLE.
> +* - FIFO_State = ENABLE.
> +.
> +* @param[in] UART_FIFOInitStruct Pointer to a UART_FIFO_CFG_Type structure.
> +* which will be initialized..
> +* @return None.
> +*******************************************************************************/.
> +void UART_FIFOConfigStructInit(UART_FIFO_CFG_Type *UART_FIFOInitStruct).
> +{.
> + UART_FIFOInitStruct->FIFO_DMAMode = DISABLE;.
> + UART_FIFOInitStruct->FIFO_Level = UART_FIFO_TRGLEV0;.
> + UART_FIFOInitStruct->FIFO_ResetRxBuf = ENABLE;.
> + UART_FIFOInitStruct->FIFO_ResetTxBuf = ENABLE;.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Start/Stop Auto Baudrate activity.
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @param[in] ABConfigStruct A pointer to UART_AB_CFG_Type structure that.
> + * contains specified information about UART.
> + * auto baudrate configuration.
> + * @param[in] NewState New State of Auto baudrate activity, should be:.
> + * - ENABLE: Start this activity.
> + * - DISABLE: Stop this activity.
> + * Note: Auto-baudrate mode enable bit will be cleared once this mode.
> + * completed..
> + * @return none.
> + **********************************************************************/.
> +void UART_ABCmd(LPC_UART_TypeDef *UARTx, UART_AB_CFG_Type *ABConfigStruct, \.
> + FunctionalState NewState).
> +{.
> + uint32_t tmp;.
> +.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + tmp = 0;.
> + if (NewState == ENABLE) {.
> + if (ABConfigStruct->ABMode == UART_AUTOBAUD_MODE1){.
> + tmp |= UART_ACR_MODE;.
> + }.
> + if (ABConfigStruct->AutoRestart == ENABLE){.
> + tmp |= UART_ACR_AUTO_RESTART;.
> + }.
> + }.
> +.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + if (NewState == ENABLE).
> + {.
> + // Clear DLL and DLM value.
> + ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN;.
> + ((LPC_UART1_TypeDef *)UARTx)->DLL = 0;.
> + ((LPC_UART1_TypeDef *)UARTx)->DLM = 0;.
> + ((LPC_UART1_TypeDef *)UARTx)->LCR &= ~UART_LCR_DLAB_EN;.
> + // FDR value must be reset to default value.
> + ((LPC_UART1_TypeDef *)UARTx)->FDR = 0x10;.
> + ((LPC_UART1_TypeDef *)UARTx)->ACR = UART_ACR_START | tmp;.
> + }.
> + else.
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->ACR = 0;.
> + }.
> + }.
> + else.
> + {.
> + if (NewState == ENABLE).
> + {.
> + // Clear DLL and DLM value.
> + UARTx->LCR |= UART_LCR_DLAB_EN;.
> + UARTx->DLL = 0;.
> + UARTx->DLM = 0;.
> + UARTx->LCR &= ~UART_LCR_DLAB_EN;.
> + // FDR value must be reset to default value.
> + UARTx->FDR = 0x10;.
> + UARTx->ACR = UART_ACR_START | tmp;.
> + }.
> + else.
> + {.
> + UARTx->ACR = 0;.
> + }.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Enable/Disable transmission on UART TxD pin.
> + * @param[in] UARTx UART peripheral selected, should be UART0, UART1,.
> + * UART2 or UART3..
> + * @param[in] NewState New State of Tx transmission function, should be:.
> + * - ENABLE: Enable this function.
> + - DISABLE: Disable this function.
> + * @return none.
> + **********************************************************************/.
> +void UART_TxCmd(LPC_UART_TypeDef *UARTx, FunctionalState NewState).
> +{.
> + CHECK_PARAM(PARAM_UARTx(UARTx));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + if (NewState == ENABLE).
> + {.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->TER |= UART_TER_TXEN;.
> + }.
> + else.
> + {.
> + UARTx->TER |= UART_TER_TXEN;.
> + }.
> + }.
> + else.
> + {.
> + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1).
> + {.
> + ((LPC_UART1_TypeDef *)UARTx)->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK;.
> + }.
> + else.
> + {.
> + UARTx->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK;.
> + }.
> + }.
> +}.
> +.
> +#ifdef _UART1.
> +.
> +/*********************************************************************//**.
> + * @brief Force pin DTR/RTS corresponding to given state (Full modem mode).
> + * @param[in] UARTx UART1 (only).
> + * @param[in] Pin Pin that NewState will be applied to, should be:.
> + * - UART1_MODEM_PIN_DTR: DTR pin..
> + * - UART1_MODEM_PIN_RTS: RTS pin..
> + * @param[in] NewState New State of DTR/RTS pin, should be:.
> + * - INACTIVE: Force the pin to inactive signal..
> + - ACTIVE: Force the pin to active signal..
> + * @return none.
> + **********************************************************************/.
> +void UART_FullModemForcePinState(LPC_UART1_TypeDef *UARTx, UART_MODEM_PIN_Type Pin, \.
> + UART1_SignalState NewState).
> +{.
> + uint8_t tmp = 0;.
> +.
> + CHECK_PARAM(PARAM_UART1_MODEM(UARTx));.
> + CHECK_PARAM(PARAM_UART1_MODEM_PIN(Pin));.
> + CHECK_PARAM(PARAM_UART1_SIGNALSTATE(NewState));.
> +.
> + switch (Pin){.
> + case UART1_MODEM_PIN_DTR:.
> + tmp = UART1_MCR_DTR_CTRL;.
> + break;.
> + case UART1_MODEM_PIN_RTS:.
> + tmp = UART1_MCR_RTS_CTRL;.
> + break;.
> + default:.
> + break;.
> + }.
> +.
> + if (NewState == ACTIVE){.
> + UARTx->MCR |= tmp;.
> + } else {.
> + UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Configure Full Modem mode for UART peripheral.
> + * @param[in] UARTx UART1 (only).
> + * @param[in] Mode Full Modem mode, should be:.
> + * - UART1_MODEM_MODE_LOOPBACK: Loop back mode..
> + * - UART1_MODEM_MODE_AUTO_RTS: Auto-RTS mode..
> + * - UART1_MODEM_MODE_AUTO_CTS: Auto-CTS mode..
> + * @param[in] NewState New State of this mode, should be:.
> + * - ENABLE: Enable this mode..
> + - DISABLE: Disable this mode..
> + * @return none.
> + **********************************************************************/.
> +void UART_FullModemConfigMode(LPC_UART1_TypeDef *UARTx, UART_MODEM_MODE_Type Mode, \.
> + FunctionalState NewState).
> +{.
> + uint8_t tmp;.
> +.
> + CHECK_PARAM(PARAM_UART1_MODEM(UARTx));.
> + CHECK_PARAM(PARAM_UART1_MODEM_MODE(Mode));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));.
> +.
> + switch(Mode){.
> + case UART1_MODEM_MODE_LOOPBACK:.
> + tmp = UART1_MCR_LOOPB_EN;.
> + break;.
> + case UART1_MODEM_MODE_AUTO_RTS:.
> + tmp = UART1_MCR_AUTO_RTS_EN;.
> + break;.
> + case UART1_MODEM_MODE_AUTO_CTS:.
> + tmp = UART1_MCR_AUTO_CTS_EN;.
> + break;.
> + default:.
> + break;.
> + }.
> +.
> + if (NewState == ENABLE).
> + {.
> + UARTx->MCR |= tmp;.
> + }.
> + else.
> + {.
> + UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK;.
> + }.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Get current status of modem status register.
> + * @param[in] UARTx UART1 (only).
> + * @return Current value of modem status register.
> + * Note: The return value of this function must be ANDed with each member.
> + * UART_MODEM_STAT_type enumeration to determine current flag status.
> + * corresponding to each modem flag status. Because some flags in.
> + * modem status register will be cleared after reading, the next reading.
> + * modem register could not be correct. So this function used to.
> + * read modem status register in one time only, then the return value.
> + * used to check all flags..
> + **********************************************************************/.
> +uint8_t UART_FullModemGetStatus(LPC_UART1_TypeDef *UARTx).
> +{.
> + CHECK_PARAM(PARAM_UART1_MODEM(UARTx));.
> + return ((UARTx->MSR) & UART1_MSR_BITMASK);.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Configure UART peripheral in RS485 mode according to the specified.
> +* parameters in the RS485ConfigStruct..
> + * @param[in] UARTx UART1 (only).
> + * @param[in] RS485ConfigStruct Pointer to a UART1_RS485_CTRLCFG_Type structure.
> +* that contains the configuration information for specified UART.
> +* in RS485 mode..
> + * @return None.
> + **********************************************************************/.
> +void UART_RS485Config(LPC_UART1_TypeDef *UARTx, UART1_RS485_CTRLCFG_Type *RS485ConfigStruct).
> +{.
> + uint32_t tmp;.
> +.
> + CHECK_PARAM(PARAM_UART1_MODEM(UARTx));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->AutoAddrDetect_State));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->AutoDirCtrl_State));.
> + CHECK_PARAM(PARAM_UART1_RS485_CFG_DELAYVALUE(RS485ConfigStruct->DelayValue));.
> + CHECK_PARAM(PARAM_SETSTATE(RS485ConfigStruct->DirCtrlPol_Level));.
> + CHECK_PARAM(PARAM_UART_RS485_DIRCTRL_PIN(RS485ConfigStruct->DirCtrlPin));.
> + CHECK_PARAM(PARAM_UART1_RS485_CFG_MATCHADDRVALUE(RS485ConfigStruct->MatchAddrValue));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->NormalMultiDropMode_State));.
> + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->Rx_State));.
> +.
> + tmp = 0;.
> + // If Auto Direction Control is enabled - This function is used in Master mode.
> + if (RS485ConfigStruct->AutoDirCtrl_State == ENABLE).
> + {.
> + tmp |= UART1_RS485CTRL_DCTRL_EN;.
> +.
> + // Set polar.
> + if (RS485ConfigStruct->DirCtrlPol_Level == SET).
> + {.
> + tmp |= UART1_RS485CTRL_OINV_1;.
> + }.
> +.
> + // Set pin according to.
> + if (RS485ConfigStruct->DirCtrlPin == UART1_RS485_DIRCTRL_DTR).
> + {.
> + tmp |= UART1_RS485CTRL_SEL_DTR;.
> + }.
> +.
> + // Fill delay time.
> + UARTx->RS485DLY = RS485ConfigStruct->DelayValue & UART1_RS485DLY_BITMASK;.
> + }.
> +.
> + // MultiDrop mode is enable.
> + if (RS485ConfigStruct->NormalMultiDropMode_State == ENABLE).
> + {.
> + tmp |= UART1_RS485CTRL_NMM_EN;.
> + }.
> +.
> + // Auto Address Detect function.
> + if (RS485ConfigStruct->AutoAddrDetect_State == ENABLE).
> + {.
> + tmp |= UART1_RS485CTRL_AADEN;.
> + // Fill Match Address.
> + UARTx->ADRMATCH = RS485ConfigStruct->MatchAddrValue & UART1_RS485ADRMATCH_BITMASK;.
> + }.
> +.
> +.
> + // Receiver is disable.
> + if (RS485ConfigStruct->Rx_State == DISABLE).
> + {.
> + tmp |= UART1_RS485CTRL_RX_DIS;.
> + }.
> +.
> + // write back to RS485 control register.
> + UARTx->RS485CTRL = tmp & UART1_RS485CTRL_BITMASK;.
> +.
> + // Enable Parity function and leave parity in stick '0' parity as default.
> + UARTx->LCR |= (UART_LCR_PARITY_F_0 | UART_LCR_PARITY_EN);.
> +}.
> +.
> +.
> +/**.
> + * @brief Enable/Disable receiver in RS485 module in UART1.
> + * @param[in] UARTx UART1 only..
> + * @param[in] NewState New State of command, should be:.
> + * - ENABLE: Enable this function..
> + * - DISABLE: Disable this function..
> + * @return None.
> + */.
> +void UART_RS485ReceiverCmd(LPC_UART1_TypeDef *UARTx, FunctionalState NewState).
> +{.
> + if (NewState == ENABLE){.
> + UARTx->RS485CTRL &= ~UART1_RS485CTRL_RX_DIS;.
> + } else {.
> + UARTx->RS485CTRL |= UART1_RS485CTRL_RX_DIS;.
> + }.
> +}.
> +.
> +.
> +/**.
> + * @brief Send data on RS485 bus with specified parity stick value (9-bit mode)..
> + * @param[in] UARTx UART1 (only)..
> + * @param[in] pDatFrm Pointer to data frame..
> + * @param[in] size Size of data..
> + * @param[in] ParityStick Parity Stick value, should be 0 or 1..
> + * @return None..
> + */.
> +uint32_t UART_RS485Send(LPC_UART1_TypeDef *UARTx, uint8_t *pDatFrm, \.
> + uint32_t size, uint8_t ParityStick).
> +{.
> + uint8_t tmp, save;.
> + uint32_t cnt;.
> +.
> + if (ParityStick){.
> + save = tmp = UARTx->LCR & UART_LCR_BITMASK;.
> + tmp &= ~(UART_LCR_PARITY_EVEN);.
> + UARTx->LCR = tmp;.
> + cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING);.
> + while (!(UARTx->LSR & UART_LSR_TEMT));.
> + UARTx->LCR = save;.
> + } else {.
> + cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING);.
> + while (!(UARTx->LSR & UART_LSR_TEMT));.
> + }.
> + return cnt;.
> +}.
> +.
> +.
> +/**.
> + * @brief Send Slave address frames on RS485 bus..
> + * @param[in] UARTx UART1 (only)..
> + * @param[in] SlvAddr Slave Address..
> + * @return None..
> + */.
> +void UART_RS485SendSlvAddr(LPC_UART1_TypeDef *UARTx, uint8_t SlvAddr).
> +{.
> + UART_RS485Send(UARTx, &SlvAddr, 1, 1);.
> +}.
> +.
> +.
> +/**.
> + * @brief Send Data frames on RS485 bus..
> + * @param[in] UARTx UART1 (only)..
> + * @param[in] pData Pointer to data to be sent..
> + * @param[in] size Size of data frame to be sent..
> + * @return None..
> + */.
> +uint32_t UART_RS485SendData(LPC_UART1_TypeDef *UARTx, uint8_t *pData, uint32_t size).
> +{.
> + return (UART_RS485Send(UARTx, pData, size, 0));.
> +}.
> +.
> +#endif /* _UART1 */.
> +.
> +.
> +/* Additional driver APIs ----------------------------------------------------------------------- */.
> +.
> +/*********************************************************************//**.
> + * @brief Send a block of data via UART peripheral.
> + * @param[in] UARTx Selected UART peripheral used to send data,.
> + * should be UART0, UART1, UART2 or UART3..
> + * @param[in] txbuf Pointer to Transmit buffer.
> + * @param[in] buflen Length of Transmit buffer.
> + * @param[in] flag Flag used in UART transfer, should be.
> + * NONE_BLOCKING or BLOCKING.
> + * @return Number of bytes sent..
> + *.
> + * Note: when using UART in BLOCKING mode, a time-out condition is used.
> + * via defined symbol UART_BLOCKING_TIMEOUT..
> + **********************************************************************/.
> +uint32_t UART_Send(LPC_UART_TypeDef *UARTx, uint8_t *txbuf,.
> + uint32_t buflen, TRANSFER_BLOCK_Type flag).
> +{.
> + uint32_t bToSend, bSent, timeOut, fifo_cnt;.
> + uint8_t *pChar = txbuf;.
> +.
> + bToSend = buflen;.
> +.
> + // blocking mode.
> + if (flag == BLOCKING) {.
> + bSent = 0;.
> + while (bToSend){.
> + timeOut = UART_BLOCKING_TIMEOUT;.
> + // Wait for THR empty with timeout.
> + while (!(UARTx->LSR & UART_LSR_THRE)) {.
> + if (timeOut == 0) break;.
> + timeOut--;.
> + }.
> + // Time out!.
> + if(timeOut == 0) break;.
> + fifo_cnt = UART_TX_FIFO_SIZE;.
> + while (fifo_cnt && bToSend){.
> + UART_SendData(UARTx, (*pChar++));.
> + fifo_cnt--;.
> + bToSend--;.
> + bSent++;.
> + }.
> + }.
> + }.
> + // None blocking mode.
> + else {.
> + bSent = 0;.
> + while (bToSend) {.
> + if (!(UARTx->LSR & UART_LSR_THRE)){.
> + break;.
> + }.
> + fifo_cnt = UART_TX_FIFO_SIZE;.
> + while (fifo_cnt && bToSend) {.
> + UART_SendData(UARTx, (*pChar++));.
> + bToSend--;.
> + fifo_cnt--;.
> + bSent++;.
> + }.
> + }.
> + }.
> + return bSent;.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Receive a block of data via UART peripheral.
> + * @param[in] UARTx Selected UART peripheral used to send data,.
> + * should be UART0, UART1, UART2 or UART3..
> + * @param[out] rxbuf Pointer to Received buffer.
> + * @param[in] buflen Length of Received buffer.
> + * @param[in] flag Flag mode, should be NONE_BLOCKING or BLOCKING.
> +.
> + * @return Number of bytes received.
> + *.
> + * Note: when using UART in BLOCKING mode, a time-out condition is used.
> + * via defined symbol UART_BLOCKING_TIMEOUT..
> + **********************************************************************/.
> +uint32_t UART_Receive(LPC_UART_TypeDef *UARTx, uint8_t *rxbuf, \.
> + uint32_t buflen, TRANSFER_BLOCK_Type flag).
> +{.
> + uint32_t bToRecv, bRecv, timeOut;.
> + uint8_t *pChar = rxbuf;.
> +.
> + bToRecv = buflen;.
> +.
> + // Blocking mode.
> + if (flag == BLOCKING) {.
> + bRecv = 0;.
> + while (bToRecv){.
> + timeOut = UART_BLOCKING_TIMEOUT;.
> + while (!(UARTx->LSR & UART_LSR_RDR)){.
> + if (timeOut == 0) break;.
> + timeOut--;.
> + }.
> + // Time out!.
> + if(timeOut == 0) break;.
> + // Get data from the buffer.
> + (*pChar++) = UART_ReceiveData(UARTx);.
> + bToRecv--;.
> + bRecv++;.
> + }.
> + }.
> + // None blocking mode.
> + else {.
> + bRecv = 0;.
> + while (bToRecv) {.
> + if (!(UARTx->LSR & UART_LSR_RDR)) {.
> + break;.
> + } else {.
> + (*pChar++) = UART_ReceiveData(UARTx);.
> + bRecv++;.
> + bToRecv--;.
> + }.
> + }.
> + }.
> + return bRecv;.
> +}.
> +.
> +.
> +/*********************************************************************//**.
> + * @brief Setup call-back function for UART interrupt handler for each.
> + * UART peripheral.
> + * @param[in] UARTx Selected UART peripheral, should be UART0..3.
> + * @param[in] CbType Call-back type, should be:.
> + * 0 - Receive Call-back.
> + * 1 - Transmit Call-back.
> + * 2 - Auto Baudrate Callback.
> + * 3 - Error Call-back.
> + * 4 - Modem Status Call-back (UART1 only).
> + * @param[in] pfnCbs Pointer to Call-back function.
> + * @return None.
> + **********************************************************************/.
> +void UART_SetupCbs(LPC_UART_TypeDef *UARTx, uint8_t CbType, void *pfnCbs).
> +{.
> + uint8_t pUartNum;.
> +.
> + pUartNum = getUartNum(UARTx);.
> + switch(CbType){.
> + case 0:.
> + uartCbsDat[pUartNum].pfnRxCbs = (fnTxCbs_Type *)pfnCbs;.
> + break;.
> + case 1:.
> + uartCbsDat[pUartNum].pfnTxCbs = (fnRxCbs_Type *)pfnCbs;.
> + break;.
> + case 2:.
> + uartCbsDat[pUartNum].pfnABCbs = (fnABCbs_Type *)pfnCbs;.
> + break;.
> + case 3:.
> + uartCbsDat[pUartNum].pfnErrCbs = (fnErrCbs_Type *)pfnCbs;.
> + break;.
> + case 4:.
> + pfnModemCbs = (fnModemCbs_Type *)pfnCbs;.
> + break;.
> + default:.
> + break;.
> + }.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Standard UART0 interrupt handler.
> + * @param[in] None.
> + * @return None.
> + **********************************************************************/.
> +void UART0_StdIntHandler(void).
> +{.
> + UART_GenIntHandler(LPC_UART0);.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Standard UART1 interrupt handler.
> + * @param[in] None.
> + * @return None.
> + **********************************************************************/.
> +void UART1_StdIntHandler(void).
> +{.
> + UART_GenIntHandler((LPC_UART_TypeDef *)LPC_UART1);.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Standard UART2 interrupt handler.
> + * @param[in] None.
> + * @return None.
> + **********************************************************************/.
> +void UART2_StdIntHandler(void).
> +{.
> + UART_GenIntHandler(LPC_UART2);.
> +}.
> +.
> +/*********************************************************************//**.
> + * @brief Standard UART3 interrupt handler.
> + * @param[in] None.
> + * @return.
> + **********************************************************************/.
> +void UART3_StdIntHandler(void).
> +{.
> + UART_GenIntHandler(LPC_UART3);.
> +}.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +#endif /* _UART */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> +.
> diff --git a/arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.h b/arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.h
> new file mode 100644
> index 0000000..84128e2
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/libs/uart/lpc17xx_uart.h
> @@ -0,0 +1,633 @@
> +/***********************************************************************//**.
> + * @file : lpc17xx_uart.h.
> + * @brief : Contains all macro definitions and function prototypes.
> + * support for UART firmware library on LPC17xx.
> + * @version : 1.0.
> + * @date : 18. Mar. 2009.
> + * @author : HieuNguyen.
> + **************************************************************************.
> + * 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..
> + * NXP Semiconductors 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. NXP Semiconductors.
> + * reserves the right to make changes in the software without.
> + * notification. NXP Semiconductors also make no representation or.
> + * warranty that such application will be suitable for the specified.
> + * use without further testing or modification..
> + **************************************************************************/.
> +.
> +/* Peripheral group ----------------------------------------------------------- */.
> +/** @defgroup UART.
> + * @ingroup LPC1700CMSIS_FwLib_Drivers.
> + * @{.
> + */.
> +.
> +#ifndef __LPC17XX_UART_H.
> +#define __LPC17XX_UART_H.
> +.
> +/* Includes ------------------------------------------------------------------- */.
> +#include "LPC17xx.h".
> +#include "lpc_types.h".
> +.
> +.
> +#ifdef __cplusplus.
> +extern "C".
> +{.
> +#endif.
> +.
> +.
> +/* Private Macros ------------------------------------------------------------- */.
> +/** @defgroup UART_Private_Macros.
> + * @{.
> + */.
> +.
> +.
> +/** @defgroup UART_REGISTER_BIT_DEFINITIONS.
> + * @{.
> + */.
> +.
> +/* Accepted Error baud rate value (in percent unit) */.
> +#define UART_ACCEPTED_BAUDRATE_ERROR (3) /*!< Acceptable UART baudrate error */.
> +.
> +/* Macro defines for UARTn Receiver Buffer Register */.
> +#define UART_RBR_MASKBIT ((uint8_t)0xFF) /*!< UART Received Buffer mask bit (8 bits) */.
> +.
> +/* Macro defines for UARTn Transmit Holding Register */.
> +#define UART_THR_MASKBIT ((uint8_t)0xFF) /*!< UART Transmit Holding mask bit (8 bits) */.
> +.
> +/* Macro defines for UARTn Divisor Latch LSB register */.
> +#define UART_LOAD_DLL(div) ((div) & 0xFF) /**< Macro for loading least significant halfs of divisors */.
> +#define UART_DLL_MASKBIT ((uint8_t)0xFF) /*!< Divisor latch LSB bit mask */.
> +.
> +/* Macro defines for UARTn Divisor Latch MSB register */.
> +#define UART_DLM_MASKBIT ((uint8_t)0xFF) /*!< Divisor latch MSB bit mask */.
> +#define UART_LOAD_DLM(div) (((div) >> 8) & 0xFF) /**< Macro for loading most significant halfs of divisors */.
> +.
> +.
> +/* Macro defines for UART interrupt enable register */.
> +#define UART_IER_RBRINT_EN ((uint32_t)(1<<0)) /*!< RBR Interrupt enable*/.
> +#define UART_IER_THREINT_EN ((uint32_t)(1<<1)) /*!< THR Interrupt enable*/.
> +#define UART_IER_RLSINT_EN ((uint32_t)(1<<2)) /*!< RX line status interrupt enable*/.
> +#define UART1_IER_MSINT_EN ((uint32_t)(1<<3)) /*!< Modem status interrupt enable */.
> +#define UART1_IER_CTSINT_EN ((uint32_t)(1<<7)) /*!< CTS1 signal transition interrupt enable */.
> +#define UART_IER_ABEOINT_EN ((uint32_t)(1<<8)) /*!< Enables the end of auto-baud interrupt */.
> +#define UART_IER_ABTOINT_EN ((uint32_t)(1<<9)) /*!< Enables the auto-baud time-out interrupt */.
> +#define UART_IER_BITMASK ((uint32_t)(0x307)) /*!< UART interrupt enable register bit mask */.
> +#define UART1_IER_BITMASK ((uint32_t)(0x38F)) /*!< UART1 interrupt enable register bit mask */.
> +.
> +.
> +/* UART interrupt identification register defines */.
> +#define UART_IIR_INTSTAT_PEND ((uint32_t)(1<<0)) /*!<Interrupt Status - Active low */.
> +#define UART_IIR_INTID_RLS ((uint32_t)(3<<1)) /*!<Interrupt identification: Receive line status*/.
> +#define UART_IIR_INTID_RDA ((uint32_t)(2<<1)) /*!<Interrupt identification: Receive data available*/.
> +#define UART_IIR_INTID_CTI ((uint32_t)(6<<1)) /*!<Interrupt identification: Character time-out indicator*/.
> +#define UART_IIR_INTID_THRE ((uint32_t)(1<<1)) /*!<Interrupt identification: THRE interrupt*/.
> +#define UART1_IIR_INTID_MODEM ((uint32_t)(0<<1)) /*!<Interrupt identification: Modem interrupt*/.
> +#define UART_IIR_INTID_MASK ((uint32_t)(7<<1)) /*!<Interrupt identification: Interrupt ID mask */.
> +#define UART_IIR_FIFO_EN ((uint32_t)(3<<6)) /*!<These bits are equivalent to UnFCR[0] */.
> +#define UART_IIR_ABEO_INT ((uint32_t)(1<<8)) /*!< End of auto-baud interrupt */.
> +#define UART_IIR_ABTO_INT ((uint32_t)(1<<9)) /*!< Auto-baud time-out interrupt */.
> +#define UART_IIR_BITMASK ((uint32_t)(0x3CF)) /*!< UART interrupt identification register bit mask */.
> +.
> +.
> +/* Macro defines for UART FIFO control register */.
> +#define UART_FCR_FIFO_EN ((uint8_t)(1<<0)) /*!< UART FIFO enable */.
> +#define UART_FCR_RX_RS ((uint8_t)(1<<1)) /*!< UART FIFO RX reset */.
> +#define UART_FCR_TX_RS ((uint8_t)(1<<2)) /*!< UART FIFO TX reset */.
> +#define UART_FCR_DMAMODE_SEL ((uint8_t)(1<<3)) /*!< UART DMA mode selection */.
> +#define UART_FCR_TRG_LEV0 ((uint8_t)(0)) /*!< UART FIFO trigger level 0: 1 character */.
> +#define UART_FCR_TRG_LEV1 ((uint8_t)(1<<6)) /*!< UART FIFO trigger level 1: 4 character */.
> +#define UART_FCR_TRG_LEV2 ((uint8_t)(2<<6)) /*!< UART FIFO trigger level 2: 8 character */.
> +#define UART_FCR_TRG_LEV3 ((uint8_t)(3<<6)) /*!< UART FIFO trigger level 3: 14 character */.
> +#define UART_FCR_BITMASK ((uint8_t)(0xCF)) /*!< UART FIFO control bit mask */.
> +#define UART_TX_FIFO_SIZE (16).
> +.
> +/* Macro defines for UART line control register */.
> +#define UART_LCR_WLEN5 ((uint8_t)(0)) /*!< UART 5 bit data mode */.
> +#define UART_LCR_WLEN6 ((uint8_t)(1<<0)) /*!< UART 6 bit data mode */.
> +#define UART_LCR_WLEN7 ((uint8_t)(2<<0)) /*!< UART 7 bit data mode */.
> +#define UART_LCR_WLEN8 ((uint8_t)(3<<0)) /*!< UART 8 bit data mode */.
> +#define UART_LCR_STOPBIT_SEL ((uint8_t)(1<<2)) /*!< UART Two Stop Bits Select */.
> +#define UART_LCR_PARITY_EN ((uint8_t)(1<<3)) /*!< UART Parity Enable */.
> +#define UART_LCR_PARITY_ODD ((uint8_t)(0)) /*!< UART Odd Parity Select */.
> +#define UART_LCR_PARITY_EVEN ((uint8_t)(1<<4)) /*!< UART Even Parity Select */.
> +#define UART_LCR_PARITY_F_1 ((uint8_t)(2<<4)) /*!< UART force 1 stick parity */.
> +#define UART_LCR_PARITY_F_0 ((uint8_t)(3<<4)) /*!< UART force 0 stick parity */.
> +#define UART_LCR_BREAK_EN ((uint8_t)(1<<6)) /*!< UART Transmission Break enable */.
> +#define UART_LCR_DLAB_EN ((uint8_t)(1<<7)) /*!< UART Divisor Latches Access bit enable */.
> +#define UART_LCR_BITMASK ((uint8_t)(0xFF)) /*!< UART line control bit mask */.
> +.
> +.
> +/* Macro defines for UART1 Modem Control Register */.
> +#define UART1_MCR_DTR_CTRL ((uint8_t)(1<<0)) /*!< Source for modem output pin DTR */.
> +#define UART1_MCR_RTS_CTRL ((uint8_t)(1<<1)) /*!< Source for modem output pin RTS */.
> +#define UART1_MCR_LOOPB_EN ((uint8_t)(1<<4)) /*!< Loop back mode select */.
> +#define UART1_MCR_AUTO_RTS_EN ((uint8_t)(1<<6)) /*!< Enable Auto RTS flow-control */.
> +#define UART1_MCR_AUTO_CTS_EN ((uint8_t)(1<<7)) /*!< Enable Auto CTS flow-control */.
> +#define UART1_MCR_BITMASK ((uint8_t)(0x0F3)) /*!< UART1 bit mask value */.
> +.
> +.
> +/* Macro defines for UART line status register */.
> +#define UART_LSR_RDR ((uint8_t)(1<<0)) /*!<Line status register: Receive data ready*/.
> +#define UART_LSR_OE ((uint8_t)(1<<1)) /*!<Line status register: Overrun error*/.
> +#define UART_LSR_PE ((uint8_t)(1<<2)) /*!<Line status register: Parity error*/.
> +#define UART_LSR_FE ((uint8_t)(1<<3)) /*!<Line status register: Framing error*/.
> +#define UART_LSR_BI ((uint8_t)(1<<4)) /*!<Line status register: Break interrupt*/.
> +#define UART_LSR_THRE ((uint8_t)(1<<5)) /*!<Line status register: Transmit holding register empty*/.
> +#define UART_LSR_TEMT ((uint8_t)(1<<6)) /*!<Line status register: Transmitter empty*/.
> +#define UART_LSR_RXFE ((uint8_t)(1<<7)) /*!<Error in RX FIFO*/.
> +#define UART_LSR_BITMASK ((uint8_t)(0xFF)) /*!<UART Line status bit mask */.
> +.
> +.
> +/* Macro defines for UART Modem (UART1 only) status register */.
> +#define UART1_MSR_DELTA_CTS ((uint8_t)(1<<0)) /*!< Set upon state change of input CTS */.
> +#define UART1_MSR_DELTA_DSR ((uint8_t)(1<<1)) /*!< Set upon state change of input DSR */.
> +#define UART1_MSR_LO2HI_RI ((uint8_t)(1<<2)) /*!< Set upon low to high transition of input RI */.
> +#define UART1_MSR_DELTA_DCD ((uint8_t)(1<<3)) /*!< Set upon state change of input DCD */.
> +#define UART1_MSR_CTS ((uint8_t)(1<<4)) /*!< Clear To Send State */.
> +#define UART1_MSR_DSR ((uint8_t)(1<<5)) /*!< Data Set Ready State */.
> +#define UART1_MSR_RI ((uint8_t)(1<<6)) /*!< Ring Indicator State */.
> +#define UART1_MSR_DCD ((uint8_t)(1<<7)) /*!< Data Carrier Detect State */.
> +#define UART1_MSR_BITMASK ((uint8_t)(0xFF)) /*!< MSR register bit-mask value */.
> +.
> +.
> +/* Macro defines for UART Scratch Pad Register */.
> +#define UART_SCR_BIMASK ((uint8_t)(0xFF)) /*!< UART Scratch Pad bit mask */.
> +.
> +/* Macro defines for UART Auto baudrate control register */.
> +#define UART_ACR_START ((uint32_t)(1<<0)) /**< UART Auto-baud start */.
> +#define UART_ACR_MODE ((uint32_t)(1<<1)) /**< UART Auto baudrate Mode 1 */.
> +#define UART_ACR_AUTO_RESTART ((uint32_t)(1<<2)) /**< UART Auto baudrate restart */.
> +#define UART_ACR_ABEOINT_CLR ((uint32_t)(1<<8)) /**< UART End of auto-baud interrupt clear */.
> +#define UART_ACR_ABTOINT_CLR ((uint32_t)(1<<9)) /**< UART Auto-baud time-out interrupt clear */.
> +#define UART_ACR_BITMASK ((uint32_t)(0x307)) /**< UART Auto Baudrate register bit mask */.
> +.
> +/* UART IrDA control register defines */.
> +#define UART_ICR_IRDAEN ((uint32_t)(1<<0)) /**< IrDA mode enable */.
> +#define UART_ICR_IRDAINV ((uint32_t)(1<<1)) /**< IrDA serial input inverted */.
> +#define UART_ICR_FIXPULSE_EN ((uint32_t)(1<<2)) /**< IrDA fixed pulse width mode */.
> +#define UART_ICR_PULSEDIV(n) ((uint32_t)((n&0x07)<<3)) /**< PulseDiv - Configures the pulse when FixPulseEn = 1 */.
> +#define UART_ICR_BITMASK ((uint32_t)(0x3F)) /*!< UART IRDA bit mask */.
> +.
> +/* Macro defines for UART Fractional divider register */.
> +#define UART_FDR_DIVADDVAL(n) ((uint32_t)(n&0x0F)) /**< Baud-rate generation pre-scaler divisor */.
> +#define UART_FDR_MULVAL(n) ((uint32_t)((n<<4)&0xF0)) /**< Baud-rate pre-scaler multiplier value */.
> +#define UART_FDR_BITMASK ((uint32_t)(0xFF)) /**< UART Fractional Divider register bit mask */.
> +.
> +/* Macro defines for UART Tx Enable register */.
> +#define UART_TER_TXEN ((uint8_t)(1<<7)) /*!< Transmit enable bit */.
> +#define UART_TER_BITMASK ((uint8_t)(0x80)) /**< UART Transmit Enable Register bit mask */.
> +.
> +.
> +/* Macro defines for UART1 RS485 Control register */.
> +#define UART1_RS485CTRL_NMM_EN ((uint32_t)(1<<0)) /*!< RS-485/EIA-485 Normal Multi-drop Mode (NMM).
> + is disabled */.
> +#define UART1_RS485CTRL_RX_DIS ((uint32_t)(1<<1)) /*!< The receiver is disabled */.
> +#define UART1_RS485CTRL_AADEN ((uint32_t)(1<<2)) /*!< Auto Address Detect (AAD) is enabled */.
> +#define UART1_RS485CTRL_SEL_DTR ((uint32_t)(1<<3)) /*!< If direction control is enabled.
> + (bit DCTRL = 1), pin DTR is used for direction control */.
> +#define UART1_RS485CTRL_DCTRL_EN ((uint32_t)(1<<4)) /*!< Enable Auto Direction Control */.
> +#define UART1_RS485CTRL_OINV_1 ((uint32_t)(1<<5)) /*!< This bit reverses the polarity of the direction.
> + control signal on the RTS (or DTR) pin. The direction control pin.
> + will be driven to logic "1" when the transmitter has data to be sent */.
> +#define UART1_RS485CTRL_BITMASK ((uint32_t)(0x3F)) /**< RS485 control bit-mask value */.
> +.
> +.
> +/* Macro defines for UART1 RS-485 Address Match register */.
> +#define UART1_RS485ADRMATCH_BITMASK ((uint8_t)(0xFF)) /**< Bit mask value */.
> +.
> +/* Macro defines for UART1 RS-485 Delay value register */.
> +#define UART1_RS485DLY_BITMASK ((uint8_t)(0xFF)) /** Bit mask value */.
> +.
> +.
> +/* Macro defines for UART FIFO Level register */.
> +#define UART_FIFOLVL_RXFIFOLVL(n) ((uint32_t)(n&0x0F)) /**< Reflects the current level of the UART receiver FIFO */.
> +#define UART_FIFOLVL_TXFIFOLVL(n) ((uint32_t)((n>>8)&0x0F)) /**< Reflects the current level of the UART transmitter FIFO */.
> +#define UART_FIFOLVL_BITMASK ((uint32_t)(0x0F0F)) /**< UART FIFO Level Register bit mask */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Types --------------------------------------------------------------- */.
> +/** @defgroup UART_Public_Types.
> + * @{.
> + */.
> +.
> +.
> +/**.
> + * @brief UART Databit type definitions.
> + */.
> +typedef enum {.
> + UART_DATABIT_5 = 0, /*!< UART 5 bit data mode */.
> + UART_DATABIT_6, /*!< UART 6 bit data mode */.
> + UART_DATABIT_7, /*!< UART 7 bit data mode */.
> + UART_DATABIT_8 /*!< UART 8 bit data mode */.
> +} UART_DATABIT_Type;.
> +.
> +/** Macro to check the input UART_DATABIT parameters */.
> +#define PARAM_UART_DATABIT(databit) ((databit==UART_DATABIT_5) || (databit==UART_DATABIT_6)\.
> +|| (databit==UART_DATABIT_7) || (databit==UART_DATABIT_8)).
> +.
> +/**.
> + * @brief UART Stop bit type definitions.
> + */.
> +typedef enum {.
> + UART_STOPBIT_1 = (0), /*!< UART 1 Stop Bits Select */.
> + UART_STOPBIT_2, /*!< UART Two Stop Bits Select */.
> +} UART_STOPBIT_Type;.
> +.
> +/** Macro to check the input UART_STOPBIT parameters */.
> +#define PARAM_UART_STOPBIT(stopbit) ((stopbit==UART_STOPBIT_1) || (stopbit==UART_STOPBIT_2)).
> +.
> +/**.
> + * @brief UART Parity type definitions.
> + */.
> +typedef enum {.
> + UART_PARITY_NONE = 0, /*!< No parity */.
> + UART_PARITY_ODD, /*!< Odd parity */.
> + UART_PARITY_EVEN, /*!< Even parity */.
> + UART_PARITY_SP_1, /*!< Forced "1" stick parity */.
> + UART_PARITY_SP_0 /*!< Forced "0" stick parity */.
> +} UART_PARITY_Type;.
> +.
> +/** Macro to check the input UART_PARITY parameters */.
> +#define PARAM_UART_PARITY(parity) ((parity==UART_PARITY_NONE) || (parity==UART_PARITY_ODD) \.
> +|| (parity==UART_PARITY_EVEN) || (parity==UART_PARITY_SP_1) \.
> +|| (parity==UART_PARITY_SP_0)).
> +.
> +/**.
> + * @brief FIFO Level type definitions.
> + */.
> +typedef enum {.
> + UART_FIFO_TRGLEV0 = 0, /*!< UART FIFO trigger level 0: 1 character */.
> + UART_FIFO_TRGLEV1, /*!< UART FIFO trigger level 1: 4 character */.
> + UART_FIFO_TRGLEV2, /*!< UART FIFO trigger level 2: 8 character */.
> + UART_FIFO_TRGLEV3 /*!< UART FIFO trigger level 3: 14 character */.
> +} UART_FITO_LEVEL_Type;.
> +.
> +/** Macro to check the input UART_FIFO parameters */.
> +#define PARAM_UART_FIFO_LEVEL(fifo) ((fifo==UART_FIFO_TRGLEV0) \.
> +|| (fifo==UART_FIFO_TRGLEV1) || (fifo==UART_FIFO_TRGLEV2) \.
> +|| (fifo==UART_FIFO_TRGLEV3)).
> +.
> +/********************************************************************//**.
> +* @brief UART Interrupt Type definitions.
> +**********************************************************************/.
> +typedef enum {.
> + UART_INTCFG_RBR = 0, /*!< RBR Interrupt enable*/.
> + UART_INTCFG_THRE, /*!< THR Interrupt enable*/.
> + UART_INTCFG_RLS, /*!< RX line status interrupt enable*/.
> + UART1_INTCFG_MS, /*!< Modem status interrupt enable (UART1 only) */.
> + UART1_INTCFG_CTS, /*!< CTS1 signal transition interrupt enable (UART1 only) */.
> + UART_INTCFG_ABEO, /*!< Enables the end of auto-baud interrupt */.
> + UART_INTCFG_ABTO /*!< Enables the auto-baud time-out interrupt */.
> +} UART_INT_Type;.
> +.
> +/** Macro to check the input UART_INTCFG parameters */.
> +#define PARAM_UART_INTCFG(IntCfg) ((IntCfg==UART_INTCFG_RBR) || (IntCfg==UART_INTCFG_THRE) \.
> +|| (IntCfg==UART_INTCFG_RLS) || (IntCfg==UART_INTCFG_ABEO) \.
> +|| (IntCfg==UART_INTCFG_ABTO)).
> +.
> +/** Macro to check the input UART1_INTCFG parameters - expansion input parameter for UART1 */.
> +#define PARAM_UART1_INTCFG(IntCfg) ((IntCfg==UART1_INTCFG_MS) || (IntCfg==UART1_INTCFG_CTS)).
> +.
> +.
> +/**.
> + * @brief UART Line Status Type definition.
> + */.
> +typedef enum {.
> + UART_LINESTAT_RDR = UART_LSR_RDR, /*!<Line status register: Receive data ready*/.
> + UART_LINESTAT_OE = UART_LSR_OE, /*!<Line status register: Overrun error*/.
> + UART_LINESTAT_PE = UART_LSR_PE, /*!<Line status register: Parity error*/.
> + UART_LINESTAT_FE = UART_LSR_FE, /*!<Line status register: Framing error*/.
> + UART_LINESTAT_BI = UART_LSR_BI, /*!<Line status register: Break interrupt*/.
> + UART_LINESTAT_THRE = UART_LSR_THRE, /*!<Line status register: Transmit holding register empty*/.
> + UART_LINESTAT_TEMT = UART_LSR_TEMT, /*!<Line status register: Transmitter empty*/.
> + UART_LINESTAT_RXFE = UART_LSR_RXFE /*!<Error in RX FIFO*/.
> +} UART_LS_Type;.
> +.
> +.
> +/**.
> + * @brief UART Auto-baudrate mode type definition.
> + */.
> +typedef enum {.
> + UART_AUTOBAUD_MODE0 = 0, /**< UART Auto baudrate Mode 0 */.
> + UART_AUTOBAUD_MODE1, /**< UART Auto baudrate Mode 1 */.
> +} UART_AB_MODE_Type;.
> +.
> +/** Macro to check the input UART_AUTOBAUD_MODE parameters */.
> +#define PARAM_UART_AUTOBAUD_MODE(ABmode) ((ABmode==UART_AUTOBAUD_MODE0) || (ABmode==UART_AUTOBAUD_MODE1)).
> +.
> +/**.
> + * @brief Auto Baudrate mode configuration type definition.
> + */.
> +typedef struct {.
> + UART_AB_MODE_Type ABMode; /**< Autobaudrate mode */.
> + FunctionalState AutoRestart; /**< Auto Restart state */.
> +} UART_AB_CFG_Type;.
> +.
> +.
> +/**.
> + * @brief UART End of Auto-baudrate type definition.
> + */.
> +typedef enum {.
> + UART_AUTOBAUD_INTSTAT_ABEO = UART_IIR_ABEO_INT, /**< UART End of auto-baud interrupt */.
> + UART_AUTOBAUD_INTSTAT_ABTO = UART_IIR_ABTO_INT /**< UART Auto-baud time-out interrupt */.
> +}UART_ABEO_Type;.
> +.
> +/** Macro to check the input UART_AUTOBAUD_INTSTAT parameters */.
> +#define PARAM_UART_AUTOBAUD_INTSTAT(ABIntStat) ((ABIntStat==UART_AUTOBAUD_INTSTAT_ABEO) || (ABIntStat==UART_AUTOBAUD_INTSTAT_ABTO)).
> +.
> +/**.
> + * UART IrDA Control type Definition.
> + */.
> +typedef enum {.
> + UART_IrDA_PULSEDIV2 = 0, /**< Pulse width = 2 * Tpclk.
> + - Configures the pulse when FixPulseEn = 1 */.
> + UART_IrDA_PULSEDIV4, /**< Pulse width = 4 * Tpclk.
> + - Configures the pulse when FixPulseEn = 1 */.
> + UART_IrDA_PULSEDIV8, /**< Pulse width = 8 * Tpclk.
> + - Configures the pulse when FixPulseEn = 1 */.
> + UART_IrDA_PULSEDIV16, /**< Pulse width = 16 * Tpclk.
> + - Configures the pulse when FixPulseEn = 1 */.
> + UART_IrDA_PULSEDIV32, /**< Pulse width = 32 * Tpclk.
> + - Configures the pulse when FixPulseEn = 1 */.
> + UART_IrDA_PULSEDIV64, /**< Pulse width = 64 * Tpclk.
> + - Configures the pulse when FixPulseEn = 1 */.
> + UART_IrDA_PULSEDIV128, /**< Pulse width = 128 * Tpclk.
> + - Configures the pulse when FixPulseEn = 1 */.
> + UART_IrDA_PULSEDIV256 /**< Pulse width = 256 * Tpclk.
> + - Configures the pulse when FixPulseEn = 1 */.
> +} UART_IrDA_PULSE_Type;.
> +.
> +.
> +/** Macro to check the input UART_IrDA_PULSEDIV parameters */.
> +#define PARAM_UART_IrDA_PULSEDIV(PulseDiv) ((PulseDiv==UART_IrDA_PULSEDIV2) || (PulseDiv==UART_IrDA_PULSEDIV4) \.
> +|| (PulseDiv==UART_IrDA_PULSEDIV8) || (PulseDiv==UART_IrDA_PULSEDIV16) \.
> +|| (PulseDiv==UART_IrDA_PULSEDIV32) || (PulseDiv==UART_IrDA_PULSEDIV64) \.
> +|| (PulseDiv==UART_IrDA_PULSEDIV128) || (PulseDiv==UART_IrDA_PULSEDIV256)).
> +.
> +/********************************************************************//**.
> +* @brief UART1 Full modem - Signal states definition.
> +**********************************************************************/.
> +typedef enum {.
> + INACTIVE = 0, /* In-active state */.
> + ACTIVE = !INACTIVE /* Active state */.
> +}UART1_SignalState;.
> +.
> +/* Macro to check the input UART1_SignalState parameters */.
> +#define PARAM_UART1_SIGNALSTATE(x) ((x==INACTIVE) || (x==ACTIVE)).
> +.
> +/**.
> + * @brief UART modem status type definition.
> + */.
> +typedef enum {.
> + UART1_MODEM_STAT_DELTA_CTS = UART1_MSR_DELTA_CTS, /*!< Set upon state change of input CTS */.
> + UART1_MODEM_STAT_DELTA_DSR = UART1_MSR_DELTA_DSR, /*!< Set upon state change of input DSR */.
> + UART1_MODEM_STAT_LO2HI_RI = UART1_MSR_LO2HI_RI, /*!< Set upon low to high transition of input RI */.
> + UART1_MODEM_STAT_DELTA_DCD = UART1_MSR_DELTA_DCD, /*!< Set upon state change of input DCD */.
> + UART1_MODEM_STAT_CTS = UART1_MSR_CTS, /*!< Clear To Send State */.
> + UART1_MODEM_STAT_DSR = UART1_MSR_DSR, /*!< Data Set Ready State */.
> + UART1_MODEM_STAT_RI = UART1_MSR_RI, /*!< Ring Indicator State */.
> + UART1_MODEM_STAT_DCD = UART1_MSR_DCD /*!< Data Carrier Detect State */.
> +} UART_MODEM_STAT_type;.
> +.
> +/**.
> + * @brief Modem output pin type definition.
> + */.
> +typedef enum {.
> + UART1_MODEM_PIN_DTR = 0, /*!< Source for modem output pin DTR */.
> + UART1_MODEM_PIN_RTS /*!< Source for modem output pin RTS */.
> +} UART_MODEM_PIN_Type;.
> +.
> +/** Macro to check the input PARAM_UART1_MODEM_PIN parameters */.
> +#define PARAM_UART1_MODEM_PIN(x) ((x==UART1_MODEM_PIN_DTR) || (x==UART1_MODEM_PIN_RTS)).
> +.
> +.
> +/**.
> + * @brief UART Modem mode type definition.
> + */.
> +typedef enum {.
> + UART1_MODEM_MODE_LOOPBACK = 0, /*!< Loop back mode select */.
> + UART1_MODEM_MODE_AUTO_RTS, /*!< Enable Auto RTS flow-control */.
> + UART1_MODEM_MODE_AUTO_CTS /*!< Enable Auto CTS flow-control */.
> +} UART_MODEM_MODE_Type;.
> +.
> +/** Macro to check the input PARAM_UART1_MODEM_MODE parameters */.
> +#define PARAM_UART1_MODEM_MODE(x) ((x==UART1_MODEM_MODE_LOOPBACK) || (x==UART1_MODEM_MODE_AUTO_RTS) \.
> +|| (x==UART1_MODEM_MODE_AUTO_CTS)).
> +.
> +.
> +/**.
> + * @brief UART Direction Control Pin type definition.
> + */.
> +typedef enum {.
> + UART1_RS485_DIRCTRL_RTS = 0, /**< Pin RTS is used for direction control */.
> + UART1_RS485_DIRCTRL_DTR /**< Pin DTR is used for direction control */.
> +} UART_RS485_DIRCTRL_PIN_Type;.
> +.
> +/** Macro to check the direction control pin type */.
> +#define PARAM_UART_RS485_DIRCTRL_PIN(x) ((x==UART1_RS485_DIRCTRL_RTS) || (x==UART1_RS485_DIRCTRL_DTR)).
> +.
> +.
> +/********************************************************************//**.
> +* @brief UART Configuration Structure definition.
> +**********************************************************************/.
> +typedef struct {.
> + uint32_t Baud_rate; /**< UART baud rate */.
> + UART_PARITY_Type Parity; /**< Parity selection, should be:.
> + - UART_PARITY_NONE: No parity.
> + - UART_PARITY_ODD: Odd parity.
> + - UART_PARITY_EVEN: Even parity.
> + - UART_PARITY_SP_1: Forced "1" stick parity.
> + - UART_PARITY_SP_0: Forced "0" stick parity.
> + */.
> + UART_DATABIT_Type Databits; /**< Number of data bits, should be:.
> + - UART_DATABIT_5: UART 5 bit data mode.
> + - UART_DATABIT_6: UART 6 bit data mode.
> + - UART_DATABIT_7: UART 7 bit data mode.
> + - UART_DATABIT_8: UART 8 bit data mode.
> + */.
> + UART_STOPBIT_Type Stopbits; /**< Number of stop bits, should be:.
> + - UART_STOPBIT_1: UART 1 Stop Bits Select.
> + - UART_STOPBIT_2: UART 2 Stop Bits Select.
> + */.
> +} UART_CFG_Type;.
> +.
> +/********************************************************************//**.
> +* @brief UART FIFO Configuration Structure definition.
> +**********************************************************************/.
> +.
> +typedef struct {.
> + FunctionalState FIFO_ResetRxBuf; /**< Reset Rx FIFO command state , should be:.
> + - ENABLE: Reset Rx FIFO in UART.
> + - DISABLE: Do not reset Rx FIFO in UART.
> + */.
> + FunctionalState FIFO_ResetTxBuf; /**< Reset Tx FIFO command state , should be:.
> + - ENABLE: Reset Tx FIFO in UART.
> + - DISABLE: Do not reset Tx FIFO in UART.
> + */.
> + FunctionalState FIFO_DMAMode; /**< DMA mode, should be:.
> + - ENABLE: Enable DMA mode in UART.
> + - DISABLE: Disable DMA mode in UART.
> + */.
> + UART_FITO_LEVEL_Type FIFO_Level; /**< Rx FIFO trigger level, should be:.
> + - UART_FIFO_TRGLEV0: UART FIFO trigger level 0: 1 character.
> + - UART_FIFO_TRGLEV1: UART FIFO trigger level 1: 4 character.
> + - UART_FIFO_TRGLEV2: UART FIFO trigger level 2: 8 character.
> + - UART_FIFO_TRGLEV3: UART FIFO trigger level 3: 14 character.
> + */.
> +} UART_FIFO_CFG_Type;.
> +.
> +.
> +/********************************************************************//**.
> +* @brief UART1 Full modem - RS485 Control configuration type.
> +**********************************************************************/.
> +typedef struct {.
> + FunctionalState NormalMultiDropMode_State; /*!< Normal MultiDrop mode State:.
> + - ENABLE: Enable this function..
> + - DISABLE: Disable this function. */.
> + FunctionalState Rx_State; /*!< Receiver State:.
> + - ENABLE: Enable Receiver..
> + - DISABLE: Disable Receiver. */.
> + FunctionalState AutoAddrDetect_State; /*!< Auto Address Detect mode state:.
> + - ENABLE: ENABLE this function..
> + - DISABLE: Disable this function. */.
> + FunctionalState AutoDirCtrl_State; /*!< Auto Direction Control State:.
> + - ENABLE: Enable this function..
> + - DISABLE: Disable this function. */.
> + UART_RS485_DIRCTRL_PIN_Type DirCtrlPin; /*!< If direction control is enabled, state:.
> + - UART1_RS485_DIRCTRL_RTS:.
> + pin RTS is used for direction control..
> + - UART1_RS485_DIRCTRL_DTR:.
> + pin DTR is used for direction control. */.
> + SetState DirCtrlPol_Level; /*!< Polarity of the direction control signal on.
> + the RTS (or DTR) pin:.
> + - RESET: The direction control pin will be driven.
> + to logic "0" when the transmitter has data to be sent..
> + - SET: The direction control pin will be driven.
> + to logic "1" when the transmitter has data to be sent. */.
> + uint8_t MatchAddrValue; /*!< address match value for RS-485/EIA-485 mode, 8-bit long */.
> + uint8_t DelayValue; /*!< delay time is in periods of the baud clock, 8-bit long */.
> +} UART1_RS485_CTRLCFG_Type;.
> +.
> +.
> +/* UART call-back function type definitions */.
> +/** UART Receive Call-back function type */.
> +typedef void (fnRxCbs_Type)(void);.
> +/** UART Transmit Call-back function type */.
> +typedef void (fnTxCbs_Type)(void);.
> +/** UART Auto-Baudrate Call-back function type */.
> +typedef void (fnABCbs_Type)(uint32_t bABIntType);.
> +/** UART Error Call-back function type */.
> +typedef void (fnErrCbs_Type)(uint8_t bError);.
> +/** UART1 modem status interrupt callback type */.
> +typedef void (fnModemCbs_Type)(uint8_t ModemStatus);.
> +.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Macros -------------------------------------------------------------- */.
> +/** @defgroup UART_Public_Macros.
> + * @{.
> + */.
> +.
> +.
> +/* Macro to determine if it is valid UART port number */.
> +#define PARAM_UARTx(x) ((((uint32_t *)x)==((uint32_t *)LPC_UART0)) \.
> +|| (((uint32_t *)x)==((uint32_t *)LPC_UART1)) \.
> +|| (((uint32_t *)x)==((uint32_t *)LPC_UART2)) \.
> +|| (((uint32_t *)x)==((uint32_t *)LPC_UART3))).
> +#define PARAM_UART_IrDA(x) (((uint32_t *)x)==((uint32_t *)LPC_UART3)).
> +#define PARAM_UART1_MODEM(x) (((uint32_t *)x)==((uint32_t *)LPC_UART1)).
> +.
> +.
> +/** Macro to check the input value for UART1_RS485_CFG_MATCHADDRVALUE parameter */.
> +#define PARAM_UART1_RS485_CFG_MATCHADDRVALUE(x) ((x<0xFF)).
> +.
> +/** Macro to check the input value for UART1_RS485_CFG_DELAYVALUE parameter */.
> +#define PARAM_UART1_RS485_CFG_DELAYVALUE(x) ((x<0xFF)).
> +.
> +.
> +/** UART time-out definitions in case of using Read() and Write function.
> + * with Blocking Flag mode.
> + */.
> +.
> +#define UART_BLOCKING_TIMEOUT (0xFFFFFFFFUL).
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +/* Public Functions ----------------------------------------------------------- */.
> +/** @defgroup UART_Public_Functions.
> + * @{.
> + */.
> +.
> +void UART_DeInit(LPC_UART_TypeDef* UARTx);.
> +void UART_Init(LPC_UART_TypeDef *UARTx, UART_CFG_Type *UART_ConfigStruct);.
> +void UART_ConfigStructInit(UART_CFG_Type *UART_InitStruct);.
> +void UART_SendData(LPC_UART_TypeDef* UARTx, uint8_t Data);.
> +uint8_t UART_ReceiveData(LPC_UART_TypeDef* UARTx);.
> +void UART_ForceBreak(LPC_UART_TypeDef* UARTx);.
> +void UART_IrDAInvtInputCmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState);.
> +void UART_IrDACmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState);.
> +void UART_IrDAPulseDivConfig(LPC_UART_TypeDef *UARTx, UART_IrDA_PULSE_Type PulseDiv);.
> +void UART_IntConfig(LPC_UART_TypeDef *UARTx, UART_INT_Type UARTIntCfg, \.
> + FunctionalState NewState);.
> +uint8_t UART_GetLineStatus(LPC_UART_TypeDef* UARTx);.
> +FlagStatus UART_CheckBusy(LPC_UART_TypeDef *UARTx);.
> +void UART_FIFOConfig(LPC_UART_TypeDef *UARTx, UART_FIFO_CFG_Type *FIFOCfg);.
> +void UART_FIFOConfigStructInit(UART_FIFO_CFG_Type *UART_FIFOInitStruct);.
> +void UART_ABCmd(LPC_UART_TypeDef *UARTx, UART_AB_CFG_Type *ABConfigStruct, \.
> + FunctionalState NewState);.
> +void UART_TxCmd(LPC_UART_TypeDef *UARTx, FunctionalState NewState);.
> +void UART_FullModemForcePinState(LPC_UART1_TypeDef *UARTx, UART_MODEM_PIN_Type Pin, \.
> + UART1_SignalState NewState);.
> +void UART_FullModemConfigMode(LPC_UART1_TypeDef *UARTx, UART_MODEM_MODE_Type Mode, \.
> + FunctionalState NewState);.
> +uint8_t UART_FullModemGetStatus(LPC_UART1_TypeDef *UARTx);.
> +void UART_RS485Config(LPC_UART1_TypeDef *UARTx, \.
> + UART1_RS485_CTRLCFG_Type *RS485ConfigStruct);.
> +void UART_RS485ReceiverCmd(LPC_UART1_TypeDef *UARTx, FunctionalState NewState);.
> +void UART_RS485SendSlvAddr(LPC_UART1_TypeDef *UARTx, uint8_t SlvAddr);.
> +uint32_t UART_RS485SendData(LPC_UART1_TypeDef *UARTx, uint8_t *pData, uint32_t size);.
> +uint32_t UART_Send(LPC_UART_TypeDef *UARTx, uint8_t *txbuf,.
> + uint32_t buflen, TRANSFER_BLOCK_Type flag);.
> +uint32_t UART_Receive(LPC_UART_TypeDef *UARTx, uint8_t *rxbuf, \.
> + uint32_t buflen, TRANSFER_BLOCK_Type flag);.
> +void UART_SetupCbs(LPC_UART_TypeDef *UARTx, uint8_t CbType, void *pfnCbs);.
> +void UART0_StdIntHandler(void);.
> +void UART1_StdIntHandler(void);.
> +void UART2_StdIntHandler(void);.
> +void UART3_StdIntHandler(void);.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +.
> +#ifdef __cplusplus.
> +}.
> +#endif.
> +.
> +.
> +#endif /* __LPC17XX_UART_H */.
> +.
> +/**.
> + * @}.
> + */.
> +.
> +/* --------------------------------- End Of File ------------------------------ */.
> diff --git a/arch/arm/mach-lpc17cmsis/tools/lpcchksum/lpcchksum.sh b/arch/arm/mach-lpc17cmsis/tools/lpcchksum/lpcchksum.sh
> new file mode 100755
> index 0000000..353af27
> --- /dev/null
> +++ b/arch/arm/mach-lpc17cmsis/tools/lpcchksum/lpcchksum.sh
> @@ -0,0 +1,6 @@
> +#!/bin/bash
> +
> +cksum=$[($(hexdump -v -n $[7*4] -e '1/4 "0x%08x+"' $1) - 1)^0xffffffff]
> +( head -c $[7*4] $1; \
> + echo -en $(printf '%08x' $cksum | sed 's/.*\(..\)\(..\)\(..\)\(..\)$/\\x\4\\x\3\\x\2\\x\1/'); \
> + tail -c +$[8*4] $1 )
> diff --git a/board/arm/lpc17cmsis-mbed/Makefile b/board/arm/lpc17cmsis-mbed/Makefile
> new file mode 100644
> index 0000000..76b56fd
> --- /dev/null
> +++ b/board/arm/lpc17cmsis-mbed/Makefile
> @@ -0,0 +1,14 @@
> +# Generic directory or leaf node makefile for OCERA make framework
> +
> +ifndef MAKERULES_DIR
> +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
> +endif
> +
> +ifeq ($(MAKERULES_DIR),)
> +all : default
> +.DEFAULT::
> + @echo -e "\nThe Makefile.rules has not been found in this or parent directory\n"
> +else
> +include $(MAKERULES_DIR)/Makefile.rules
> +endif
> +
> diff --git a/board/arm/lpc17cmsis-mbed/Makefile.omk b/board/arm/lpc17cmsis-mbed/Makefile.omk
> new file mode 100644
> index 0000000..99dc2a5
> --- /dev/null
> +++ b/board/arm/lpc17cmsis-mbed/Makefile.omk
> @@ -0,0 +1,6 @@
> +# -*- makefile -*-
> +
> +SUBDIRS =
> +
> +lib_LDSCRIPTS = board.ld
> +include_HEADERS = system_def.h
> diff --git a/board/arm/lpc17cmsis-mbed/board.ld b/board/arm/lpc17cmsis-mbed/board.ld
> new file mode 100644
> index 0000000..20ce73e
> --- /dev/null
> +++ b/board/arm/lpc17cmsis-mbed/board.ld
> @@ -0,0 +1 @@
> +/* Board specific objects linked with applications */
> diff --git a/board/arm/lpc17cmsis-mbed/config.lpc17xx-mbed b/board/arm/lpc17cmsis-mbed/config.lpc17xx-mbed
> new file mode 100644
> index 0000000..b0e0d72
> --- /dev/null
> +++ b/board/arm/lpc17cmsis-mbed/config.lpc17xx-mbed
> @@ -0,0 +1,46 @@
> +# -*- makefile -*-
> +
> +ARCH=arm
> +MACH=lpc17cmsis
> +BOARD=lpc17cmsis-mbed
> +
> +CROSS_COMPILE = arm-elf-
> +TARGET_ARCH = -mthumb -mcpu=cortex-m3
> +
> +# set ARCH_... & MACH_... C defines
> +CFLAGS += -DARCH_$(shell echo $(ARCH) | tr a-z A-Z)
> +CFLAGS += -DMACH_$(shell echo $(MACH) | tr a-z A-Z)
> +CFLAGS += -D__BIT_TYPES_DEFINED__
> +
> +# Set default C flags. If theese are set elsewhere (e.g. on a command
> +# line), these default flags are not used.
> +DEBUG ?= -g
> +OPTIMIZE ?= -O2
> +
> +
> +# loading function is not done yet
> +
> +#LPCISP=~/projects/cf/lpc21isp_v179/lpc21isp
> +#TOLPC13XX=../../../arch/arm/mach-lpc13xx/tools/tolpc/tolpc -m ../../../arch/arm/mach-lpc13xx/tools/tolpc/lpc13xx.so
> +#LPC_BAUD = 115200
> +#LPC_TTY = /dev/ttyUSB0
> +#CPU_SYS_KHZ = 12000
> +
> +#TOLPC = $(TOLPC13XX) --baud $(LPC_BAUD) --sdev $(LPC_TTY) -q $(CPU_SYS_KHZ) -L -f
> +#LOAD_CMD-ram = $(TOLPC)
> +#LOAD_CMD-flash = load() { $(TOLPC) -bin $$1 $(LPC_TTY) $(LPC_BAUD) $(CPU_SYS_KHZ); }; load
> +
> +# This selects linker script
> +LD_SCRIPT=lpc1768
> +DEFAULT_LD_SCRIPT_VARIANT=flash
> +
> +OUTPUT_FORMATS = bin
> +
> +###
> +#CONFIG_USB_BASE=y
> +#CONFIG_USB_MORE=y
> +CONFIG_USB_PDIUSB=n
> +#CONFIG_USB_LPCUSB=y
> +CONFIG_CMDPROC_TEST=n
> +
> +LN_HEADERS=y
> diff --git a/board/arm/lpc17cmsis-mbed/system_def.h b/board/arm/lpc17cmsis-mbed/system_def.h
> new file mode 100644
> index 0000000..9022aab
> --- /dev/null
> +++ b/board/arm/lpc17cmsis-mbed/system_def.h
> @@ -0,0 +1 @@
> +/* rien de rien */
> --
> 1.7.1
>