Просмотр исходного кода

move board and mcu into hw folder

hathach 8 лет назад
Родитель
Сommit
349fa2aed8
100 измененных файлов с 6325 добавлено и 6316 удалено
  1. 1 1
      demos/device/device_freertos/.project
  2. 9 0
      demos/device/device_os_none/.cproject
  3. 2 2
      demos/device/device_os_none/.project
  4. 109 109
      hw/boards/ansi_escape.h
  5. 111 111
      hw/boards/board.c
  6. 174 174
      hw/boards/board.h
  7. 153 153
      hw/boards/embedded_artists/ea4357/board_ea4357.c
  8. 65 65
      hw/boards/embedded_artists/ea4357/board_ea4357.h
  9. 480 480
      hw/boards/embedded_artists/ea4357/emac.c
  10. 157 157
      hw/boards/embedded_artists/ea4357/emac.h
  11. 546 546
      hw/boards/embedded_artists/ea4357/nand.c
  12. 36 36
      hw/boards/embedded_artists/ea4357/nand.h
  13. 272 272
      hw/boards/embedded_artists/ea4357/sdram.c
  14. 31 31
      hw/boards/embedded_artists/ea4357/sdram.h
  15. 0 0
      hw/boards/embedded_artists/oem_base_board/acc.c
  16. 0 0
      hw/boards/embedded_artists/oem_base_board/acc.h
  17. 0 0
      hw/boards/embedded_artists/oem_base_board/base_eeprom.c
  18. 0 0
      hw/boards/embedded_artists/oem_base_board/base_eeprom.h
  19. 0 0
      hw/boards/embedded_artists/oem_base_board/lm75a.c
  20. 0 0
      hw/boards/embedded_artists/oem_base_board/lm75a.h
  21. 0 0
      hw/boards/embedded_artists/oem_base_board/memreg.c
  22. 0 0
      hw/boards/embedded_artists/oem_base_board/memreg.h
  23. 0 0
      hw/boards/embedded_artists/oem_base_board/norflash.c
  24. 0 0
      hw/boards/embedded_artists/oem_base_board/norflash.h
  25. 349 349
      hw/boards/embedded_artists/oem_base_board/pca9532.c
  26. 0 0
      hw/boards/embedded_artists/oem_base_board/pca9532.h
  27. 0 0
      hw/boards/embedded_artists/oem_base_board/uda1380.c
  28. 0 0
      hw/boards/embedded_artists/oem_base_board/uda1380.h
  29. 0 0
      hw/boards/hitex/board_hitex4350.c
  30. 0 0
      hw/boards/hitex/board_hitex4350.h
  31. 0 0
      hw/boards/keil/board_mcb4300.c
  32. 0 0
      hw/boards/keil/board_mcb4300.h
  33. 126 126
      hw/boards/lpcxpresso/board_lpclink2.c
  34. 59 59
      hw/boards/lpcxpresso/board_lpclink2.h
  35. 0 0
      hw/boards/lpcxpresso/board_lpcxpresso11u14.c
  36. 0 0
      hw/boards/lpcxpresso/board_lpcxpresso11u14.h
  37. 114 114
      hw/boards/lpcxpresso/board_lpcxpresso11u68.c
  38. 57 57
      hw/boards/lpcxpresso/board_lpcxpresso11u68.h
  39. 132 132
      hw/boards/lpcxpresso/board_lpcxpresso1347.c
  40. 56 56
      hw/boards/lpcxpresso/board_lpcxpresso1347.h
  41. 159 159
      hw/boards/lpcxpresso/board_lpcxpresso1769.c
  42. 0 0
      hw/boards/lpcxpresso/board_lpcxpresso1769.h
  43. 130 130
      hw/boards/microbuilder/board_lpc4357usb.c
  44. 0 0
      hw/boards/microbuilder/board_lpc4357usb.h
  45. 0 0
      hw/boards/microbuilder/board_lpc4357usb_etminit.ini
  46. 158 158
      hw/boards/ngx/board_ngx4330.c
  47. 0 0
      hw/boards/ngx/board_ngx4330.h
  48. 163 163
      hw/boards/printf_retarget.c
  49. 0 0
      hw/boards/readme.md
  50. 0 0
      hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/history.txt
  51. 0 0
      hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/LPC11Uxx.h
  52. 0 0
      hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/core_cm0.h
  53. 0 0
      hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/core_cmFunc.h
  54. 0 0
      hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/core_cmInstr.h
  55. 0 0
      hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/power_api.h
  56. 0 0
      hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/system_LPC11Uxx.h
  57. 0 0
      hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/liblinks.xml
  58. 0 0
      hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/src/system_LPC11Uxx.c
  59. 819 819
      hw/mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_gpio.c
  60. 64 64
      hw/mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_gpio.h
  61. 238 238
      hw/mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_uart.c
  62. 55 55
      hw/mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_uart.h
  63. 0 0
      hw/mcu/lpc11uxx/iar/startup_lpc11xx.s
  64. 19 19
      hw/mcu/lpc11uxx/keil/lpc11uxx.sct
  65. 0 0
      hw/mcu/lpc11uxx/keil/startup_LPC11Uxx.s
  66. 0 0
      hw/mcu/lpc11uxx/lpcxpresso/cr_startup_lpc11u.c
  67. 0 0
      hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/history.txt
  68. 0 0
      hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/LPC13Uxx.h
  69. 0 0
      hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/core_cm3.h
  70. 0 0
      hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/core_cmFunc.h
  71. 0 0
      hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/core_cmInstr.h
  72. 0 0
      hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/power_api.h
  73. 0 0
      hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/system_LPC13Uxx.h
  74. 0 0
      hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/liblinks.xml
  75. 0 0
      hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/src/system_LPC13Uxx.c
  76. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/clkconfig.h
  77. 64 64
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/gpio.h
  78. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/nmi.h
  79. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/power_api.h
  80. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/timer16.h
  81. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/timer32.h
  82. 52 52
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/type.h
  83. 72 72
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/uart.h
  84. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/usart.h
  85. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/Serial.c
  86. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/clkconfig.c
  87. 838 838
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/gpio.c
  88. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/nmi.c
  89. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/timer16.c
  90. 0 0
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/timer32.c
  91. 437 437
      hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/uart.c
  92. 0 0
      hw/mcu/lpc13uxx/iar/startup_lpc13xx.s
  93. 18 18
      hw/mcu/lpc13uxx/keil/lpc13uxx.sct
  94. 0 0
      hw/mcu/lpc13uxx/keil/startup_LPC13Uxx.s
  95. 0 0
      hw/mcu/lpc13uxx/lpcxpresso/cr_startup_lpc13u.c
  96. 0 0
      hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/history.txt
  97. 0 0
      hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/LPC17xx.h
  98. 0 0
      hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/core_cm3.h
  99. 0 0
      hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/core_cmFunc.h
  100. 0 0
      hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/core_cmInstr.h

+ 1 - 1
demos/device/device_freertos/.project

@@ -83,7 +83,7 @@
 		<link>
 		<link>
 			<name>boards</name>
 			<name>boards</name>
 			<type>2</type>
 			<type>2</type>
-			<locationURI>PARENT-3-PROJECT_LOC/boards</locationURI>
+			<locationURI>PARENT-3-PROJECT_LOC/hw/boards</locationURI>
 		</link>
 		</link>
 		<link>
 		<link>
 			<name>freertos</name>
 			<name>freertos</name>

Разница между файлами не показана из-за своего большого размера
+ 9 - 0
demos/device/device_os_none/.cproject


+ 2 - 2
demos/device/device_os_none/.project

@@ -83,12 +83,12 @@
 		<link>
 		<link>
 			<name>boards</name>
 			<name>boards</name>
 			<type>2</type>
 			<type>2</type>
-			<locationURI>PARENT-3-PROJECT_LOC/boards</locationURI>
+			<locationURI>PARENT-3-PROJECT_LOC/hw/boards</locationURI>
 		</link>
 		</link>
 		<link>
 		<link>
 			<name>mcu</name>
 			<name>mcu</name>
 			<type>2</type>
 			<type>2</type>
-			<locationURI>PARENT-3-PROJECT_LOC/mcu</locationURI>
+			<locationURI>PARENT-3-PROJECT_LOC/hw/mcu</locationURI>
 		</link>
 		</link>
 		<link>
 		<link>
 			<name>src</name>
 			<name>src</name>

+ 109 - 109
boards/ansi_escape.h → hw/boards/ansi_escape.h

@@ -1,109 +1,109 @@
-/**************************************************************************/
-/*!
-    @file     ansi_esc_code.h
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-/** \ingroup group_board
- *  \defgroup group_ansi_esc ANSI Esacpe Code
- *  @{ */
-
-#ifndef _TUSB_ANSI_ESC_CODE_H_
-#define _TUSB_ANSI_ESC_CODE_H_
-
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-#define CSI_CODE(seq)   "\33[" seq
-#define CSI_SGR(x)      CSI_CODE(#x) "m"
-
-//------------- Cursor movement -------------//
-/** \defgroup group_ansi_cursor Cursor Movement
- *  @{ */
-#define ANSI_CURSOR_UP(n)        CSI_CODE(#n "A")          ///< Move cursor up
-#define ANSI_CURSOR_DOWN(n)      CSI_CODE(#n "B")          ///< Move cursor down
-#define ANSI_CURSOR_FORWARD(n)   CSI_CODE(#n "C")          ///< Move cursor forward
-#define ANSI_CURSOR_BACKWARD(n)  CSI_CODE(#n "D")          ///< Move cursor backward
-#define ANSI_CURSOR_LINE_DOWN(n) CSI_CODE(#n "E")          ///< Move cursor to the beginning of the line (n) down
-#define ANSI_CURSOR_LINE_UP(n)   CSI_CODE(#n "F")          ///< Move cursor to the beginning of the line (n) up
-#define ANSI_CURSOR_POSITION(n, m) CSI_CODE(#n ";" #m "H") ///< Move cursor to position (n, m)
-/** @} */
-
-//------------- Screen -------------//
-/** \defgroup group_ansi_screen Screen Control
- *  @{ */
-#define ANSI_ERASE_SCREEN(n)     CSI_CODE(#n "J") ///< Erase the screen
-#define ANSI_ERASE_LINE(n)       CSI_CODE(#n "K") ///< Erase the line (n)
-#define ANSI_SCROLL_UP(n)        CSI_CODE(#n "S") ///< Scroll the whole page up (n) lines
-#define ANSI_SCROLL_DOWN(n)      CSI_CODE(#n "T") ///< Scroll the whole page down (n) lines
-/** @} */
-
-//------------- Text Color -------------//
-/** \defgroup group_ansi_text Text Color
- *  @{ */
-#define ANSI_TEXT_BLACK          CSI_SGR(30)
-#define ANSI_TEXT_RED            CSI_SGR(31)
-#define ANSI_TEXT_GREEN          CSI_SGR(32)
-#define ANSI_TEXT_YELLOW         CSI_SGR(33)
-#define ANSI_TEXT_BLUE           CSI_SGR(34)
-#define ANSI_TEXT_MAGENTA        CSI_SGR(35)
-#define ANSI_TEXT_CYAN           CSI_SGR(36)
-#define ANSI_TEXT_WHITE          CSI_SGR(37)
-#define ANSI_TEXT_DEFAULT        CSI_SGR(39)
-/** @} */
-
-//------------- Background Color -------------//
-/** \defgroup group_ansi_background Background Color
- *  @{ */
-#define ANSI_BG_BLACK            CSI_SGR(40)
-#define ANSI_BG_RED              CSI_SGR(41)
-#define ANSI_BG_GREEN            CSI_SGR(42)
-#define ANSI_BG_YELLOW           CSI_SGR(43)
-#define ANSI_BG_BLUE             CSI_SGR(44)
-#define ANSI_BG_MAGENTA          CSI_SGR(45)
-#define ANSI_BG_CYAN             CSI_SGR(46)
-#define ANSI_BG_WHITE            CSI_SGR(47)
-#define ANSI_BG_DEFAULT          CSI_SGR(49)
-/** @} */
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif /* _TUSB_ANSI_ESC_CODE_H_ */
-
-/** @} */
+/**************************************************************************/
+/*!
+    @file     ansi_esc_code.h
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup group_board
+ *  \defgroup group_ansi_esc ANSI Esacpe Code
+ *  @{ */
+
+#ifndef _TUSB_ANSI_ESC_CODE_H_
+#define _TUSB_ANSI_ESC_CODE_H_
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#define CSI_CODE(seq)   "\33[" seq
+#define CSI_SGR(x)      CSI_CODE(#x) "m"
+
+//------------- Cursor movement -------------//
+/** \defgroup group_ansi_cursor Cursor Movement
+ *  @{ */
+#define ANSI_CURSOR_UP(n)        CSI_CODE(#n "A")          ///< Move cursor up
+#define ANSI_CURSOR_DOWN(n)      CSI_CODE(#n "B")          ///< Move cursor down
+#define ANSI_CURSOR_FORWARD(n)   CSI_CODE(#n "C")          ///< Move cursor forward
+#define ANSI_CURSOR_BACKWARD(n)  CSI_CODE(#n "D")          ///< Move cursor backward
+#define ANSI_CURSOR_LINE_DOWN(n) CSI_CODE(#n "E")          ///< Move cursor to the beginning of the line (n) down
+#define ANSI_CURSOR_LINE_UP(n)   CSI_CODE(#n "F")          ///< Move cursor to the beginning of the line (n) up
+#define ANSI_CURSOR_POSITION(n, m) CSI_CODE(#n ";" #m "H") ///< Move cursor to position (n, m)
+/** @} */
+
+//------------- Screen -------------//
+/** \defgroup group_ansi_screen Screen Control
+ *  @{ */
+#define ANSI_ERASE_SCREEN(n)     CSI_CODE(#n "J") ///< Erase the screen
+#define ANSI_ERASE_LINE(n)       CSI_CODE(#n "K") ///< Erase the line (n)
+#define ANSI_SCROLL_UP(n)        CSI_CODE(#n "S") ///< Scroll the whole page up (n) lines
+#define ANSI_SCROLL_DOWN(n)      CSI_CODE(#n "T") ///< Scroll the whole page down (n) lines
+/** @} */
+
+//------------- Text Color -------------//
+/** \defgroup group_ansi_text Text Color
+ *  @{ */
+#define ANSI_TEXT_BLACK          CSI_SGR(30)
+#define ANSI_TEXT_RED            CSI_SGR(31)
+#define ANSI_TEXT_GREEN          CSI_SGR(32)
+#define ANSI_TEXT_YELLOW         CSI_SGR(33)
+#define ANSI_TEXT_BLUE           CSI_SGR(34)
+#define ANSI_TEXT_MAGENTA        CSI_SGR(35)
+#define ANSI_TEXT_CYAN           CSI_SGR(36)
+#define ANSI_TEXT_WHITE          CSI_SGR(37)
+#define ANSI_TEXT_DEFAULT        CSI_SGR(39)
+/** @} */
+
+//------------- Background Color -------------//
+/** \defgroup group_ansi_background Background Color
+ *  @{ */
+#define ANSI_BG_BLACK            CSI_SGR(40)
+#define ANSI_BG_RED              CSI_SGR(41)
+#define ANSI_BG_GREEN            CSI_SGR(42)
+#define ANSI_BG_YELLOW           CSI_SGR(43)
+#define ANSI_BG_BLUE             CSI_SGR(44)
+#define ANSI_BG_MAGENTA          CSI_SGR(45)
+#define ANSI_BG_CYAN             CSI_SGR(46)
+#define ANSI_BG_WHITE            CSI_SGR(47)
+#define ANSI_BG_DEFAULT          CSI_SGR(49)
+/** @} */
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_ANSI_ESC_CODE_H_ */
+
+/** @} */

+ 111 - 111
boards/board.c → hw/boards/board.c

@@ -1,111 +1,111 @@
-/**************************************************************************/
-/*!
-    @file     board.c
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#include "board.h"
-#include "app_os_prio.h"
-
-#if TUSB_CFG_OS == TUSB_OS_NONE
-
-volatile uint32_t system_ticks = 0;
-
-void SysTick_Handler (void)
-{
-  system_ticks++;
-}
-
-uint32_t tusb_tick_get(void)
-{
-  return system_ticks;
-}
-
-#endif
-
-//--------------------------------------------------------------------+
-// BLINKING TASK
-//--------------------------------------------------------------------+
-static uint32_t led_blink_interval_ms = 1000; // default is 1 second
-
-void led_blinking_init(void)
-{
-  led_blink_interval_ms = 1000;
-  osal_task_create(led_blinking_task, "blinky", 128, NULL, LED_BLINKING_APP_TASK_PRIO);
-}
-
-void led_blinking_set_interval(uint32_t ms)
-{
-  led_blink_interval_ms = ms;
-}
-
-tusb_error_t led_blinking_subtask(void);
-void led_blinking_task(void* param)
-{
-  (void) param;
-
-  OSAL_TASK_BEGIN
-  led_blinking_subtask();
-  OSAL_TASK_END
-}
-
-tusb_error_t led_blinking_subtask(void)
-{
-  OSAL_SUBTASK_BEGIN
-
-  static uint32_t led_on_mask = 0;
-
-  osal_task_delay(led_blink_interval_ms);
-
-  board_leds(led_on_mask, 1 - led_on_mask);
-  led_on_mask = 1 - led_on_mask; // toggle
-
-//  uint32_t btn_mask;
-//  btn_mask = board_buttons();
-//
-//  for(uint8_t i=0; i<32; i++)
-//  {
-//    if ( BIT_TEST_(btn_mask, i) ) printf("button %d is pressed\n", i);
-//  }
-
-  OSAL_SUBTASK_END
-}
-
-// TODO remove legacy cmsis code
-void check_failed(uint8_t *file, uint32_t line)
-{
-  (void) file;
-  (void) line;
-}
+/**************************************************************************/
+/*!
+    @file     board.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "board.h"
+#include "app_os_prio.h"
+
+#if TUSB_CFG_OS == TUSB_OS_NONE
+
+volatile uint32_t system_ticks = 0;
+
+void SysTick_Handler (void)
+{
+  system_ticks++;
+}
+
+uint32_t tusb_tick_get(void)
+{
+  return system_ticks;
+}
+
+#endif
+
+//--------------------------------------------------------------------+
+// BLINKING TASK
+//--------------------------------------------------------------------+
+static uint32_t led_blink_interval_ms = 1000; // default is 1 second
+
+void led_blinking_init(void)
+{
+  led_blink_interval_ms = 1000;
+  osal_task_create(led_blinking_task, "blinky", 128, NULL, LED_BLINKING_APP_TASK_PRIO);
+}
+
+void led_blinking_set_interval(uint32_t ms)
+{
+  led_blink_interval_ms = ms;
+}
+
+tusb_error_t led_blinking_subtask(void);
+void led_blinking_task(void* param)
+{
+  (void) param;
+
+  OSAL_TASK_BEGIN
+  led_blinking_subtask();
+  OSAL_TASK_END
+}
+
+tusb_error_t led_blinking_subtask(void)
+{
+  OSAL_SUBTASK_BEGIN
+
+  static uint32_t led_on_mask = 0;
+
+  osal_task_delay(led_blink_interval_ms);
+
+  board_leds(led_on_mask, 1 - led_on_mask);
+  led_on_mask = 1 - led_on_mask; // toggle
+
+//  uint32_t btn_mask;
+//  btn_mask = board_buttons();
+//
+//  for(uint8_t i=0; i<32; i++)
+//  {
+//    if ( BIT_TEST_(btn_mask, i) ) printf("button %d is pressed\n", i);
+//  }
+
+  OSAL_SUBTASK_END
+}
+
+// TODO remove legacy cmsis code
+void check_failed(uint8_t *file, uint32_t line)
+{
+  (void) file;
+  (void) line;
+}

+ 174 - 174
boards/board.h → hw/boards/board.h

@@ -1,174 +1,174 @@
-/**************************************************************************/
-/*!
-    @file     board.h
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-/** \ingroup group_demo
- * \defgroup group_board Boards Abstraction Layer
- *  @{ */
-
-#ifndef _TUSB_BOARD_H_
-#define _TUSB_BOARD_H_
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-#include <stdint.h>
-#include <stdbool.h>
-
-#include "ansi_escape.h"
-#include "tusb.h"
-
-//--------------------------------------------------------------------+
-// BOARD DEFINE
-//--------------------------------------------------------------------+
-/** \defgroup group_supported_board Supported Boards
- *  @{ */
-#define BOARD_LPCXPRESSO11U14       1114 ///< LPCXpresso 11u14, some APIs requires the base board
-#define BOARD_LPCXPRESSO11U68       1168 ///< LPC11U37 from microbuilder http://www.microbuilder.eu/Blog/13-03-14/LPC1xxx_1GHZ_Wireless_Board_Preview.aspx
-#define BOARD_LPCXPRESSO1347        1347 ///< LPCXpresso 1347, some APIs requires the base board
-#define BOARD_LPCXPRESSO1769        1769 ///< LPCXpresso 1769, some APIs requires the base board
-
-#define BOARD_NGX4330               4330 ///< NGX 4330 Xplorer
-#define BOARD_EA4357                4357 ///< Embedded Artists LPC4357 developer kit
-#define BOARD_MCB4300               4300 ///< Keil MCB4300
-#define BOARD_HITEX4350             4350 ///< Hitex 4350
-
-#define BOARD_LPC4357USB            4304 ///< microbuilder.eu
-
-#define BOARD_LPCLINK2              4370 ///< LPClink2 uses as LPC4370 development board
-/** @} */
-
-//--------------------------------------------------------------------+
-// PRINTF TARGET DEFINE
-//--------------------------------------------------------------------+
-/** \defgroup group_printf Printf Retarget
- * \brief Retarget the standard stdio printf/getchar to other IOs
- *  @{ */
-#define PRINTF_TARGET_SEMIHOST      1 ///< Using the semihost support from toolchain, requires no hardware but is the slowest
-#define PRINTF_TARGET_UART          2 ///< Using UART as stdio, this is the default for most of the board
-#define PRINTF_TARGET_SWO           3 ///< Using non-instructive serial wire output (SWO), is the best option since it does not slow down MCU but requires supported from debugger and IDE
-#define PRINTF_TARGET_NONE          4 ///< Using none at all.
-/** @} */
-
-#define PRINTF(...) printf(__VA_ARGS__)
-
-//--------------------------------------------------------------------+
-// BOARD INCLUDE
-//--------------------------------------------------------------------+
-#if BOARD == BOARD_LPCXPRESSO11U14
-  #include "lpcxpresso/board_lpcxpresso11u14.h"
-#elif BOARD == BOARD_LPCXPRESSO11U68
-  #include "lpcxpresso/board_lpcxpresso11u68.h"
-#elif BOARD == BOARD_LPCXPRESSO1347
-  #include "lpcxpresso/board_lpcxpresso1347.h"
-#elif BOARD == BOARD_LPCXPRESSO1769
-  #include "lpcxpresso/board_lpcxpresso1769.h"
-#elif BOARD == BOARD_NGX4330
-  #include "ngx/board_ngx4330.h"
-#elif BOARD == BOARD_EA4357
-  #include "embedded_artists/ea4357/board_ea4357.h"
-#elif BOARD == BOARD_MCB4300
-  #include "keil/board_mcb4300.h"
-#elif BOARD == BOARD_HITEX4350
-  #include "hitex/board_hitex4350.h"
-#elif BOARD == BOARD_LPC4357USB
-  #include "microbuilder/board_lpc4357usb.h"
-#elif BOARD == BOARD_LPCLINK2
- #include "lpcxpresso/board_lpclink2.h"
-#else
-  #error BOARD is not defined or supported yet
-#endif
-
-//--------------------------------------------------------------------+
-// Common Configuration
-//--------------------------------------------------------------------+
-#define CFG_UART_BAUDRATE    115200 ///< Baudrate for UART
-
-//--------------------------------------------------------------------+
-// Board Common API
-//--------------------------------------------------------------------+
-/** \defgroup group_board_api Board API
- * \brief All the board must support these APIs.
- *  @{ */
-
-/// Initialize all required peripherals on board including uart, led, buttons etc ...
-void board_init(void);
-
-/** \brief Turns on and off leds on the board
- * \param[in]  on_mask  Bitmask for LED's numbers is turning ON
- * \param[out] off_mask Bitmask for LED's numbers is turning OFF
- * \note the \a on_mask is more priority then \a off_mask, if an led's number is present on both.
- * It will be turned ON.
- */
-void board_leds(uint32_t on_mask, uint32_t off_mask);
-
-/** \brief Get the current state of the buttons on the board
- * \return Bitmask where a '1' means active (pressed), a '0' means inactive.
- */
-uint32_t board_buttons(void);
-
-/** \brief Get a character input from UART
- * \return ASCII code of the input character or zero if none.
- */
-uint8_t  board_uart_getchar(void);
-
-/** \brief Send a character to UART
- * \param[in]  c the character to be sent
- */
-void board_uart_putchar(uint8_t c);
-
-/** @} */
-
-//------------- Board Application  -------------//
-void led_blinking_task(void* param);
-
-/// Initialize the LED blinking task application. The initial blinking rate is 1 Hert (1 per second)
-void led_blinking_init(void);
-
-/** \brief Change the blinking rate.
- * \param[in]  ms The interval between on and off.
- */
-void led_blinking_set_interval(uint32_t ms);
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif /* _TUSB_BOARD_H_ */
-
-/** @} */
+/**************************************************************************/
+/*!
+    @file     board.h
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup group_demo
+ * \defgroup group_board Boards Abstraction Layer
+ *  @{ */
+
+#ifndef _TUSB_BOARD_H_
+#define _TUSB_BOARD_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "ansi_escape.h"
+#include "tusb.h"
+
+//--------------------------------------------------------------------+
+// BOARD DEFINE
+//--------------------------------------------------------------------+
+/** \defgroup group_supported_board Supported Boards
+ *  @{ */
+#define BOARD_LPCXPRESSO11U14       1114 ///< LPCXpresso 11u14, some APIs requires the base board
+#define BOARD_LPCXPRESSO11U68       1168 ///< LPC11U37 from microbuilder http://www.microbuilder.eu/Blog/13-03-14/LPC1xxx_1GHZ_Wireless_Board_Preview.aspx
+#define BOARD_LPCXPRESSO1347        1347 ///< LPCXpresso 1347, some APIs requires the base board
+#define BOARD_LPCXPRESSO1769        1769 ///< LPCXpresso 1769, some APIs requires the base board
+
+#define BOARD_NGX4330               4330 ///< NGX 4330 Xplorer
+#define BOARD_EA4357                4357 ///< Embedded Artists LPC4357 developer kit
+#define BOARD_MCB4300               4300 ///< Keil MCB4300
+#define BOARD_HITEX4350             4350 ///< Hitex 4350
+
+#define BOARD_LPC4357USB            4304 ///< microbuilder.eu
+
+#define BOARD_LPCLINK2              4370 ///< LPClink2 uses as LPC4370 development board
+/** @} */
+
+//--------------------------------------------------------------------+
+// PRINTF TARGET DEFINE
+//--------------------------------------------------------------------+
+/** \defgroup group_printf Printf Retarget
+ * \brief Retarget the standard stdio printf/getchar to other IOs
+ *  @{ */
+#define PRINTF_TARGET_SEMIHOST      1 ///< Using the semihost support from toolchain, requires no hardware but is the slowest
+#define PRINTF_TARGET_UART          2 ///< Using UART as stdio, this is the default for most of the board
+#define PRINTF_TARGET_SWO           3 ///< Using non-instructive serial wire output (SWO), is the best option since it does not slow down MCU but requires supported from debugger and IDE
+#define PRINTF_TARGET_NONE          4 ///< Using none at all.
+/** @} */
+
+#define PRINTF(...) printf(__VA_ARGS__)
+
+//--------------------------------------------------------------------+
+// BOARD INCLUDE
+//--------------------------------------------------------------------+
+#if BOARD == BOARD_LPCXPRESSO11U14
+  #include "lpcxpresso/board_lpcxpresso11u14.h"
+#elif BOARD == BOARD_LPCXPRESSO11U68
+  #include "lpcxpresso/board_lpcxpresso11u68.h"
+#elif BOARD == BOARD_LPCXPRESSO1347
+  #include "lpcxpresso/board_lpcxpresso1347.h"
+#elif BOARD == BOARD_LPCXPRESSO1769
+  #include "lpcxpresso/board_lpcxpresso1769.h"
+#elif BOARD == BOARD_NGX4330
+  #include "ngx/board_ngx4330.h"
+#elif BOARD == BOARD_EA4357
+  #include "embedded_artists/ea4357/board_ea4357.h"
+#elif BOARD == BOARD_MCB4300
+  #include "keil/board_mcb4300.h"
+#elif BOARD == BOARD_HITEX4350
+  #include "hitex/board_hitex4350.h"
+#elif BOARD == BOARD_LPC4357USB
+  #include "microbuilder/board_lpc4357usb.h"
+#elif BOARD == BOARD_LPCLINK2
+ #include "lpcxpresso/board_lpclink2.h"
+#else
+  #error BOARD is not defined or supported yet
+#endif
+
+//--------------------------------------------------------------------+
+// Common Configuration
+//--------------------------------------------------------------------+
+#define CFG_UART_BAUDRATE    115200 ///< Baudrate for UART
+
+//--------------------------------------------------------------------+
+// Board Common API
+//--------------------------------------------------------------------+
+/** \defgroup group_board_api Board API
+ * \brief All the board must support these APIs.
+ *  @{ */
+
+/// Initialize all required peripherals on board including uart, led, buttons etc ...
+void board_init(void);
+
+/** \brief Turns on and off leds on the board
+ * \param[in]  on_mask  Bitmask for LED's numbers is turning ON
+ * \param[out] off_mask Bitmask for LED's numbers is turning OFF
+ * \note the \a on_mask is more priority then \a off_mask, if an led's number is present on both.
+ * It will be turned ON.
+ */
+void board_leds(uint32_t on_mask, uint32_t off_mask);
+
+/** \brief Get the current state of the buttons on the board
+ * \return Bitmask where a '1' means active (pressed), a '0' means inactive.
+ */
+uint32_t board_buttons(void);
+
+/** \brief Get a character input from UART
+ * \return ASCII code of the input character or zero if none.
+ */
+uint8_t  board_uart_getchar(void);
+
+/** \brief Send a character to UART
+ * \param[in]  c the character to be sent
+ */
+void board_uart_putchar(uint8_t c);
+
+/** @} */
+
+//------------- Board Application  -------------//
+void led_blinking_task(void* param);
+
+/// Initialize the LED blinking task application. The initial blinking rate is 1 Hert (1 per second)
+void led_blinking_init(void);
+
+/** \brief Change the blinking rate.
+ * \param[in]  ms The interval between on and off.
+ */
+void led_blinking_set_interval(uint32_t ms);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_BOARD_H_ */
+
+/** @} */

+ 153 - 153
boards/embedded_artists/ea4357/board_ea4357.c → hw/boards/embedded_artists/ea4357/board_ea4357.c

@@ -1,153 +1,153 @@
-/**************************************************************************/
-/*!
-    @file     board_ea4357.c
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#include "../../board.h"
-
-#if BOARD == BOARD_EA4357
-
-#define BOARD_UART_PORT           LPC_USART0
-#define BOARD_UART_PIN_PORT       0x0f
-#define BOARD_UART_PIN_TX         10 // PF.10 : UART0_TXD
-#define BOARD_UART_PIN_RX         11 // PF.11 : UART0_RXD
-
-static const struct {
-  uint8_t mux_port;
-  uint8_t mux_pin;
-
-  uint8_t gpio_port;
-  uint8_t gpio_pin;
-}buttons[] =
-{
-    {0x0a, 3, 4, 10 }, // Joystick up
-    {0x09, 1, 4, 13 }, // Joystick down
-    {0x0a, 2, 4, 9  }, // Joystick left
-    {0x09, 0, 4, 12 }, // Joystick right
-    {0x0a, 1, 4, 8  }, // Joystick press
-    {0x02, 7, 0, 7  }, // SW6
-};
-
-enum {
-  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
-};
-
-void board_init(void)
-{
-  CGU_Init();
-
-#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
-  SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE) / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
-#endif
-
-  //------------- USB -------------//
-  // USB0 Power: EA4357 channel B U20 GPIO26 active low (base board), P2_3 on LPC4357
-  scu_pinmux(0x02, 3, MD_PUP | MD_EZI, FUNC7);		// USB0 VBus Power
-
-  #if TUSB_CFG_CONTROLLER_0_MODE & TUSB_MODE_DEVICE
-  scu_pinmux(0x09, 5, GPIO_PDN, FUNC4); // P9_5 (GPIO5[18]) (GPIO28 on oem base) as USB connect, active low.
-  GPIO_SetDir(5, BIT_(18), 1);
-  #endif
-
-  // USB1 Power: EA4357 channel A U20 is enabled by SJ5 connected to pad 1-2, no more action required
-  // TODO Remove R170, R171, solder a pair of 15K to USB1 D+/D- to test with USB1 Host
-
-  //------------- LED -------------//
-  I2C_Init(LPC_I2C0, 100000);
-  I2C_Cmd(LPC_I2C0, ENABLE);
-  pca9532_init();
-
-  //------------- BUTTON -------------//
-  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++)
-  {
-    scu_pinmux(buttons[i].mux_port, buttons[i].mux_pin, GPIO_NOPULL, FUNC0);
-    GPIO_SetDir(buttons[i].gpio_port, BIT_(buttons[i].gpio_pin), 0);
-  }
-
-  //------------- UART -------------//
-  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN, FUNC1);
-  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN | MD_EZI | MD_ZI, FUNC1);
-
-  UART_CFG_Type UARTConfigStruct;
-  UART_ConfigStructInit(&UARTConfigStruct);
-  UARTConfigStruct.Baud_rate   = CFG_UART_BAUDRATE;
-  UARTConfigStruct.Clock_Speed = 0;
-
-  UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
-  UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit
-
-  //------------- NAND Flash (K9FXX) Size = 128M, Page Size = 2K, Block Size = 128K, Number of Block = 1024 -------------//
-//  nand_init();
-}
-
-//--------------------------------------------------------------------+
-// LEDS
-//--------------------------------------------------------------------+
-void board_leds(uint32_t on_mask, uint32_t off_mask)
-{
-  pca9532_setLeds( on_mask << 8, off_mask << 8);
-}
-
-//--------------------------------------------------------------------+
-// BUTTONS
-//--------------------------------------------------------------------+
-static bool button_read(uint8_t id)
-{
-  return !BIT_TEST_( GPIO_ReadValue(buttons[id].gpio_port), buttons[id].gpio_pin ); // button is active low
-}
-
-uint32_t board_buttons(void)
-{
-  uint32_t result = 0;
-
-  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0);
-
-  return result;
-}
-
-//--------------------------------------------------------------------+
-// UART
-//--------------------------------------------------------------------+
-uint8_t  board_uart_getchar(void)
-{
-  return UART_ReceiveByte(BOARD_UART_PORT);
-}
-void board_uart_putchar(uint8_t c)
-{
-  UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);
-}
-
-#endif
+/**************************************************************************/
+/*!
+    @file     board_ea4357.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "../../board.h"
+
+#if BOARD == BOARD_EA4357
+
+#define BOARD_UART_PORT           LPC_USART0
+#define BOARD_UART_PIN_PORT       0x0f
+#define BOARD_UART_PIN_TX         10 // PF.10 : UART0_TXD
+#define BOARD_UART_PIN_RX         11 // PF.11 : UART0_RXD
+
+static const struct {
+  uint8_t mux_port;
+  uint8_t mux_pin;
+
+  uint8_t gpio_port;
+  uint8_t gpio_pin;
+}buttons[] =
+{
+    {0x0a, 3, 4, 10 }, // Joystick up
+    {0x09, 1, 4, 13 }, // Joystick down
+    {0x0a, 2, 4, 9  }, // Joystick left
+    {0x09, 0, 4, 12 }, // Joystick right
+    {0x0a, 1, 4, 8  }, // Joystick press
+    {0x02, 7, 0, 7  }, // SW6
+};
+
+enum {
+  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
+};
+
+void board_init(void)
+{
+  CGU_Init();
+
+#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
+  SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE) / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
+#endif
+
+  //------------- USB -------------//
+  // USB0 Power: EA4357 channel B U20 GPIO26 active low (base board), P2_3 on LPC4357
+  scu_pinmux(0x02, 3, MD_PUP | MD_EZI, FUNC7);		// USB0 VBus Power
+
+  #if TUSB_CFG_CONTROLLER_0_MODE & TUSB_MODE_DEVICE
+  scu_pinmux(0x09, 5, GPIO_PDN, FUNC4); // P9_5 (GPIO5[18]) (GPIO28 on oem base) as USB connect, active low.
+  GPIO_SetDir(5, BIT_(18), 1);
+  #endif
+
+  // USB1 Power: EA4357 channel A U20 is enabled by SJ5 connected to pad 1-2, no more action required
+  // TODO Remove R170, R171, solder a pair of 15K to USB1 D+/D- to test with USB1 Host
+
+  //------------- LED -------------//
+  I2C_Init(LPC_I2C0, 100000);
+  I2C_Cmd(LPC_I2C0, ENABLE);
+  pca9532_init();
+
+  //------------- BUTTON -------------//
+  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++)
+  {
+    scu_pinmux(buttons[i].mux_port, buttons[i].mux_pin, GPIO_NOPULL, FUNC0);
+    GPIO_SetDir(buttons[i].gpio_port, BIT_(buttons[i].gpio_pin), 0);
+  }
+
+  //------------- UART -------------//
+  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN, FUNC1);
+  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN | MD_EZI | MD_ZI, FUNC1);
+
+  UART_CFG_Type UARTConfigStruct;
+  UART_ConfigStructInit(&UARTConfigStruct);
+  UARTConfigStruct.Baud_rate   = CFG_UART_BAUDRATE;
+  UARTConfigStruct.Clock_Speed = 0;
+
+  UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
+  UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit
+
+  //------------- NAND Flash (K9FXX) Size = 128M, Page Size = 2K, Block Size = 128K, Number of Block = 1024 -------------//
+//  nand_init();
+}
+
+//--------------------------------------------------------------------+
+// LEDS
+//--------------------------------------------------------------------+
+void board_leds(uint32_t on_mask, uint32_t off_mask)
+{
+  pca9532_setLeds( on_mask << 8, off_mask << 8);
+}
+
+//--------------------------------------------------------------------+
+// BUTTONS
+//--------------------------------------------------------------------+
+static bool button_read(uint8_t id)
+{
+  return !BIT_TEST_( GPIO_ReadValue(buttons[id].gpio_port), buttons[id].gpio_pin ); // button is active low
+}
+
+uint32_t board_buttons(void)
+{
+  uint32_t result = 0;
+
+  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0);
+
+  return result;
+}
+
+//--------------------------------------------------------------------+
+// UART
+//--------------------------------------------------------------------+
+uint8_t  board_uart_getchar(void)
+{
+  return UART_ReceiveByte(BOARD_UART_PORT);
+}
+void board_uart_putchar(uint8_t c)
+{
+  UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);
+}
+
+#endif

+ 65 - 65
boards/embedded_artists/ea4357/board_ea4357.h → hw/boards/embedded_artists/ea4357/board_ea4357.h

@@ -1,65 +1,65 @@
-/**************************************************************************/
-/*!
-    @file     board_ea4357.h
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#ifndef _TUSB_BOARD_EA4357_H_
-#define _TUSB_BOARD_EA4357_H_
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-#include "LPC43xx.h"
-#include "lpc43xx_scu.h"
-#include "lpc43xx_cgu.h"
-#include "lpc43xx_gpio.h"
-#include "lpc43xx_uart.h"
-#include "lpc43xx_i2c.h"
-
-
-#include "../oem_base_board/pca9532.h" // LEDs
-//#include "../oem_board/nand.h"a
-
-
-//#define CFG_PRINTF_TARGET       PRINTF_TARGET_SWO
-#define CFG_PRINTF_TARGET       PRINTF_TARGET_UART
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif /* _TUSB_BOARD_EA4357_H_ */
+/**************************************************************************/
+/*!
+    @file     board_ea4357.h
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#ifndef _TUSB_BOARD_EA4357_H_
+#define _TUSB_BOARD_EA4357_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "LPC43xx.h"
+#include "lpc43xx_scu.h"
+#include "lpc43xx_cgu.h"
+#include "lpc43xx_gpio.h"
+#include "lpc43xx_uart.h"
+#include "lpc43xx_i2c.h"
+
+
+#include "../oem_base_board/pca9532.h" // LEDs
+//#include "../oem_board/nand.h"a
+
+
+//#define CFG_PRINTF_TARGET       PRINTF_TARGET_SWO
+#define CFG_PRINTF_TARGET       PRINTF_TARGET_UART
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_BOARD_EA4357_H_ */

+ 480 - 480
boards/embedded_artists/ea4357/emac.c → hw/boards/embedded_artists/ea4357/emac.c

@@ -1,480 +1,480 @@
-/******************************************************************
- *****                                                        *****
- *****  Name: cs8900.c                                        *****
- *****  Ver.: 1.0                                             *****
- *****  Date: 07/05/2001                                      *****
- *****  Auth: Andreas Dannenberg                              *****
- *****        HTWK Leipzig                                    *****
- *****        university of applied sciences                  *****
- *****        Germany                                         *****
- *****  Func: ethernet packet-driver for use with LAN-        *****
- *****        controller CS8900 from Crystal/Cirrus Logic     *****
- *****                                                        *****
- *****  NXP: Module modified for use with NXP            	  *****
- *****        lpc43xx EMAC Ethernet controller                *****
- *****                                                        *****
- ******************************************************************/
-
-#include "../../board.h"
-
-#if BOARD == BOARD_EA4357
-
-#include "emac.h"
-//#include "tcpip.h"
-#include "LPC43xx.h"
-#include "lpc43xx_scu.h"
-#include "lpc43xx_rgu.h"
-
-#define		TIMEOUT		100000
-
-static unsigned short *rptr;
-static unsigned short *tptr;
-
-static unsigned int TxDescIndex = 0;
-static unsigned int RxDescIndex = 0;
-
-// Keil: function added to write PHY
-static void write_PHY (unsigned int PhyReg, unsigned short Value) {
-   
-   unsigned int tout;
-
-   /* Write a data 'Value' to PHY register 'PhyReg'. */
-   while(LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY);			// Check GMII busy bit
-   LPC_ETHERNET->MAC_MII_ADDR = (DP83848C_DEF_ADR<<11) | (PhyReg<<6) | GMII_WRITE;
-   LPC_ETHERNET->MAC_MII_DATA = Value;
-   LPC_ETHERNET->MAC_MII_ADDR |= GMII_BUSY;				// Start PHY Write Cycle
-
-   /* Wait utill operation completed */
-   for (tout = 0; tout < MII_WR_TOUT; tout++) {
-      if ((LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY) == 0) {
-         break;
-      }
-   }
-   if (tout == MII_WR_TOUT)								// Trap the timeout
-     while(1);
-}
-
-
-// Keil: function added to read PHY
-static unsigned short read_PHY (unsigned int PhyReg) {
-   
-   unsigned int tout, val;
-
-   /* Read a PHY register 'PhyReg'. */
-   while(LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY);			// Check GMII busy bit
-   LPC_ETHERNET->MAC_MII_ADDR = (DP83848C_DEF_ADR<<11) | (PhyReg<<6) | GMII_READ;
-   LPC_ETHERNET->MAC_MII_ADDR |= GMII_BUSY;				// Start PHY Read Cycle
-
-   /* Wait until operation completed */
-   for (tout = 0; tout < MII_RD_TOUT; tout++) {
-      if ((LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY) == 0) {
-         break;
-      }
-   }
-   if (tout == MII_RD_TOUT)								// Trap the timeout
-     while(1);
-   val = LPC_ETHERNET->MAC_MII_DATA;
-   return (val);
-}
-
-
-// Keil: function added to initialize Rx Descriptors
-void rx_descr_init (void)
-{
-  unsigned int i;
-
-  for (i = 0; i < NUM_RX_DESC; i++) {
-    RX_DESC_STAT(i) = OWN_BIT; 
-	RX_DESC_CTRL(i) = ETH_FRAG_SIZE;
-	RX_BUFADDR(i) = RX_BUF(i); 
-	if (i == (NUM_RX_DESC-1)) 			// Last Descriptor?
-	  RX_DESC_CTRL(i) |= RX_END_RING;
-  }
-
-  /* Set Starting address of RX Descriptor list */
-  LPC_ETHERNET->DMA_REC_DES_ADDR = RX_DESC_BASE;
-}
-
-
-// Keil: function added to initialize Tx Descriptors
-void tx_descr_init (void)
-{
-  unsigned int i;
-
-  for (i = 0; i < NUM_TX_DESC; i++) {						// Take it out!!!!
-	 TX_DESC_STAT(i) = 0;
-	 TX_DESC_CTRL(i) = 0;
-	 TX_BUFADDR(i) = 0;
-  }
-
-  for (i = 0; i < NUM_TX_DESC; i++) {
-    TX_DESC_STAT(i) = TX_LAST_SEGM | TX_FIRST_SEGM;
-	TX_DESC_CTRL(i) = 0;
-	TX_BUFADDR(i) = TX_BUF(i); 
-	if (i == (NUM_TX_DESC-1)) 		   // Last Descriptor?
-	  TX_DESC_STAT(i) |= TX_END_RING;
-  }
-
-  /* Set Starting address of RX Descriptor list */
-  LPC_ETHERNET->DMA_TRANS_DES_ADDR = TX_DESC_BASE;
-}
-
-
-
-// configure port-pins for use with LAN-controller,
-// reset it and send the configuration-sequence
-
-void Init_EMAC(void)
-{
-  int id1, id2, tout, regv;
-  unsigned phy_in_use = 0;
-  
-  /* Ethernet pins configuration		*/
-#if MII  
-  scu_pinmux(0xC ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_MDC: PC_1 -> FUNC3
-  scu_pinmux(0x1 ,17 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_MDIO: P1_17 -> FUNC3 
-  scu_pinmux(0x1 ,18 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD0: P1_18 -> FUNC3 
-  scu_pinmux(0x1 ,20 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD1: P1_20 -> FUNC3
-  scu_pinmux(0x1 ,19 , (MD_PLN | MD_EZI | MD_ZI), FUNC0); 	// ENET_REF: P1_19 -> FUNC0 (default)
-
-//  scu_pinmux(0xC ,4 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TX_EN: PC_4 -> FUNC3
-  scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC6); 	// ENET_TX_EN: P0_1 -> FUNC6
-
-  scu_pinmux(0x1 ,15 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXD0: P1_15 -> FUNC3
-  scu_pinmux(0x0 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC2); 	// ENET_RXD1: P0_0 -> FUNC2	
-
-//  scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_CRS: P1_16 -> FUNC3
-  scu_pinmux(0x9 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_CRS: P9_0 -> FUNC5
-
-//  scu_pinmux(0xC ,9 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RX_ER: PC_9 -> FUNC3
-  scu_pinmux(0x9 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);	// ENET_RX_ER: P9_1 -> FUNC5
-
-//  scu_pinmux(0xC ,8 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXDV: PC_8 -> FUNC3	 	
-  scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC7); 	// ENET_RXDV: P1_16 -> FUNC7	 	
-
-#else
-  scu_pinmux(0xC ,1 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_MDC: PC_1 -> FUNC3
-  scu_pinmux(0x1 ,17 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_MDIO: P1_17 -> FUNC3 
-  scu_pinmux(0x1 ,18 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD0: P1_18 -> FUNC3 
-  scu_pinmux(0x1 ,20 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD1: P1_20 -> FUNC3
-  scu_pinmux(0x1 ,19 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC0); 	// ENET_REF: P1_19 -> FUNC0 (default)
-//  scu_pinmux(0xC ,4 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TX_EN: PC_4 -> FUNC3
-  scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC6); 	// ENET_TX_EN: P0_1 -> FUNC6
-  scu_pinmux(0x1 ,15 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXD0: P1_15 -> FUNC3
-  scu_pinmux(0x0 ,0 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC2); 	// ENET_RXD1: P0_0 -> FUNC2	
-//  scu_pinmux(0x1 ,16 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_CRS: P1_16 -> FUNC3
-//  scu_pinmux(0x9 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_CRS: P9_0 -> FUNC5
-//  scu_pinmux(0xC ,9 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RX_ER: PC_9 -> FUNC3
-//  scu_pinmux(0x9 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);	// ENET_RX_ER: P9_1 -> FUNC5
-//  scu_pinmux(0xC ,8 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXDV: PC_8 -> FUNC3
-  scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC7); 	// ENET_RXDV: P1_16 -> FUNC7
-#endif
- 
-  
-#if MII				  /*   Select MII interface       */				 // check MUXING for new Eagle...
-//  scu_pinmux(0xC ,6 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXD2: PC_6 -> FUNC3
-  scu_pinmux(0x9 ,3 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_RXD2: P9_3 -> FUNC5
-
-//  scu_pinmux(0xC ,7 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXD3: PC_7 -> FUNC3
-  scu_pinmux(0x9 ,2 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_RXD3: P9_2 -> FUNC5
-
-  scu_pinmux(0xC ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC3);  // ENET_RXLK: PC_0 -> FUNC3
-
-//  scu_pinmux(0xC ,2 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD2: PC_2 -> FUNC3
-  scu_pinmux(0x9 ,4 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_TXD2: P9_4 -> FUNC5
-
-//  scu_pinmux(0xC ,3 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD3: PC_3 -> FUNC3
-  scu_pinmux(0x9 ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_TXD3: P9_5 -> FUNC5
-
-//  scu_pinmux(0xC ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TX_ER:  PC_5 -> FUNC3
-  scu_pinmux(0xC ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TX_ER:  PC_5 -> FUNC3
-  
-//  scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC2); 	// ENET_COL:  P0_1 -> FUNC2
-    scu_pinmux(0x9 ,6 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_COL:  P9_6 -> FUNC5
-#else				   /*   Select RMII interface     */
-  LPC_CREG->CREG6 |= RMII_SELECT;
-#endif
-
-
-  RGU_SoftReset(RGU_SIG_ETHERNET);
-  while(1){													  // Confirm the reset happened
-	 if (LPC_RGU->RESET_ACTIVE_STATUS0 & (1<<ETHERNET_RST))
-	   break;
-  }
-
-  LPC_ETHERNET->DMA_BUS_MODE |= DMA_SOFT_RESET; 	         // Reset all GMAC Subsystem internal registers and logic  
-  while(LPC_ETHERNET->DMA_BUS_MODE & DMA_SOFT_RESET);	     // Wait for software reset completion
-
-  /* Put the DP83848C in reset mode */
-  write_PHY (PHY_REG_BMCR, PHY_BMCR_RESET);
-
-  /* Wait for hardware reset to end. */
-  for (tout = 0; tout < TIMEOUT; tout++) {
-    regv = read_PHY (PHY_REG_BMCR);
-    if (!(regv & PHY_BMCR_RESET)) {
-      /* Reset complete */
-      break;
-    }
-  }
-
-  /* Check if this is a DP83848C PHY. */
-  id1 = read_PHY (PHY_REG_IDR1);
-  id2 = read_PHY (PHY_REG_IDR2);
-  if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID) {
-    phy_in_use =  DP83848C_ID;
-  }
-  else if (((id1 << 16) | (id2 & 0xFFF0)) == LAN8720_ID) {
-    phy_in_use = LAN8720_ID;
-  }
-
-  if (phy_in_use != 0) {
-	/* Configure the PHY device */
-#if !MII
-  write_PHY (PHY_REG_RBR, 0x20);
-#endif
-
-    /* Use autonegotiation about the link speed. */
-    write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
-    /* Wait to complete Auto_Negotiation. */
-    for (tout = 0; tout < TIMEOUT; tout++) {
-      regv = read_PHY (PHY_REG_BMSR);
-      if (regv & PHY_AUTO_NEG_DONE) {
-        /* Autonegotiation Complete. */
-        break;
-      }
-    }
-  }
-
-
-
-  /* Check the link status. */
-  for (tout = 0; tout < TIMEOUT; tout++) {
-    regv = read_PHY (PHY_REG_STS);
-    if (regv & LINK_VALID_STS) {
-      /* Link is on. */
-      break;
-    }
-  }
-  
-  // Configure the EMAC with the established parameters
-  switch (phy_in_use) {
-  	  case DP83848C_ID:
-
-        /* Configure Full/Half Duplex mode. */
-        if (regv & FULL_DUP_STS) {
-          /* Full duplex is enabled. */
-          LPC_ETHERNET->MAC_CONFIG    |= MAC_DUPMODE;
-        }
-
-        /* Configure 100MBit/10MBit mode. */
-        if (~(regv & SPEED_10M_STS)) {
-          /* 100MBit mode. */
-          LPC_ETHERNET->MAC_CONFIG    |= MAC_100MPS;
-        }
-      
-//   		  value = ReadFromPHY (PHY_REG_STS);	/* PHY Extended Status Register  */
-//   		  // Now configure for full/half duplex mode
-//   		  if (value & 0x0004) {
-//   		    // We are in full duplex is enabled mode
-//   			  LPC_ETHERNET->MAC2    |= MAC2_FULL_DUP;
-//   			  LPC_ETHERNET->Command |= CR_FULL_DUP;
-//   			  LPC_ETHERNET->IPGT     = IPGT_FULL_DUP;
-//   		  }
-//   		  else {
-//   		    // Otherwise we are in half duplex mode
-//   			  LPC_ETHERNET->IPGT = IPGT_HALF_DUP;
-//   		  }
-
-//   		  // Now configure 100MBit or 10MBit mode
-//   		  if (value & 0x0002) {
-//   		    // 10MBit mode
-//   			  LPC_ETHERNET->SUPP = 0;
-//   		  }
-//   		  else {
-//   		    // 100MBit mode
-//   			  LPC_ETHERNET->SUPP = SUPP_SPEED;
-//   		  }
-  		  break;
-
-  	  case LAN8720_ID:
-
-  		  regv = read_PHY (PHY_REG_SCSR);	/* PHY Extended Status Register  */
-  		  // Now configure for full/half duplex mode
-  		  if (regv & (1<<4)) {		/* bit 4: 1 = Full Duplex, 0 = Half Duplex  */
-    		  // We are in full duplex is enabled mode
-          LPC_ETHERNET->MAC_CONFIG    |= MAC_DUPMODE;
-  		  }
-
-  		  // Now configure 100MBit or 10MBit mode
-  		  if (regv & (1<<3)) {	/* bit 3: 1 = 100Mbps, 0 = 10Mbps  */
-  			  // 100MBit mode
-          LPC_ETHERNET->MAC_CONFIG    |= MAC_100MPS;
-  		  }
-
-
-  		  break;
-
-  }
-   
-  /* Set the Ethernet MAC Address registers */
-  LPC_ETHERNET->MAC_ADDR0_HIGH = (MYMAC_6 << 8) | MYMAC_5;
-  LPC_ETHERNET->MAC_ADDR0_LOW =	(MYMAC_4 << 24) | (MYMAC_3 << 16) | (MYMAC_2 << 8) | MYMAC_1;
-
-  /* Initialize Descriptor Lists    */
-  rx_descr_init();
-  tx_descr_init();
-  
-  /* Configure Filter           */  
-  LPC_ETHERNET->MAC_FRAME_FILTER = MAC_PROMISCUOUS | MAC_RECEIVEALL;
-
-  /* Enable Receiver and Transmitter   */
-  LPC_ETHERNET->MAC_CONFIG |= (MAC_TX_ENABLE | MAC_RX_ENABLE); 
-
-  /* Enable interrupts    */
-  //LPC_ETHERNET->DMA_INT_EN =  DMA_INT_NOR_SUM | DMA_INT_RECEIVE | DMA_INT_TRANSMIT;	 
-
-  /* Start Transmission & Receive processes   */
-  LPC_ETHERNET->DMA_OP_MODE |= (DMA_SS_TRANSMIT | DMA_SS_RECEIVE );		 
-
-}
-
-
-// reads a word in little-endian byte order from RX_BUFFER
-
-unsigned short ReadFrame_EMAC(void)
-{
-  return (*rptr++);
-}
-
-
-// easyWEB internal function
-// help function to swap the byte order of a WORD
-
-unsigned short SwapBytes(unsigned short Data)
-{
-  return (Data >> 8) | (Data << 8);
-}
-
-// reads a word in big-endian byte order from RX_FRAME_PORT
-// (useful to avoid permanent byte-swapping while reading
-// TCP/IP-data)
-
-unsigned short ReadFrameBE_EMAC(void)
-{
-  unsigned short ReturnValue;
-
-  ReturnValue = SwapBytes (*rptr++);
-  return (ReturnValue);
-}
-
-
-// copies bytes from frame port to MCU-memory
-// NOTES: * an odd number of byte may only be transfered
-//          if the frame is read to the end!
-//        * MCU-memory MUST start at word-boundary
-
-void CopyFromFrame_EMAC(void *Dest, unsigned short Size)
-{
-  unsigned short * piDest;                       // Keil: Pointer added to correct expression
-
-  piDest = Dest;                                 // Keil: Line added
-  while (Size > 1) {
-    *piDest++ = ReadFrame_EMAC();
-    Size -= 2;
-  }
-  
-  if (Size) {                                         // check for leftover byte...
-    *(unsigned char *)piDest = (char)ReadFrame_EMAC();// the LAN-Controller will return 0
-  }                                                   // for the highbyte
-}
-
-// does a dummy read on frame-I/O-port
-// NOTE: only an even number of bytes is read!
-
-void DummyReadFrame_EMAC(unsigned short Size)    // discards an EVEN number of bytes
-{                                                // from RX-fifo
-  while (Size > 1) {
-    ReadFrame_EMAC();
-    Size -= 2;
-  }
-}
-
-// Reads the length of the received ethernet frame and checks if the 
-// destination address is a broadcast message or not
-// returns the frame length
-unsigned short StartReadFrame(void) {
-  unsigned short RxLen;
-
-  if ((RX_DESC_STAT(RxDescIndex) & OWN_BIT) == 0) {
-    RxLen = (RX_DESC_STAT(RxDescIndex) >> 16) & 0x03FFF; 
-	rptr = 	(unsigned short *)RX_BUFADDR(RxDescIndex);
-	return(RxLen);
-  }
-  return 0;
-
-}
-
-void EndReadFrame(void) {
-
-  RX_DESC_STAT(RxDescIndex) = OWN_BIT;
-  RxDescIndex++;
-  if (RxDescIndex == NUM_RX_DESC)
-	RxDescIndex = 0;
-}
-
-unsigned int CheckFrameReceived(void) {             // Packet received ?
-
-  if ((RX_DESC_STAT(RxDescIndex) & OWN_BIT) == 0) 		
-    return(1);
-  else 
-    return(0);
-}
-
-// requests space in EMAC memory for storing an outgoing frame
-
-void RequestSend(unsigned short FrameSize)
-{
-  tptr = (unsigned short *)TX_BUFADDR(TxDescIndex);
-  TX_DESC_CTRL(TxDescIndex)	= FrameSize;
-}
-
-// check if ethernet controller is ready to accept the
-// frame we want to send
-
-unsigned int Rdy4Tx(void)
-{
-  return (1);   // the ethernet controller transmits much faster
-}               // than the CPU can load its buffers
-
-
-// writes a word in little-endian byte order to TX_BUFFER
-void WriteFrame_EMAC(unsigned short Data)
-{
-  *tptr++ = Data;
-}
-
-// copies bytes from MCU-memory to frame port
-// NOTES: * an odd number of byte may only be transfered
-//          if the frame is written to the end!
-//        * MCU-memory MUST start at word-boundary
-
-void CopyToFrame_EMAC(void *Source, unsigned int Size)
-{
-  unsigned short * piSource;
-//  unsigned int idx;
-
-  piSource = Source;
-  Size = (Size + 1) & 0xFFFE;    // round Size up to next even number
-  while (Size > 0) {
-    WriteFrame_EMAC(*piSource++);
-    Size -= 2;
-  }
-  TX_DESC_STAT(TxDescIndex) |= OWN_BIT;
-  LPC_ETHERNET->DMA_TRANS_POLL_DEMAND = 1;   //  Wake Up the DMA if it's in Suspended Mode
-  TxDescIndex++;
-  if (TxDescIndex == NUM_TX_DESC)
-    TxDescIndex = 0;
-}
-
-#endif
-
+/******************************************************************
+ *****                                                        *****
+ *****  Name: cs8900.c                                        *****
+ *****  Ver.: 1.0                                             *****
+ *****  Date: 07/05/2001                                      *****
+ *****  Auth: Andreas Dannenberg                              *****
+ *****        HTWK Leipzig                                    *****
+ *****        university of applied sciences                  *****
+ *****        Germany                                         *****
+ *****  Func: ethernet packet-driver for use with LAN-        *****
+ *****        controller CS8900 from Crystal/Cirrus Logic     *****
+ *****                                                        *****
+ *****  NXP: Module modified for use with NXP            	  *****
+ *****        lpc43xx EMAC Ethernet controller                *****
+ *****                                                        *****
+ ******************************************************************/
+
+#include "../../board.h"
+
+#if BOARD == BOARD_EA4357
+
+#include "emac.h"
+//#include "tcpip.h"
+#include "LPC43xx.h"
+#include "lpc43xx_scu.h"
+#include "lpc43xx_rgu.h"
+
+#define		TIMEOUT		100000
+
+static unsigned short *rptr;
+static unsigned short *tptr;
+
+static unsigned int TxDescIndex = 0;
+static unsigned int RxDescIndex = 0;
+
+// Keil: function added to write PHY
+static void write_PHY (unsigned int PhyReg, unsigned short Value) {
+   
+   unsigned int tout;
+
+   /* Write a data 'Value' to PHY register 'PhyReg'. */
+   while(LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY);			// Check GMII busy bit
+   LPC_ETHERNET->MAC_MII_ADDR = (DP83848C_DEF_ADR<<11) | (PhyReg<<6) | GMII_WRITE;
+   LPC_ETHERNET->MAC_MII_DATA = Value;
+   LPC_ETHERNET->MAC_MII_ADDR |= GMII_BUSY;				// Start PHY Write Cycle
+
+   /* Wait utill operation completed */
+   for (tout = 0; tout < MII_WR_TOUT; tout++) {
+      if ((LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY) == 0) {
+         break;
+      }
+   }
+   if (tout == MII_WR_TOUT)								// Trap the timeout
+     while(1);
+}
+
+
+// Keil: function added to read PHY
+static unsigned short read_PHY (unsigned int PhyReg) {
+   
+   unsigned int tout, val;
+
+   /* Read a PHY register 'PhyReg'. */
+   while(LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY);			// Check GMII busy bit
+   LPC_ETHERNET->MAC_MII_ADDR = (DP83848C_DEF_ADR<<11) | (PhyReg<<6) | GMII_READ;
+   LPC_ETHERNET->MAC_MII_ADDR |= GMII_BUSY;				// Start PHY Read Cycle
+
+   /* Wait until operation completed */
+   for (tout = 0; tout < MII_RD_TOUT; tout++) {
+      if ((LPC_ETHERNET->MAC_MII_ADDR & GMII_BUSY) == 0) {
+         break;
+      }
+   }
+   if (tout == MII_RD_TOUT)								// Trap the timeout
+     while(1);
+   val = LPC_ETHERNET->MAC_MII_DATA;
+   return (val);
+}
+
+
+// Keil: function added to initialize Rx Descriptors
+void rx_descr_init (void)
+{
+  unsigned int i;
+
+  for (i = 0; i < NUM_RX_DESC; i++) {
+    RX_DESC_STAT(i) = OWN_BIT; 
+	RX_DESC_CTRL(i) = ETH_FRAG_SIZE;
+	RX_BUFADDR(i) = RX_BUF(i); 
+	if (i == (NUM_RX_DESC-1)) 			// Last Descriptor?
+	  RX_DESC_CTRL(i) |= RX_END_RING;
+  }
+
+  /* Set Starting address of RX Descriptor list */
+  LPC_ETHERNET->DMA_REC_DES_ADDR = RX_DESC_BASE;
+}
+
+
+// Keil: function added to initialize Tx Descriptors
+void tx_descr_init (void)
+{
+  unsigned int i;
+
+  for (i = 0; i < NUM_TX_DESC; i++) {						// Take it out!!!!
+	 TX_DESC_STAT(i) = 0;
+	 TX_DESC_CTRL(i) = 0;
+	 TX_BUFADDR(i) = 0;
+  }
+
+  for (i = 0; i < NUM_TX_DESC; i++) {
+    TX_DESC_STAT(i) = TX_LAST_SEGM | TX_FIRST_SEGM;
+	TX_DESC_CTRL(i) = 0;
+	TX_BUFADDR(i) = TX_BUF(i); 
+	if (i == (NUM_TX_DESC-1)) 		   // Last Descriptor?
+	  TX_DESC_STAT(i) |= TX_END_RING;
+  }
+
+  /* Set Starting address of RX Descriptor list */
+  LPC_ETHERNET->DMA_TRANS_DES_ADDR = TX_DESC_BASE;
+}
+
+
+
+// configure port-pins for use with LAN-controller,
+// reset it and send the configuration-sequence
+
+void Init_EMAC(void)
+{
+  int id1, id2, tout, regv;
+  unsigned phy_in_use = 0;
+  
+  /* Ethernet pins configuration		*/
+#if MII  
+  scu_pinmux(0xC ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_MDC: PC_1 -> FUNC3
+  scu_pinmux(0x1 ,17 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_MDIO: P1_17 -> FUNC3 
+  scu_pinmux(0x1 ,18 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD0: P1_18 -> FUNC3 
+  scu_pinmux(0x1 ,20 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD1: P1_20 -> FUNC3
+  scu_pinmux(0x1 ,19 , (MD_PLN | MD_EZI | MD_ZI), FUNC0); 	// ENET_REF: P1_19 -> FUNC0 (default)
+
+//  scu_pinmux(0xC ,4 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TX_EN: PC_4 -> FUNC3
+  scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC6); 	// ENET_TX_EN: P0_1 -> FUNC6
+
+  scu_pinmux(0x1 ,15 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXD0: P1_15 -> FUNC3
+  scu_pinmux(0x0 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC2); 	// ENET_RXD1: P0_0 -> FUNC2	
+
+//  scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_CRS: P1_16 -> FUNC3
+  scu_pinmux(0x9 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_CRS: P9_0 -> FUNC5
+
+//  scu_pinmux(0xC ,9 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RX_ER: PC_9 -> FUNC3
+  scu_pinmux(0x9 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);	// ENET_RX_ER: P9_1 -> FUNC5
+
+//  scu_pinmux(0xC ,8 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXDV: PC_8 -> FUNC3	 	
+  scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC7); 	// ENET_RXDV: P1_16 -> FUNC7	 	
+
+#else
+  scu_pinmux(0xC ,1 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_MDC: PC_1 -> FUNC3
+  scu_pinmux(0x1 ,17 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_MDIO: P1_17 -> FUNC3 
+  scu_pinmux(0x1 ,18 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD0: P1_18 -> FUNC3 
+  scu_pinmux(0x1 ,20 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD1: P1_20 -> FUNC3
+  scu_pinmux(0x1 ,19 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC0); 	// ENET_REF: P1_19 -> FUNC0 (default)
+//  scu_pinmux(0xC ,4 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TX_EN: PC_4 -> FUNC3
+  scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC6); 	// ENET_TX_EN: P0_1 -> FUNC6
+  scu_pinmux(0x1 ,15 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXD0: P1_15 -> FUNC3
+  scu_pinmux(0x0 ,0 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC2); 	// ENET_RXD1: P0_0 -> FUNC2	
+//  scu_pinmux(0x1 ,16 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_CRS: P1_16 -> FUNC3
+//  scu_pinmux(0x9 ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_CRS: P9_0 -> FUNC5
+//  scu_pinmux(0xC ,9 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RX_ER: PC_9 -> FUNC3
+//  scu_pinmux(0x9 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC5);	// ENET_RX_ER: P9_1 -> FUNC5
+//  scu_pinmux(0xC ,8 , (MD_EHS | MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXDV: PC_8 -> FUNC3
+  scu_pinmux(0x1 ,16 , (MD_PLN | MD_EZI | MD_ZI), FUNC7); 	// ENET_RXDV: P1_16 -> FUNC7
+#endif
+ 
+  
+#if MII				  /*   Select MII interface       */				 // check MUXING for new Eagle...
+//  scu_pinmux(0xC ,6 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXD2: PC_6 -> FUNC3
+  scu_pinmux(0x9 ,3 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_RXD2: P9_3 -> FUNC5
+
+//  scu_pinmux(0xC ,7 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_RXD3: PC_7 -> FUNC3
+  scu_pinmux(0x9 ,2 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_RXD3: P9_2 -> FUNC5
+
+  scu_pinmux(0xC ,0 , (MD_PLN | MD_EZI | MD_ZI), FUNC3);  // ENET_RXLK: PC_0 -> FUNC3
+
+//  scu_pinmux(0xC ,2 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD2: PC_2 -> FUNC3
+  scu_pinmux(0x9 ,4 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_TXD2: P9_4 -> FUNC5
+
+//  scu_pinmux(0xC ,3 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TXD3: PC_3 -> FUNC3
+  scu_pinmux(0x9 ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_TXD3: P9_5 -> FUNC5
+
+//  scu_pinmux(0xC ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TX_ER:  PC_5 -> FUNC3
+  scu_pinmux(0xC ,5 , (MD_PLN | MD_EZI | MD_ZI), FUNC3); 	// ENET_TX_ER:  PC_5 -> FUNC3
+  
+//  scu_pinmux(0x0 ,1 , (MD_PLN | MD_EZI | MD_ZI), FUNC2); 	// ENET_COL:  P0_1 -> FUNC2
+    scu_pinmux(0x9 ,6 , (MD_PLN | MD_EZI | MD_ZI), FUNC5); 	// ENET_COL:  P9_6 -> FUNC5
+#else				   /*   Select RMII interface     */
+  LPC_CREG->CREG6 |= RMII_SELECT;
+#endif
+
+
+  RGU_SoftReset(RGU_SIG_ETHERNET);
+  while(1){													  // Confirm the reset happened
+	 if (LPC_RGU->RESET_ACTIVE_STATUS0 & (1<<ETHERNET_RST))
+	   break;
+  }
+
+  LPC_ETHERNET->DMA_BUS_MODE |= DMA_SOFT_RESET; 	         // Reset all GMAC Subsystem internal registers and logic  
+  while(LPC_ETHERNET->DMA_BUS_MODE & DMA_SOFT_RESET);	     // Wait for software reset completion
+
+  /* Put the DP83848C in reset mode */
+  write_PHY (PHY_REG_BMCR, PHY_BMCR_RESET);
+
+  /* Wait for hardware reset to end. */
+  for (tout = 0; tout < TIMEOUT; tout++) {
+    regv = read_PHY (PHY_REG_BMCR);
+    if (!(regv & PHY_BMCR_RESET)) {
+      /* Reset complete */
+      break;
+    }
+  }
+
+  /* Check if this is a DP83848C PHY. */
+  id1 = read_PHY (PHY_REG_IDR1);
+  id2 = read_PHY (PHY_REG_IDR2);
+  if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID) {
+    phy_in_use =  DP83848C_ID;
+  }
+  else if (((id1 << 16) | (id2 & 0xFFF0)) == LAN8720_ID) {
+    phy_in_use = LAN8720_ID;
+  }
+
+  if (phy_in_use != 0) {
+	/* Configure the PHY device */
+#if !MII
+  write_PHY (PHY_REG_RBR, 0x20);
+#endif
+
+    /* Use autonegotiation about the link speed. */
+    write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
+    /* Wait to complete Auto_Negotiation. */
+    for (tout = 0; tout < TIMEOUT; tout++) {
+      regv = read_PHY (PHY_REG_BMSR);
+      if (regv & PHY_AUTO_NEG_DONE) {
+        /* Autonegotiation Complete. */
+        break;
+      }
+    }
+  }
+
+
+
+  /* Check the link status. */
+  for (tout = 0; tout < TIMEOUT; tout++) {
+    regv = read_PHY (PHY_REG_STS);
+    if (regv & LINK_VALID_STS) {
+      /* Link is on. */
+      break;
+    }
+  }
+  
+  // Configure the EMAC with the established parameters
+  switch (phy_in_use) {
+  	  case DP83848C_ID:
+
+        /* Configure Full/Half Duplex mode. */
+        if (regv & FULL_DUP_STS) {
+          /* Full duplex is enabled. */
+          LPC_ETHERNET->MAC_CONFIG    |= MAC_DUPMODE;
+        }
+
+        /* Configure 100MBit/10MBit mode. */
+        if (~(regv & SPEED_10M_STS)) {
+          /* 100MBit mode. */
+          LPC_ETHERNET->MAC_CONFIG    |= MAC_100MPS;
+        }
+      
+//   		  value = ReadFromPHY (PHY_REG_STS);	/* PHY Extended Status Register  */
+//   		  // Now configure for full/half duplex mode
+//   		  if (value & 0x0004) {
+//   		    // We are in full duplex is enabled mode
+//   			  LPC_ETHERNET->MAC2    |= MAC2_FULL_DUP;
+//   			  LPC_ETHERNET->Command |= CR_FULL_DUP;
+//   			  LPC_ETHERNET->IPGT     = IPGT_FULL_DUP;
+//   		  }
+//   		  else {
+//   		    // Otherwise we are in half duplex mode
+//   			  LPC_ETHERNET->IPGT = IPGT_HALF_DUP;
+//   		  }
+
+//   		  // Now configure 100MBit or 10MBit mode
+//   		  if (value & 0x0002) {
+//   		    // 10MBit mode
+//   			  LPC_ETHERNET->SUPP = 0;
+//   		  }
+//   		  else {
+//   		    // 100MBit mode
+//   			  LPC_ETHERNET->SUPP = SUPP_SPEED;
+//   		  }
+  		  break;
+
+  	  case LAN8720_ID:
+
+  		  regv = read_PHY (PHY_REG_SCSR);	/* PHY Extended Status Register  */
+  		  // Now configure for full/half duplex mode
+  		  if (regv & (1<<4)) {		/* bit 4: 1 = Full Duplex, 0 = Half Duplex  */
+    		  // We are in full duplex is enabled mode
+          LPC_ETHERNET->MAC_CONFIG    |= MAC_DUPMODE;
+  		  }
+
+  		  // Now configure 100MBit or 10MBit mode
+  		  if (regv & (1<<3)) {	/* bit 3: 1 = 100Mbps, 0 = 10Mbps  */
+  			  // 100MBit mode
+          LPC_ETHERNET->MAC_CONFIG    |= MAC_100MPS;
+  		  }
+
+
+  		  break;
+
+  }
+   
+  /* Set the Ethernet MAC Address registers */
+  LPC_ETHERNET->MAC_ADDR0_HIGH = (MYMAC_6 << 8) | MYMAC_5;
+  LPC_ETHERNET->MAC_ADDR0_LOW =	(MYMAC_4 << 24) | (MYMAC_3 << 16) | (MYMAC_2 << 8) | MYMAC_1;
+
+  /* Initialize Descriptor Lists    */
+  rx_descr_init();
+  tx_descr_init();
+  
+  /* Configure Filter           */  
+  LPC_ETHERNET->MAC_FRAME_FILTER = MAC_PROMISCUOUS | MAC_RECEIVEALL;
+
+  /* Enable Receiver and Transmitter   */
+  LPC_ETHERNET->MAC_CONFIG |= (MAC_TX_ENABLE | MAC_RX_ENABLE); 
+
+  /* Enable interrupts    */
+  //LPC_ETHERNET->DMA_INT_EN =  DMA_INT_NOR_SUM | DMA_INT_RECEIVE | DMA_INT_TRANSMIT;	 
+
+  /* Start Transmission & Receive processes   */
+  LPC_ETHERNET->DMA_OP_MODE |= (DMA_SS_TRANSMIT | DMA_SS_RECEIVE );		 
+
+}
+
+
+// reads a word in little-endian byte order from RX_BUFFER
+
+unsigned short ReadFrame_EMAC(void)
+{
+  return (*rptr++);
+}
+
+
+// easyWEB internal function
+// help function to swap the byte order of a WORD
+
+unsigned short SwapBytes(unsigned short Data)
+{
+  return (Data >> 8) | (Data << 8);
+}
+
+// reads a word in big-endian byte order from RX_FRAME_PORT
+// (useful to avoid permanent byte-swapping while reading
+// TCP/IP-data)
+
+unsigned short ReadFrameBE_EMAC(void)
+{
+  unsigned short ReturnValue;
+
+  ReturnValue = SwapBytes (*rptr++);
+  return (ReturnValue);
+}
+
+
+// copies bytes from frame port to MCU-memory
+// NOTES: * an odd number of byte may only be transfered
+//          if the frame is read to the end!
+//        * MCU-memory MUST start at word-boundary
+
+void CopyFromFrame_EMAC(void *Dest, unsigned short Size)
+{
+  unsigned short * piDest;                       // Keil: Pointer added to correct expression
+
+  piDest = Dest;                                 // Keil: Line added
+  while (Size > 1) {
+    *piDest++ = ReadFrame_EMAC();
+    Size -= 2;
+  }
+  
+  if (Size) {                                         // check for leftover byte...
+    *(unsigned char *)piDest = (char)ReadFrame_EMAC();// the LAN-Controller will return 0
+  }                                                   // for the highbyte
+}
+
+// does a dummy read on frame-I/O-port
+// NOTE: only an even number of bytes is read!
+
+void DummyReadFrame_EMAC(unsigned short Size)    // discards an EVEN number of bytes
+{                                                // from RX-fifo
+  while (Size > 1) {
+    ReadFrame_EMAC();
+    Size -= 2;
+  }
+}
+
+// Reads the length of the received ethernet frame and checks if the 
+// destination address is a broadcast message or not
+// returns the frame length
+unsigned short StartReadFrame(void) {
+  unsigned short RxLen;
+
+  if ((RX_DESC_STAT(RxDescIndex) & OWN_BIT) == 0) {
+    RxLen = (RX_DESC_STAT(RxDescIndex) >> 16) & 0x03FFF; 
+	rptr = 	(unsigned short *)RX_BUFADDR(RxDescIndex);
+	return(RxLen);
+  }
+  return 0;
+
+}
+
+void EndReadFrame(void) {
+
+  RX_DESC_STAT(RxDescIndex) = OWN_BIT;
+  RxDescIndex++;
+  if (RxDescIndex == NUM_RX_DESC)
+	RxDescIndex = 0;
+}
+
+unsigned int CheckFrameReceived(void) {             // Packet received ?
+
+  if ((RX_DESC_STAT(RxDescIndex) & OWN_BIT) == 0) 		
+    return(1);
+  else 
+    return(0);
+}
+
+// requests space in EMAC memory for storing an outgoing frame
+
+void RequestSend(unsigned short FrameSize)
+{
+  tptr = (unsigned short *)TX_BUFADDR(TxDescIndex);
+  TX_DESC_CTRL(TxDescIndex)	= FrameSize;
+}
+
+// check if ethernet controller is ready to accept the
+// frame we want to send
+
+unsigned int Rdy4Tx(void)
+{
+  return (1);   // the ethernet controller transmits much faster
+}               // than the CPU can load its buffers
+
+
+// writes a word in little-endian byte order to TX_BUFFER
+void WriteFrame_EMAC(unsigned short Data)
+{
+  *tptr++ = Data;
+}
+
+// copies bytes from MCU-memory to frame port
+// NOTES: * an odd number of byte may only be transfered
+//          if the frame is written to the end!
+//        * MCU-memory MUST start at word-boundary
+
+void CopyToFrame_EMAC(void *Source, unsigned int Size)
+{
+  unsigned short * piSource;
+//  unsigned int idx;
+
+  piSource = Source;
+  Size = (Size + 1) & 0xFFFE;    // round Size up to next even number
+  while (Size > 0) {
+    WriteFrame_EMAC(*piSource++);
+    Size -= 2;
+  }
+  TX_DESC_STAT(TxDescIndex) |= OWN_BIT;
+  LPC_ETHERNET->DMA_TRANS_POLL_DEMAND = 1;   //  Wake Up the DMA if it's in Suspended Mode
+  TxDescIndex++;
+  if (TxDescIndex == NUM_TX_DESC)
+    TxDescIndex = 0;
+}
+
+#endif
+

+ 157 - 157
boards/embedded_artists/ea4357/emac.h → hw/boards/embedded_artists/ea4357/emac.h

@@ -1,157 +1,157 @@
-#ifndef __EMAC_H
-#define __EMAC_H
-
-
-/* Configuration */
-
-/* Interface Selection */
-#define MII				0		// =0 RMII  -  =1 MII
-
-/* MAC Configuration */
-#define MYMAC_1         0x1EU            /* our ethernet (MAC) address        */
-#define MYMAC_2         0x30U            /* (MUST be unique in LAN!)          */
-#define MYMAC_3         0x6cU
-#define MYMAC_4         0xa2U
-#define MYMAC_5         0x45U
-#define MYMAC_6         0x5eU
-
-
-#define ETH_FRAG_SIZE		1536		
-#define NUM_RX_DESC			3
-#define NUM_TX_DESC			3
-
-/* End of Configuration   */
-
-
-/* EMAC Descriptors and Buffers located in 16K SRAM */
-/*  Rx Descriptors   */
-#define RX_DESC_BASE		0x20008000
-#define RX_STAT_BASE		RX_DESC_BASE
-#define RX_CTRL_BASE		(RX_STAT_BASE + 4)
-#define RX_BUFADDR_BASE		(RX_CTRL_BASE + 4)
-#define RX_NEXTDESC_BASE	(RX_BUFADDR_BASE + 4)
-#define RX_BUF_BASE			(RX_DESC_BASE + NUM_RX_DESC*16)	 
-
-#define RX_DESC_STAT(i)		(*(unsigned int *)(RX_STAT_BASE + 16*i))	 
-#define RX_DESC_CTRL(i)		(*(unsigned int *)(RX_CTRL_BASE + 16*i))
-#define RX_BUFADDR(i)		(*(unsigned int *)(RX_BUFADDR_BASE + 16*i))
-#define RX_NEXTDESC(i)		(*(unsigned int *)(RX_NEXTDESC_BASE + 16*i))
-#define RX_BUF(i)			(RX_BUF_BASE + ETH_FRAG_SIZE*i)
-
-/*  Tx Descriptors   */
-#define TX_DESC_BASE		RX_BUF_BASE + (ETH_FRAG_SIZE * NUM_RX_DESC)
-#define TX_STAT_BASE		TX_DESC_BASE
-#define TX_CTRL_BASE		(TX_STAT_BASE + 4)
-#define TX_BUFADDR_BASE		(TX_CTRL_BASE + 4)
-#define TX_NEXTDESC_BASE	(TX_BUFADDR_BASE + 4)
-#define TX_BUF_BASE			(TX_DESC_BASE + NUM_TX_DESC*16)
-
-#define TX_DESC_STAT(i)		(*(unsigned int *)(TX_STAT_BASE + 16*i))
-#define TX_DESC_CTRL(i)		(*(unsigned int *)(TX_CTRL_BASE + 16*i))
-#define TX_BUFADDR(i)		(*(unsigned int *)(TX_BUFADDR_BASE + 16*i))
-#define TX_NEXTDESC(i)		(*(unsigned int *)(TX_NEXTDESC_BASE + 16*i))
-#define TX_BUF(i)			(TX_BUF_BASE + ETH_FRAG_SIZE*i)		
-
-/*  Descriptors Fields bits       */
-#define OWN_BIT				(1U<<31)	/*  Own bit in RDES0 & TDES0              */
-#define RX_END_RING			(1<<15)		/*  Receive End of Ring bit in RDES1      */
-#define RX_NXTDESC_FLAG		(1<<14)		/*  Second Address Chained bit in RDES1   */
-#define TX_LAST_SEGM		(1<<29)		/*  Last Segment bit in TDES0             */
-#define TX_FIRST_SEGM		(1<<28)		/*  First Segment bit in TDES0            */
-#define TX_END_RING			(1<<21)		/*  Transmit End of Ring bit in TDES0     */
-#define TX_NXTDESC_FLAG		(1<<20)		/*  Second Address Chained bit in TDES0   */
-
-
-
-
-
-/* EMAC Control and Status bits   */
-#define MAC_RX_ENABLE	 (1<<2)			/*  Receiver Enable in MAC_CONFIG reg      */
-#define MAC_TX_ENABLE	 (1<<3)			/*  Transmitter Enable in MAC_CONFIG reg   */
-#define MAC_PADCRC_STRIP (1<<7)			/*  Automatic Pad-CRC Stripping in MAC_CONFIG reg   */
-#define MAC_DUPMODE		 (1<<11)		/*  Duplex Mode in  MAC_CONFIG reg         */
-#define MAC_100MPS		 (1<<14)		/*  Speed is 100Mbps in MAC_CONFIG reg     */
-#define MAC_PROMISCUOUS  (1U<<0)		/*  Promiscuous Mode bit in MAC_FRAME_FILTER reg    */
-#define MAC_DIS_BROAD    (1U<<5)		/*  Disable Broadcast Frames bit in	MAC_FRAME_FILTER reg    */
-#define MAC_RECEIVEALL   (1U<<31)       /*  Receive All bit in MAC_FRAME_FILTER reg    */
-#define DMA_SOFT_RESET	  0x01          /*  Software Reset bit in DMA_BUS_MODE reg */
-#define DMA_SS_RECEIVE   (1<<1)         /*  Start/Stop Receive bit in DMA_OP_MODE reg  */
-#define DMA_SS_TRANSMIT  (1<<13)        /*  Start/Stop Transmission bit in DMA_OP_MODE reg  */
-#define DMA_INT_TRANSMIT (1<<0)         /*  Transmit Interrupt Enable bit in DMA_INT_EN reg */
-#define DMA_INT_OVERFLOW (1<<4)         /*  Overflow Interrupt Enable bit in DMA_INT_EN reg */ 
-#define DMA_INT_UNDERFLW (1<<5)         /*  Underflow Interrupt Enable bit in DMA_INT_EN reg */
-#define DMA_INT_RECEIVE  (1<<6)         /*  Receive Interrupt Enable bit in DMA_INT_EN reg */
-#define DMA_INT_ABN_SUM  (1<<15)        /*  Abnormal Interrupt Summary Enable bit in DMA_INT_EN reg */
-#define DMA_INT_NOR_SUM  (1<<16)        /*  Normal Interrupt Summary Enable bit in DMA_INT_EN reg */
-
-/* MII Management Command Register */
-#define GMII_READ           (0<<1)		/* GMII Read PHY                     */
-#define GMII_WRITE          (1<<1)      /* GMII Write PHY                    */
-#define GMII_BUSY           0x00000001  /* GMII is Busy / Start Read/Write   */
-#define MII_WR_TOUT         0x00050000  /* MII Write timeout count           */
-#define MII_RD_TOUT         0x00050000  /* MII Read timeout count            */
-
-/* MII Management Address Register */
-#define MADR_PHY_ADR        0x00001F00  /* PHY Address Mask                  */
-
-/* DP83848C PHY Registers */
-#define PHY_REG_BMCR        0x00        /* Basic Mode Control Register       */
-#define PHY_REG_BMSR        0x01        /* Basic Mode Status Register        */
-#define PHY_REG_IDR1        0x02        /* PHY Identifier 1                  */
-#define PHY_REG_IDR2        0x03        /* PHY Identifier 2                  */
-#define PHY_REG_ANAR        0x04        /* Auto-Negotiation Advertisement    */
-#define PHY_REG_ANLPAR      0x05        /* Auto-Neg. Link Partner Abitily    */
-#define PHY_REG_ANER        0x06        /* Auto-Neg. Expansion Register      */
-#define PHY_REG_ANNPTR      0x07        /* Auto-Neg. Next Page TX            */
-
-/* PHY Extended Registers */
-#define PHY_REG_STS         0x10        /* Status Register                   */
-#define PHY_REG_MICR        0x11        /* MII Interrupt Control Register    */
-#define PHY_REG_MISR        0x12        /* MII Interrupt Status Register     */
-#define PHY_REG_FCSCR       0x14        /* False Carrier Sense Counter       */
-#define PHY_REG_RECR        0x15        /* Receive Error Counter             */
-#define PHY_REG_PCSR        0x16        /* PCS Sublayer Config. and Status   */
-#define PHY_REG_RBR         0x17        /* RMII and Bypass Register          */
-#define PHY_REG_LEDCR       0x18        /* LED Direct Control Register       */
-#define PHY_REG_PHYCR       0x19        /* PHY Control Register              */
-#define PHY_REG_10BTSCR     0x1A        /* 10Base-T Status/Control Register  */
-#define PHY_REG_CDCTRL1     0x1B        /* CD Test Control and BIST Extens.  */
-#define PHY_REG_EDCR        0x1D        /* Energy Detect Control Register    */
-
-/* PHY Control and Status bits  */
-#define PHY_FULLD_100M      0x2100      /* Full Duplex 100Mbit               */
-#define PHY_HALFD_100M      0x2000      /* Half Duplex 100Mbit               */
-#define PHY_FULLD_10M       0x0100      /* Full Duplex 10Mbit                */
-#define PHY_HALFD_10M       0x0000      /* Half Duplex 10MBit                */
-#define PHY_AUTO_NEG        0x1000      /* Select Auto Negotiation           */
-#define PHY_AUTO_NEG_DONE   0x0020		/* AutoNegotiation Complete in BMSR PHY reg  */
-#define PHY_BMCR_RESET		0x8000		/* Reset bit at BMCR PHY reg         */
-#define LINK_VALID_STS		0x0001		/* Link Valid Status at REG_STS PHY reg	 */
-#define FULL_DUP_STS		0x0004		/* Full Duplex Status at REG_STS PHY reg */
-#define SPEED_10M_STS		0x0002		/* 10Mbps Status at REG_STS PHY reg */
-
-#define DP83848C_DEF_ADR    0x01        /* Default PHY device address        */
-#define DP83848C_ID         0x20005C90  /* PHY Identifier (without Rev. info */
-
-#define LAN8720_ID          0x0007C0F0  /* PHY Identifier                    */
-#define PHY_REG_SCSR		0x1F		/* PHY Special Control/Status Register */
-
-/*  Misc    */
-#define ETHERNET_RST		22			/* 	Reset Output for EMAC at RGU     */
-#define RMII_SELECT			0x04		/*  Select RMII in EMACCFG           */
-
-
-/*  Prototypes               */
-void           Init_EMAC(void);
-unsigned short ReadFrameBE_EMAC(void);
-void           CopyToFrame_EMAC(void *Source, unsigned int Size);
-void           CopyFromFrame_EMAC(void *Dest, unsigned short Size);
-void           DummyReadFrame_EMAC(unsigned short Size);
-unsigned short StartReadFrame(void);
-void           EndReadFrame(void);
-unsigned int   CheckFrameReceived(void);
-void           RequestSend(unsigned short FrameSize);
-unsigned int   Rdy4Tx(void);
-
-
-#endif
+#ifndef __EMAC_H
+#define __EMAC_H
+
+
+/* Configuration */
+
+/* Interface Selection */
+#define MII				0		// =0 RMII  -  =1 MII
+
+/* MAC Configuration */
+#define MYMAC_1         0x1EU            /* our ethernet (MAC) address        */
+#define MYMAC_2         0x30U            /* (MUST be unique in LAN!)          */
+#define MYMAC_3         0x6cU
+#define MYMAC_4         0xa2U
+#define MYMAC_5         0x45U
+#define MYMAC_6         0x5eU
+
+
+#define ETH_FRAG_SIZE		1536		
+#define NUM_RX_DESC			3
+#define NUM_TX_DESC			3
+
+/* End of Configuration   */
+
+
+/* EMAC Descriptors and Buffers located in 16K SRAM */
+/*  Rx Descriptors   */
+#define RX_DESC_BASE		0x20008000
+#define RX_STAT_BASE		RX_DESC_BASE
+#define RX_CTRL_BASE		(RX_STAT_BASE + 4)
+#define RX_BUFADDR_BASE		(RX_CTRL_BASE + 4)
+#define RX_NEXTDESC_BASE	(RX_BUFADDR_BASE + 4)
+#define RX_BUF_BASE			(RX_DESC_BASE + NUM_RX_DESC*16)	 
+
+#define RX_DESC_STAT(i)		(*(unsigned int *)(RX_STAT_BASE + 16*i))	 
+#define RX_DESC_CTRL(i)		(*(unsigned int *)(RX_CTRL_BASE + 16*i))
+#define RX_BUFADDR(i)		(*(unsigned int *)(RX_BUFADDR_BASE + 16*i))
+#define RX_NEXTDESC(i)		(*(unsigned int *)(RX_NEXTDESC_BASE + 16*i))
+#define RX_BUF(i)			(RX_BUF_BASE + ETH_FRAG_SIZE*i)
+
+/*  Tx Descriptors   */
+#define TX_DESC_BASE		RX_BUF_BASE + (ETH_FRAG_SIZE * NUM_RX_DESC)
+#define TX_STAT_BASE		TX_DESC_BASE
+#define TX_CTRL_BASE		(TX_STAT_BASE + 4)
+#define TX_BUFADDR_BASE		(TX_CTRL_BASE + 4)
+#define TX_NEXTDESC_BASE	(TX_BUFADDR_BASE + 4)
+#define TX_BUF_BASE			(TX_DESC_BASE + NUM_TX_DESC*16)
+
+#define TX_DESC_STAT(i)		(*(unsigned int *)(TX_STAT_BASE + 16*i))
+#define TX_DESC_CTRL(i)		(*(unsigned int *)(TX_CTRL_BASE + 16*i))
+#define TX_BUFADDR(i)		(*(unsigned int *)(TX_BUFADDR_BASE + 16*i))
+#define TX_NEXTDESC(i)		(*(unsigned int *)(TX_NEXTDESC_BASE + 16*i))
+#define TX_BUF(i)			(TX_BUF_BASE + ETH_FRAG_SIZE*i)		
+
+/*  Descriptors Fields bits       */
+#define OWN_BIT				(1U<<31)	/*  Own bit in RDES0 & TDES0              */
+#define RX_END_RING			(1<<15)		/*  Receive End of Ring bit in RDES1      */
+#define RX_NXTDESC_FLAG		(1<<14)		/*  Second Address Chained bit in RDES1   */
+#define TX_LAST_SEGM		(1<<29)		/*  Last Segment bit in TDES0             */
+#define TX_FIRST_SEGM		(1<<28)		/*  First Segment bit in TDES0            */
+#define TX_END_RING			(1<<21)		/*  Transmit End of Ring bit in TDES0     */
+#define TX_NXTDESC_FLAG		(1<<20)		/*  Second Address Chained bit in TDES0   */
+
+
+
+
+
+/* EMAC Control and Status bits   */
+#define MAC_RX_ENABLE	 (1<<2)			/*  Receiver Enable in MAC_CONFIG reg      */
+#define MAC_TX_ENABLE	 (1<<3)			/*  Transmitter Enable in MAC_CONFIG reg   */
+#define MAC_PADCRC_STRIP (1<<7)			/*  Automatic Pad-CRC Stripping in MAC_CONFIG reg   */
+#define MAC_DUPMODE		 (1<<11)		/*  Duplex Mode in  MAC_CONFIG reg         */
+#define MAC_100MPS		 (1<<14)		/*  Speed is 100Mbps in MAC_CONFIG reg     */
+#define MAC_PROMISCUOUS  (1U<<0)		/*  Promiscuous Mode bit in MAC_FRAME_FILTER reg    */
+#define MAC_DIS_BROAD    (1U<<5)		/*  Disable Broadcast Frames bit in	MAC_FRAME_FILTER reg    */
+#define MAC_RECEIVEALL   (1U<<31)       /*  Receive All bit in MAC_FRAME_FILTER reg    */
+#define DMA_SOFT_RESET	  0x01          /*  Software Reset bit in DMA_BUS_MODE reg */
+#define DMA_SS_RECEIVE   (1<<1)         /*  Start/Stop Receive bit in DMA_OP_MODE reg  */
+#define DMA_SS_TRANSMIT  (1<<13)        /*  Start/Stop Transmission bit in DMA_OP_MODE reg  */
+#define DMA_INT_TRANSMIT (1<<0)         /*  Transmit Interrupt Enable bit in DMA_INT_EN reg */
+#define DMA_INT_OVERFLOW (1<<4)         /*  Overflow Interrupt Enable bit in DMA_INT_EN reg */ 
+#define DMA_INT_UNDERFLW (1<<5)         /*  Underflow Interrupt Enable bit in DMA_INT_EN reg */
+#define DMA_INT_RECEIVE  (1<<6)         /*  Receive Interrupt Enable bit in DMA_INT_EN reg */
+#define DMA_INT_ABN_SUM  (1<<15)        /*  Abnormal Interrupt Summary Enable bit in DMA_INT_EN reg */
+#define DMA_INT_NOR_SUM  (1<<16)        /*  Normal Interrupt Summary Enable bit in DMA_INT_EN reg */
+
+/* MII Management Command Register */
+#define GMII_READ           (0<<1)		/* GMII Read PHY                     */
+#define GMII_WRITE          (1<<1)      /* GMII Write PHY                    */
+#define GMII_BUSY           0x00000001  /* GMII is Busy / Start Read/Write   */
+#define MII_WR_TOUT         0x00050000  /* MII Write timeout count           */
+#define MII_RD_TOUT         0x00050000  /* MII Read timeout count            */
+
+/* MII Management Address Register */
+#define MADR_PHY_ADR        0x00001F00  /* PHY Address Mask                  */
+
+/* DP83848C PHY Registers */
+#define PHY_REG_BMCR        0x00        /* Basic Mode Control Register       */
+#define PHY_REG_BMSR        0x01        /* Basic Mode Status Register        */
+#define PHY_REG_IDR1        0x02        /* PHY Identifier 1                  */
+#define PHY_REG_IDR2        0x03        /* PHY Identifier 2                  */
+#define PHY_REG_ANAR        0x04        /* Auto-Negotiation Advertisement    */
+#define PHY_REG_ANLPAR      0x05        /* Auto-Neg. Link Partner Abitily    */
+#define PHY_REG_ANER        0x06        /* Auto-Neg. Expansion Register      */
+#define PHY_REG_ANNPTR      0x07        /* Auto-Neg. Next Page TX            */
+
+/* PHY Extended Registers */
+#define PHY_REG_STS         0x10        /* Status Register                   */
+#define PHY_REG_MICR        0x11        /* MII Interrupt Control Register    */
+#define PHY_REG_MISR        0x12        /* MII Interrupt Status Register     */
+#define PHY_REG_FCSCR       0x14        /* False Carrier Sense Counter       */
+#define PHY_REG_RECR        0x15        /* Receive Error Counter             */
+#define PHY_REG_PCSR        0x16        /* PCS Sublayer Config. and Status   */
+#define PHY_REG_RBR         0x17        /* RMII and Bypass Register          */
+#define PHY_REG_LEDCR       0x18        /* LED Direct Control Register       */
+#define PHY_REG_PHYCR       0x19        /* PHY Control Register              */
+#define PHY_REG_10BTSCR     0x1A        /* 10Base-T Status/Control Register  */
+#define PHY_REG_CDCTRL1     0x1B        /* CD Test Control and BIST Extens.  */
+#define PHY_REG_EDCR        0x1D        /* Energy Detect Control Register    */
+
+/* PHY Control and Status bits  */
+#define PHY_FULLD_100M      0x2100      /* Full Duplex 100Mbit               */
+#define PHY_HALFD_100M      0x2000      /* Half Duplex 100Mbit               */
+#define PHY_FULLD_10M       0x0100      /* Full Duplex 10Mbit                */
+#define PHY_HALFD_10M       0x0000      /* Half Duplex 10MBit                */
+#define PHY_AUTO_NEG        0x1000      /* Select Auto Negotiation           */
+#define PHY_AUTO_NEG_DONE   0x0020		/* AutoNegotiation Complete in BMSR PHY reg  */
+#define PHY_BMCR_RESET		0x8000		/* Reset bit at BMCR PHY reg         */
+#define LINK_VALID_STS		0x0001		/* Link Valid Status at REG_STS PHY reg	 */
+#define FULL_DUP_STS		0x0004		/* Full Duplex Status at REG_STS PHY reg */
+#define SPEED_10M_STS		0x0002		/* 10Mbps Status at REG_STS PHY reg */
+
+#define DP83848C_DEF_ADR    0x01        /* Default PHY device address        */
+#define DP83848C_ID         0x20005C90  /* PHY Identifier (without Rev. info */
+
+#define LAN8720_ID          0x0007C0F0  /* PHY Identifier                    */
+#define PHY_REG_SCSR		0x1F		/* PHY Special Control/Status Register */
+
+/*  Misc    */
+#define ETHERNET_RST		22			/* 	Reset Output for EMAC at RGU     */
+#define RMII_SELECT			0x04		/*  Select RMII in EMACCFG           */
+
+
+/*  Prototypes               */
+void           Init_EMAC(void);
+unsigned short ReadFrameBE_EMAC(void);
+void           CopyToFrame_EMAC(void *Source, unsigned int Size);
+void           CopyFromFrame_EMAC(void *Dest, unsigned short Size);
+void           DummyReadFrame_EMAC(unsigned short Size);
+unsigned short StartReadFrame(void);
+void           EndReadFrame(void);
+unsigned int   CheckFrameReceived(void);
+void           RequestSend(unsigned short FrameSize);
+unsigned int   Rdy4Tx(void);
+
+
+#endif

+ 546 - 546
boards/embedded_artists/ea4357/nand.c → hw/boards/embedded_artists/ea4357/nand.c

@@ -1,546 +1,546 @@
-/*****************************************************************************
- *
- *   Copyright(C) 2011, Embedded Artists AB
- *   All rights reserved.
- *
- ******************************************************************************
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * products. This software is supplied "AS IS" without any warranties.
- * Embedded Artists AB assumes no responsibility or liability for the
- * use of the software, conveys no license or title under any patent,
- * copyright, or mask work right to the product. Embedded Artists AB
- * reserves the right to make changes in the software without
- * notification. Embedded Artists AB also make no representation or
- * warranty that such application will be suitable for the specified
- * use without further testing or modification.
- *****************************************************************************/
-
-
-/******************************************************************************
- * Includes
- *****************************************************************************/
-#include "../../board.h"
-
-#if BOARD == BOARD_EA4357
-
-#include "lpc_types.h"
-#include "lpc43xx_scu.h"
-#include "lpc43xx_timer.h"
-#include "nand.h"
-
-
-/******************************************************************************
- * Defines and typedefs
- *****************************************************************************/
-
-#define K9F1G_CLE   ((volatile uint8_t *)0x1D100000)
-#define K9F1G_ALE   ((volatile uint8_t *)0x1D080000)
-#define K9F1G_DATA  ((volatile uint8_t *)0x1D000000)
-
-#define K9FXX_WAIT()
-
-#define K9FXX_READ_1            0x00                
-#define K9FXX_READ_2            0x30                
-
-#define K9FXX_SET_ADDR_A        0x00                
-#define K9FXX_SET_ADDR_B        0x01                
-#define K9FXX_SET_ADDR_C        0x50                
-#define K9FXX_READ_ID           0x90                
-#define K9FXX_RESET             0xff                
-#define K9FXX_BLOCK_PROGRAM_1   0x80                
-#define K9FXX_BLOCK_PROGRAM_2   0x10                
-#define K9FXX_BLOCK_ERASE_1     0x60                
-#define K9FXX_BLOCK_ERASE_2     0xd0                
-#define K9FXX_READ_STATUS       0x70                
-#define K9FXX_BUSY              (1 << 6)            
-#define K9FXX_OK                (1 << 0)   
-
-#define ID_MARKER_CODE (0xEC)
-#define ID_SAMSUNG     (0xF1)
-
-#define ID_PAGE_SZ_1KB (0x00)
-#define ID_PAGE_SZ_2KB (0x01)
-#define ID_PAGE_SZ_4KB (0x02)
-#define ID_PAGE_SZ_8KB (0x03)
-
-#define ID_BLOCK_SZ_64KB  (0x00)
-#define ID_BLOCK_SZ_128KB (0x01)
-#define ID_BLOCK_SZ_256KB (0x02)
-#define ID_BLOCK_SZ_512KB (0x03)
-
-#define ID_PAGE_SZ_1KB (0x00)
-#define ID_PAGE_SZ_2KB (0x01)
-#define ID_PAGE_SZ_4KB (0x02)
-#define ID_PAGE_SZ_8KB (0x03)
-
-#define ID_REDUND_SZ_8  (0x00)
-#define ID_REDUND_SZ_16 (0x01)
-
-
-
-/* This macro could be changed to check the ready pin */
-#define WAIT_READY() (TIM_Waitus(25))
-         
-
-/******************************************************************************
- * External global variables
- *****************************************************************************/
-
-/******************************************************************************
- * Local variables
- *****************************************************************************/
-
-static uint32_t pageSize   = 0;
-static uint32_t blockSize  = 0;
-static uint32_t reduntSize = 0;
-
-
-/******************************************************************************
- * Local Functions
- *****************************************************************************/
-
-static void pinConfig(void)
-{
-	/* Set up EMC pin */
-	scu_pinmux(	 2	,	 9	,	MD_PLN_FAST	,	3	);//A0
-	scu_pinmux(	 2	,	10	,	MD_PLN_FAST	,	3	);//A1
-	scu_pinmux(	 2	,	11	,	MD_PLN_FAST	,	3	);//A2
-	scu_pinmux(	 2	,	12	,	MD_PLN_FAST	,	3	);//A3
-	scu_pinmux(	 2	,	13	,	MD_PLN_FAST	,	3	);//A4
-	scu_pinmux(	 1	,	 0	,	MD_PLN_FAST	,	2	);//A5
-	scu_pinmux(	 1	,	 1	,	MD_PLN_FAST	,	2	);//A6
-	scu_pinmux(	 1	,	 2	,	MD_PLN_FAST	,	2	);//A7
-	scu_pinmux(	 2	,	 8	,	MD_PLN_FAST	,	3	);//A8
-	scu_pinmux(	 2	,	 7	,	MD_PLN_FAST	,	3	);//A9
-	scu_pinmux(	 2	,	 6	,	MD_PLN_FAST	,	2	);//A10
-	scu_pinmux(	 2	,	 2	,	MD_PLN_FAST	,	2	);//A11
-	scu_pinmux(	 2	,	 1	,	MD_PLN_FAST	,	2	);//A12
-	scu_pinmux(	 2	,	 0	,	MD_PLN_FAST	,	2	);//A13
-	scu_pinmux(	 6	,	 8	,	MD_PLN_FAST	,	1	);//A14
-	scu_pinmux(	 6	,	 7	,	MD_PLN_FAST	,	1	);//A15
-	scu_pinmux(	13	,	16	,	MD_PLN_FAST	,	2	);//A16
-	scu_pinmux(	13	,	15	,	MD_PLN_FAST	,	2	);//A17
-	scu_pinmux(	14	,	 0	,	MD_PLN_FAST	,	3	);//A18
-	scu_pinmux(	14	,	 1	,	MD_PLN_FAST	,	3	);//A19
-	scu_pinmux(	14	,	 2	,	MD_PLN_FAST	,	3	);//A20
-	scu_pinmux(	14	,	 3	,	MD_PLN_FAST	,	3	);//A21
-	scu_pinmux(	14	,	 4	,	MD_PLN_FAST	,	3	);//A22
-	scu_pinmux(	10	,	 4	,	MD_PLN_FAST	,	3	);//A23
-	
-	scu_pinmux(	 1	,	 7	,	MD_PLN_FAST	,	3	);//D0
-	scu_pinmux(	 1	,	 8	,	MD_PLN_FAST	,	3	);//D1
-	scu_pinmux(	 1	,	 9	,	MD_PLN_FAST	,	3	);//D2
-	scu_pinmux(	 1	,	10	,	MD_PLN_FAST	,	3	);//D3
-	scu_pinmux(	 1	,	11	,	MD_PLN_FAST	,	3	);//D4
-	scu_pinmux(	 1	,	12	,	MD_PLN_FAST	,	3	);//D5
-	scu_pinmux(	 1	,	13	,	MD_PLN_FAST	,	3	);//D6
-	scu_pinmux(	 1	,	14	,	MD_PLN_FAST	,	3	);//D7
-	scu_pinmux(	 5	,	 4	,	MD_PLN_FAST	,	2	);//D8
-	scu_pinmux(	 5	,	 5	,	MD_PLN_FAST	,	2	);//D9
-	scu_pinmux(	 5	,	 6	,	MD_PLN_FAST	,	2	);//D10
-	scu_pinmux(	 5	,	 7	,	MD_PLN_FAST	,	2	);//D11
-	scu_pinmux(	 5	,	 0	,	MD_PLN_FAST	,	2	);//D12
-	scu_pinmux(	 5	,	 1	,	MD_PLN_FAST	,	2	);//D13
-	scu_pinmux(	 5	,	 2	,	MD_PLN_FAST	,	2	);//D14
-	scu_pinmux(	 5	,	 3	,	MD_PLN_FAST	,	2	);//D15
-	scu_pinmux(	13	,	 2	,	MD_PLN_FAST	,	2	);//D16
-	scu_pinmux(	13	,	 3	,	MD_PLN_FAST	,	2	);//D17
-	scu_pinmux(	13	,	 4	,	MD_PLN_FAST	,	2	);//D18
-	scu_pinmux(	13	,	 5	,	MD_PLN_FAST	,	2	);//D19
-	scu_pinmux(	13	,	 6	,	MD_PLN_FAST	,	2	);//D20
-	scu_pinmux(	13	,	 7	,	MD_PLN_FAST	,	2	);//D21
-	scu_pinmux(	13	,	 8	,	MD_PLN_FAST	,	2	);//D22
-	scu_pinmux(	13	,	 9	,	MD_PLN_FAST	,	2	);//D23
-	scu_pinmux(	14	,	 5	,	MD_PLN_FAST	,	3	);//D24
-	scu_pinmux(	14	,	 6	,	MD_PLN_FAST	,	3	);//D25
-	scu_pinmux(	14	,	 7	,	MD_PLN_FAST	,	3	);//D26
-	scu_pinmux(	14	,	 8	,	MD_PLN_FAST	,	3	);//D27
-	scu_pinmux(	14	,	 9	,	MD_PLN_FAST	,	3	);//D28
-	scu_pinmux(	14	,	10	,	MD_PLN_FAST	,	3	);//D29
-	scu_pinmux(	14	,	11	,	MD_PLN_FAST	,	3	);//D30
-	scu_pinmux(	14	,	12	,	MD_PLN_FAST	,	3	);//D31
-		
-	scu_pinmux(	 1	,	 3	,	MD_PLN_FAST	,	3	);//OE
-	scu_pinmux(	 1	,	 6	,	MD_PLN_FAST	,	3	);//WE
-	
-	scu_pinmux(	 1	,	 4	,	MD_PLN_FAST	,	3	);//BLS0
-	scu_pinmux(	 6	,	 6	,	MD_PLN_FAST	,	1	);//BLS1	
-	scu_pinmux(	13	,	13	,	MD_PLN_FAST	,	2	);//BLS2
-	scu_pinmux(	13	,	10	,	MD_PLN_FAST	,	2	);//BLS3
-	
-	scu_pinmux(	 1	,	 5	,	MD_PLN_FAST	,	3	);//CS0	
-	scu_pinmux(	 6	,	 3	,	MD_PLN_FAST	,	3	);//CS1
-	scu_pinmux(	13	,	12	,	MD_PLN_FAST	,	2	);//CS2
-	scu_pinmux(	13	,	11	,	MD_PLN_FAST	,	2	);//CS3
-}
-
-
-static uint32_t nandReadId(void)
-{
-  uint8_t a, b, c, d;
-  volatile uint8_t *pCLE;
-  volatile uint8_t *pALE;
-  volatile uint8_t *pData;
-  
-  pCLE  = K9F1G_CLE;
-  pALE  = K9F1G_ALE;
-  pData = K9F1G_DATA;
-    
-  *pCLE = K9FXX_READ_ID;
-  *pALE = 0;
-    
-  a = *pData;
-  b = *pData;
-  c = *pData;
-  d = *pData;
-  
-    
-  return (a << 24) | (b << 16) | (c << 8) | d;
-}
-
-static uint8_t nandStatus(void)
-{
-  uint8_t status = 0;
-  volatile uint8_t *pCLE;
-  volatile uint8_t *pALE;
-  volatile uint8_t *pData;
-  
-  pCLE  = K9F1G_CLE;
-  pALE  = K9F1G_ALE;
-  pData = K9F1G_DATA;
-    
-  *pCLE = K9FXX_READ_STATUS;
-  *pALE = 0;
-    
-  status = *pData;
-      
-  /* remove bits not used */
-  return (status & 0xC1);  
-}
-
-static void nandWaitReady(void) 
-{
-  while( !(nandStatus() & (1<<6)) );
-}
-
-/******************************************************************************
- * Public Functions
- *****************************************************************************/
-
-
-
-/******************************************************************************
- *
- * Description:
- *    Initialize the NAND Flash
- *
- * Returns:
- *    TRUE if initialization successful; otherwise FALSE
- *
- *****************************************************************************/
-uint32_t nand_init (void)
-{
-  uint32_t nandId = 0;
-  TIM_TIMERCFG_Type timerCfg;
-
-//  LPC_SC->PCONP     |= 0x00000800;
-  LPC_EMC->CONTROL   = 0x00000001;
-  LPC_EMC->CONFIG    = 0x00000000;
-
-  pinConfig();
-
-  TIM_ConfigStructInit(TIM_TIMER_MODE, &timerCfg);
-  TIM_Init(LPC_TIMER0, TIM_TIMER_MODE, &timerCfg);
-
-  LPC_EMC->STATICCONFIG1   = 0x00000080;
-
-  LPC_EMC->STATICWAITWEN1  = 0x00000002; 
-  LPC_EMC->STATICWAITOEN1  = 0x00000002; 
-  LPC_EMC->STATICWAITRD1   = 0x00000008; 
-  LPC_EMC->STATICWAITPAG1  = 0x0000001f; 
-  LPC_EMC->STATICWAITWR1   = 0x00000008; 
-  LPC_EMC->STATICWAITTURN1 = 0x0000000f;
-
-  nandId = nandReadId();
-
-  if ((nandId & 0xffff0000) != 
-    (((uint32_t)(ID_MARKER_CODE) << 24) | ID_SAMSUNG << 16)) {
-    /* unknown NAND chip */
-    return FALSE;
-  }
-
-  pageSize   = 1024 * (1 << (nandId & 0x03));  
-  blockSize  = 64*1024 * (1 << ((nandId>>4) & 0x03));
-  reduntSize = 8 * (1 << ((nandId >> 1) & 0x1));
-
-                         
-  return TRUE;
-}
-
-/******************************************************************************
- *
- * Description:
- *    Get the page size of the NAND flash
- *
- * Returns:
- *    page size in bytes
- *
- *****************************************************************************/
-uint32_t nand_getPageSize(void)
-{
-  return pageSize;
-}
-
-/******************************************************************************
- *
- * Description:
- *    Get the block size of the NAND flash
- *
- * Returns:
- *    block size in bytes
- *
- *****************************************************************************/
-uint32_t nand_getBlockSize(void)
-{
-  return blockSize;
-}
-
-/******************************************************************************
- *
- * Description:
- *    Get the redundant (spare) size per page
- *
- * Returns:
- *    redundant/spare size in bytes
- *
- *****************************************************************************/
-uint32_t nand_getRedundantSize(void)
-{
-  return reduntSize * (pageSize/512);
-}
-
-/******************************************************************************
- *
- * Description:
- *    Check if a block is valid
- *
- * Returns:
- *    TRUE if the block is valid; otherwise FALSE
- *
- *****************************************************************************/
-uint32_t nand_isBlockValid(uint32_t block)
-{
-  uint32_t addr = 0;
-  uint32_t page = 0;
-
-  volatile uint8_t *pCLE;
-  volatile uint8_t *pALE;
-  volatile uint8_t *pData;
-
-  
-  pCLE  = K9F1G_CLE;
-  pALE  = K9F1G_ALE;
-  pData = K9F1G_DATA;
-
-  if (block >= NAND_NUM_BLOCKS) {
-    return FALSE;
-  }
-
-  addr = block * (blockSize/pageSize);
-
-  /* 
-   * Check page 0 and page 1 in each block. If the first byte
-   * in the spare area (of either page 0 or page 1) is != 0xFF 
-   * the block is invalid.
-   */
-
-  nandWaitReady();
-
-  for (page = 0; page < 2; page++) {
-    addr += page;
-
-    *pCLE = K9FXX_READ_1;
-    *pALE = (uint8_t) (pageSize & 0x00FF);
-    *pALE = (uint8_t)((pageSize & 0xFF00) >> 8);
-    *pALE = (uint8_t)((addr & 0x00FF));
-    *pALE = (uint8_t)((addr & 0xFF00) >> 8);
-    *pCLE = K9FXX_READ_2;
-
-    WAIT_READY();
-
-    if (*pData != 0xFF) {
-      return FALSE;
-    }
-        
-  }
-
-  return TRUE;
-}
-
-
-/******************************************************************************
- *
- * Description:
- *    Read a page from the NAND memory
- *
- * Params:
- *    block - block number to read from
- *    page  - page with�n block to read from
- *    pageBuf - data is copied to this buffer. The size must be at least 
- *              pageSize.
- *
- * Returns:
- *    TRUE if read successful; otherwise FALSE
- *
- *****************************************************************************/
-uint32_t nand_readPage(uint32_t block, uint32_t page, uint8_t* pageBuf)
-{
-  uint32_t i = 0;
-  uint32_t addr = 0;
-
-  volatile uint8_t *pCLE;
-  volatile uint8_t *pALE;
-  volatile uint8_t *pData;
-
-  
-  pCLE  = K9F1G_CLE;
-  pALE  = K9F1G_ALE;
-  pData = K9F1G_DATA;
-
-  if (block >= NAND_NUM_BLOCKS) {
-    return FALSE;
-  }
-
-  if (page >= blockSize/pageSize) {
-    return FALSE;
-  }
-
-  addr = block * (blockSize/pageSize) + page;
-
-  /*
-   * Always reading from start of a page address.
-   * This means that the column address is always 0.
-   */
-
-  *pCLE = K9FXX_READ_1;
-  *pALE = 0;
-  *pALE = 0;
-  *pALE = (uint8_t)((addr & 0x00FF));
-  *pALE = (uint8_t)((addr & 0xFF00) >> 8);
-  *pCLE = K9FXX_READ_2;
-
-  WAIT_READY(); 
-  
-
-  for (i = 0; i < pageSize; i++) {
-    *pageBuf++ = *pData;  
-  }
-
-
-  return TRUE;
-}
-
-/******************************************************************************
- *
- * Description:
- *    Write a page of data to the NAND memory
- *
- * Params:
- *    block - block number to write to
- *    page  - page within block to write to
- *    pageBuf - data is copied from this buffer. The size must be at least 
- *              pageSize.
- *
- * Returns:
- *    TRUE if write successful; otherwise FALSE
- *
- *****************************************************************************/
-uint32_t nand_writePage(uint32_t block, uint32_t page, uint8_t* pageBuf)
-{
-  uint32_t i = 0;
-  uint32_t addr = 0;
-
-  volatile uint8_t *pCLE;
-  volatile uint8_t *pALE;
-  volatile uint8_t *pData;
-
-  
-  pCLE  = K9F1G_CLE;
-  pALE  = K9F1G_ALE;
-  pData = K9F1G_DATA;
-
-  if (block >= NAND_NUM_BLOCKS) {
-    return FALSE;
-  }
-
-  if (page >= blockSize/pageSize) {
-    return FALSE;
-  }
-
-  addr = block * (blockSize/pageSize) + page;
-
-  /*
-   * Always writing to start of a page address.
-   * This means that the column address is always 0.
-   */ 
-
-  *pCLE = K9FXX_BLOCK_PROGRAM_1;
-  *pALE = 0; 
-  *pALE = 0; 
-  *pALE = (uint8_t)((addr & 0x00FF));
-  *pALE = (uint8_t)((addr & 0xFF00) >> 8);
-
-
-  for (i = 0; i < pageSize; i++) {
-    *pData = *pageBuf++;
-  }
-
-  *pCLE = K9FXX_BLOCK_PROGRAM_2;
-
-  TIM_Waitus(700);  
-  nandWaitReady();
-  
-  return ((nandStatus() & 0x01) != 0x01); 
-}
-
-/******************************************************************************
- *
- * Description:
- *    Erase a block
- *
- * Params:
- *    block - block number to erase
- *
- * Returns:
- *    TRUE if eras successful; otherwise FALSE
- *
- *****************************************************************************/
-uint32_t nand_eraseBlock(uint32_t block)
-{
-  uint32_t addr = 0;
-
-  volatile uint8_t *pCLE;
-  volatile uint8_t *pALE;
-
-  pCLE  = K9F1G_CLE;
-  pALE  = K9F1G_ALE;
-
-  if (block >= NAND_NUM_BLOCKS) {
-    return FALSE;
-  }
-    
-  addr = block * (blockSize/pageSize);
-
-  *pCLE = K9FXX_BLOCK_ERASE_1;
-  *pALE = (uint8_t)(addr & 0x00FF);
-  *pALE = (uint8_t)((addr & 0xFF00) >> 8);
-  *pCLE = K9FXX_BLOCK_ERASE_2;
-
-  TIM_Waitus(700);
-  nandWaitReady();
-
-  return ((nandStatus() & 0x01) != 0x01); 
-}
-
-#endif
+/*****************************************************************************
+ *
+ *   Copyright(C) 2011, Embedded Artists AB
+ *   All rights reserved.
+ *
+ ******************************************************************************
+ * Software that is described herein is for illustrative purposes only
+ * which provides customers with programming information regarding the
+ * products. This software is supplied "AS IS" without any warranties.
+ * Embedded Artists AB assumes no responsibility or liability for the
+ * use of the software, conveys no license or title under any patent,
+ * copyright, or mask work right to the product. Embedded Artists AB
+ * reserves the right to make changes in the software without
+ * notification. Embedded Artists AB also make no representation or
+ * warranty that such application will be suitable for the specified
+ * use without further testing or modification.
+ *****************************************************************************/
+
+
+/******************************************************************************
+ * Includes
+ *****************************************************************************/
+#include "../../board.h"
+
+#if BOARD == BOARD_EA4357
+
+#include "lpc_types.h"
+#include "lpc43xx_scu.h"
+#include "lpc43xx_timer.h"
+#include "nand.h"
+
+
+/******************************************************************************
+ * Defines and typedefs
+ *****************************************************************************/
+
+#define K9F1G_CLE   ((volatile uint8_t *)0x1D100000)
+#define K9F1G_ALE   ((volatile uint8_t *)0x1D080000)
+#define K9F1G_DATA  ((volatile uint8_t *)0x1D000000)
+
+#define K9FXX_WAIT()
+
+#define K9FXX_READ_1            0x00                
+#define K9FXX_READ_2            0x30                
+
+#define K9FXX_SET_ADDR_A        0x00                
+#define K9FXX_SET_ADDR_B        0x01                
+#define K9FXX_SET_ADDR_C        0x50                
+#define K9FXX_READ_ID           0x90                
+#define K9FXX_RESET             0xff                
+#define K9FXX_BLOCK_PROGRAM_1   0x80                
+#define K9FXX_BLOCK_PROGRAM_2   0x10                
+#define K9FXX_BLOCK_ERASE_1     0x60                
+#define K9FXX_BLOCK_ERASE_2     0xd0                
+#define K9FXX_READ_STATUS       0x70                
+#define K9FXX_BUSY              (1 << 6)            
+#define K9FXX_OK                (1 << 0)   
+
+#define ID_MARKER_CODE (0xEC)
+#define ID_SAMSUNG     (0xF1)
+
+#define ID_PAGE_SZ_1KB (0x00)
+#define ID_PAGE_SZ_2KB (0x01)
+#define ID_PAGE_SZ_4KB (0x02)
+#define ID_PAGE_SZ_8KB (0x03)
+
+#define ID_BLOCK_SZ_64KB  (0x00)
+#define ID_BLOCK_SZ_128KB (0x01)
+#define ID_BLOCK_SZ_256KB (0x02)
+#define ID_BLOCK_SZ_512KB (0x03)
+
+#define ID_PAGE_SZ_1KB (0x00)
+#define ID_PAGE_SZ_2KB (0x01)
+#define ID_PAGE_SZ_4KB (0x02)
+#define ID_PAGE_SZ_8KB (0x03)
+
+#define ID_REDUND_SZ_8  (0x00)
+#define ID_REDUND_SZ_16 (0x01)
+
+
+
+/* This macro could be changed to check the ready pin */
+#define WAIT_READY() (TIM_Waitus(25))
+         
+
+/******************************************************************************
+ * External global variables
+ *****************************************************************************/
+
+/******************************************************************************
+ * Local variables
+ *****************************************************************************/
+
+static uint32_t pageSize   = 0;
+static uint32_t blockSize  = 0;
+static uint32_t reduntSize = 0;
+
+
+/******************************************************************************
+ * Local Functions
+ *****************************************************************************/
+
+static void pinConfig(void)
+{
+	/* Set up EMC pin */
+	scu_pinmux(	 2	,	 9	,	MD_PLN_FAST	,	3	);//A0
+	scu_pinmux(	 2	,	10	,	MD_PLN_FAST	,	3	);//A1
+	scu_pinmux(	 2	,	11	,	MD_PLN_FAST	,	3	);//A2
+	scu_pinmux(	 2	,	12	,	MD_PLN_FAST	,	3	);//A3
+	scu_pinmux(	 2	,	13	,	MD_PLN_FAST	,	3	);//A4
+	scu_pinmux(	 1	,	 0	,	MD_PLN_FAST	,	2	);//A5
+	scu_pinmux(	 1	,	 1	,	MD_PLN_FAST	,	2	);//A6
+	scu_pinmux(	 1	,	 2	,	MD_PLN_FAST	,	2	);//A7
+	scu_pinmux(	 2	,	 8	,	MD_PLN_FAST	,	3	);//A8
+	scu_pinmux(	 2	,	 7	,	MD_PLN_FAST	,	3	);//A9
+	scu_pinmux(	 2	,	 6	,	MD_PLN_FAST	,	2	);//A10
+	scu_pinmux(	 2	,	 2	,	MD_PLN_FAST	,	2	);//A11
+	scu_pinmux(	 2	,	 1	,	MD_PLN_FAST	,	2	);//A12
+	scu_pinmux(	 2	,	 0	,	MD_PLN_FAST	,	2	);//A13
+	scu_pinmux(	 6	,	 8	,	MD_PLN_FAST	,	1	);//A14
+	scu_pinmux(	 6	,	 7	,	MD_PLN_FAST	,	1	);//A15
+	scu_pinmux(	13	,	16	,	MD_PLN_FAST	,	2	);//A16
+	scu_pinmux(	13	,	15	,	MD_PLN_FAST	,	2	);//A17
+	scu_pinmux(	14	,	 0	,	MD_PLN_FAST	,	3	);//A18
+	scu_pinmux(	14	,	 1	,	MD_PLN_FAST	,	3	);//A19
+	scu_pinmux(	14	,	 2	,	MD_PLN_FAST	,	3	);//A20
+	scu_pinmux(	14	,	 3	,	MD_PLN_FAST	,	3	);//A21
+	scu_pinmux(	14	,	 4	,	MD_PLN_FAST	,	3	);//A22
+	scu_pinmux(	10	,	 4	,	MD_PLN_FAST	,	3	);//A23
+	
+	scu_pinmux(	 1	,	 7	,	MD_PLN_FAST	,	3	);//D0
+	scu_pinmux(	 1	,	 8	,	MD_PLN_FAST	,	3	);//D1
+	scu_pinmux(	 1	,	 9	,	MD_PLN_FAST	,	3	);//D2
+	scu_pinmux(	 1	,	10	,	MD_PLN_FAST	,	3	);//D3
+	scu_pinmux(	 1	,	11	,	MD_PLN_FAST	,	3	);//D4
+	scu_pinmux(	 1	,	12	,	MD_PLN_FAST	,	3	);//D5
+	scu_pinmux(	 1	,	13	,	MD_PLN_FAST	,	3	);//D6
+	scu_pinmux(	 1	,	14	,	MD_PLN_FAST	,	3	);//D7
+	scu_pinmux(	 5	,	 4	,	MD_PLN_FAST	,	2	);//D8
+	scu_pinmux(	 5	,	 5	,	MD_PLN_FAST	,	2	);//D9
+	scu_pinmux(	 5	,	 6	,	MD_PLN_FAST	,	2	);//D10
+	scu_pinmux(	 5	,	 7	,	MD_PLN_FAST	,	2	);//D11
+	scu_pinmux(	 5	,	 0	,	MD_PLN_FAST	,	2	);//D12
+	scu_pinmux(	 5	,	 1	,	MD_PLN_FAST	,	2	);//D13
+	scu_pinmux(	 5	,	 2	,	MD_PLN_FAST	,	2	);//D14
+	scu_pinmux(	 5	,	 3	,	MD_PLN_FAST	,	2	);//D15
+	scu_pinmux(	13	,	 2	,	MD_PLN_FAST	,	2	);//D16
+	scu_pinmux(	13	,	 3	,	MD_PLN_FAST	,	2	);//D17
+	scu_pinmux(	13	,	 4	,	MD_PLN_FAST	,	2	);//D18
+	scu_pinmux(	13	,	 5	,	MD_PLN_FAST	,	2	);//D19
+	scu_pinmux(	13	,	 6	,	MD_PLN_FAST	,	2	);//D20
+	scu_pinmux(	13	,	 7	,	MD_PLN_FAST	,	2	);//D21
+	scu_pinmux(	13	,	 8	,	MD_PLN_FAST	,	2	);//D22
+	scu_pinmux(	13	,	 9	,	MD_PLN_FAST	,	2	);//D23
+	scu_pinmux(	14	,	 5	,	MD_PLN_FAST	,	3	);//D24
+	scu_pinmux(	14	,	 6	,	MD_PLN_FAST	,	3	);//D25
+	scu_pinmux(	14	,	 7	,	MD_PLN_FAST	,	3	);//D26
+	scu_pinmux(	14	,	 8	,	MD_PLN_FAST	,	3	);//D27
+	scu_pinmux(	14	,	 9	,	MD_PLN_FAST	,	3	);//D28
+	scu_pinmux(	14	,	10	,	MD_PLN_FAST	,	3	);//D29
+	scu_pinmux(	14	,	11	,	MD_PLN_FAST	,	3	);//D30
+	scu_pinmux(	14	,	12	,	MD_PLN_FAST	,	3	);//D31
+		
+	scu_pinmux(	 1	,	 3	,	MD_PLN_FAST	,	3	);//OE
+	scu_pinmux(	 1	,	 6	,	MD_PLN_FAST	,	3	);//WE
+	
+	scu_pinmux(	 1	,	 4	,	MD_PLN_FAST	,	3	);//BLS0
+	scu_pinmux(	 6	,	 6	,	MD_PLN_FAST	,	1	);//BLS1	
+	scu_pinmux(	13	,	13	,	MD_PLN_FAST	,	2	);//BLS2
+	scu_pinmux(	13	,	10	,	MD_PLN_FAST	,	2	);//BLS3
+	
+	scu_pinmux(	 1	,	 5	,	MD_PLN_FAST	,	3	);//CS0	
+	scu_pinmux(	 6	,	 3	,	MD_PLN_FAST	,	3	);//CS1
+	scu_pinmux(	13	,	12	,	MD_PLN_FAST	,	2	);//CS2
+	scu_pinmux(	13	,	11	,	MD_PLN_FAST	,	2	);//CS3
+}
+
+
+static uint32_t nandReadId(void)
+{
+  uint8_t a, b, c, d;
+  volatile uint8_t *pCLE;
+  volatile uint8_t *pALE;
+  volatile uint8_t *pData;
+  
+  pCLE  = K9F1G_CLE;
+  pALE  = K9F1G_ALE;
+  pData = K9F1G_DATA;
+    
+  *pCLE = K9FXX_READ_ID;
+  *pALE = 0;
+    
+  a = *pData;
+  b = *pData;
+  c = *pData;
+  d = *pData;
+  
+    
+  return (a << 24) | (b << 16) | (c << 8) | d;
+}
+
+static uint8_t nandStatus(void)
+{
+  uint8_t status = 0;
+  volatile uint8_t *pCLE;
+  volatile uint8_t *pALE;
+  volatile uint8_t *pData;
+  
+  pCLE  = K9F1G_CLE;
+  pALE  = K9F1G_ALE;
+  pData = K9F1G_DATA;
+    
+  *pCLE = K9FXX_READ_STATUS;
+  *pALE = 0;
+    
+  status = *pData;
+      
+  /* remove bits not used */
+  return (status & 0xC1);  
+}
+
+static void nandWaitReady(void) 
+{
+  while( !(nandStatus() & (1<<6)) );
+}
+
+/******************************************************************************
+ * Public Functions
+ *****************************************************************************/
+
+
+
+/******************************************************************************
+ *
+ * Description:
+ *    Initialize the NAND Flash
+ *
+ * Returns:
+ *    TRUE if initialization successful; otherwise FALSE
+ *
+ *****************************************************************************/
+uint32_t nand_init (void)
+{
+  uint32_t nandId = 0;
+  TIM_TIMERCFG_Type timerCfg;
+
+//  LPC_SC->PCONP     |= 0x00000800;
+  LPC_EMC->CONTROL   = 0x00000001;
+  LPC_EMC->CONFIG    = 0x00000000;
+
+  pinConfig();
+
+  TIM_ConfigStructInit(TIM_TIMER_MODE, &timerCfg);
+  TIM_Init(LPC_TIMER0, TIM_TIMER_MODE, &timerCfg);
+
+  LPC_EMC->STATICCONFIG1   = 0x00000080;
+
+  LPC_EMC->STATICWAITWEN1  = 0x00000002; 
+  LPC_EMC->STATICWAITOEN1  = 0x00000002; 
+  LPC_EMC->STATICWAITRD1   = 0x00000008; 
+  LPC_EMC->STATICWAITPAG1  = 0x0000001f; 
+  LPC_EMC->STATICWAITWR1   = 0x00000008; 
+  LPC_EMC->STATICWAITTURN1 = 0x0000000f;
+
+  nandId = nandReadId();
+
+  if ((nandId & 0xffff0000) != 
+    (((uint32_t)(ID_MARKER_CODE) << 24) | ID_SAMSUNG << 16)) {
+    /* unknown NAND chip */
+    return FALSE;
+  }
+
+  pageSize   = 1024 * (1 << (nandId & 0x03));  
+  blockSize  = 64*1024 * (1 << ((nandId>>4) & 0x03));
+  reduntSize = 8 * (1 << ((nandId >> 1) & 0x1));
+
+                         
+  return TRUE;
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Get the page size of the NAND flash
+ *
+ * Returns:
+ *    page size in bytes
+ *
+ *****************************************************************************/
+uint32_t nand_getPageSize(void)
+{
+  return pageSize;
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Get the block size of the NAND flash
+ *
+ * Returns:
+ *    block size in bytes
+ *
+ *****************************************************************************/
+uint32_t nand_getBlockSize(void)
+{
+  return blockSize;
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Get the redundant (spare) size per page
+ *
+ * Returns:
+ *    redundant/spare size in bytes
+ *
+ *****************************************************************************/
+uint32_t nand_getRedundantSize(void)
+{
+  return reduntSize * (pageSize/512);
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Check if a block is valid
+ *
+ * Returns:
+ *    TRUE if the block is valid; otherwise FALSE
+ *
+ *****************************************************************************/
+uint32_t nand_isBlockValid(uint32_t block)
+{
+  uint32_t addr = 0;
+  uint32_t page = 0;
+
+  volatile uint8_t *pCLE;
+  volatile uint8_t *pALE;
+  volatile uint8_t *pData;
+
+  
+  pCLE  = K9F1G_CLE;
+  pALE  = K9F1G_ALE;
+  pData = K9F1G_DATA;
+
+  if (block >= NAND_NUM_BLOCKS) {
+    return FALSE;
+  }
+
+  addr = block * (blockSize/pageSize);
+
+  /* 
+   * Check page 0 and page 1 in each block. If the first byte
+   * in the spare area (of either page 0 or page 1) is != 0xFF 
+   * the block is invalid.
+   */
+
+  nandWaitReady();
+
+  for (page = 0; page < 2; page++) {
+    addr += page;
+
+    *pCLE = K9FXX_READ_1;
+    *pALE = (uint8_t) (pageSize & 0x00FF);
+    *pALE = (uint8_t)((pageSize & 0xFF00) >> 8);
+    *pALE = (uint8_t)((addr & 0x00FF));
+    *pALE = (uint8_t)((addr & 0xFF00) >> 8);
+    *pCLE = K9FXX_READ_2;
+
+    WAIT_READY();
+
+    if (*pData != 0xFF) {
+      return FALSE;
+    }
+        
+  }
+
+  return TRUE;
+}
+
+
+/******************************************************************************
+ *
+ * Description:
+ *    Read a page from the NAND memory
+ *
+ * Params:
+ *    block - block number to read from
+ *    page  - page with�n block to read from
+ *    pageBuf - data is copied to this buffer. The size must be at least 
+ *              pageSize.
+ *
+ * Returns:
+ *    TRUE if read successful; otherwise FALSE
+ *
+ *****************************************************************************/
+uint32_t nand_readPage(uint32_t block, uint32_t page, uint8_t* pageBuf)
+{
+  uint32_t i = 0;
+  uint32_t addr = 0;
+
+  volatile uint8_t *pCLE;
+  volatile uint8_t *pALE;
+  volatile uint8_t *pData;
+
+  
+  pCLE  = K9F1G_CLE;
+  pALE  = K9F1G_ALE;
+  pData = K9F1G_DATA;
+
+  if (block >= NAND_NUM_BLOCKS) {
+    return FALSE;
+  }
+
+  if (page >= blockSize/pageSize) {
+    return FALSE;
+  }
+
+  addr = block * (blockSize/pageSize) + page;
+
+  /*
+   * Always reading from start of a page address.
+   * This means that the column address is always 0.
+   */
+
+  *pCLE = K9FXX_READ_1;
+  *pALE = 0;
+  *pALE = 0;
+  *pALE = (uint8_t)((addr & 0x00FF));
+  *pALE = (uint8_t)((addr & 0xFF00) >> 8);
+  *pCLE = K9FXX_READ_2;
+
+  WAIT_READY(); 
+  
+
+  for (i = 0; i < pageSize; i++) {
+    *pageBuf++ = *pData;  
+  }
+
+
+  return TRUE;
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Write a page of data to the NAND memory
+ *
+ * Params:
+ *    block - block number to write to
+ *    page  - page within block to write to
+ *    pageBuf - data is copied from this buffer. The size must be at least 
+ *              pageSize.
+ *
+ * Returns:
+ *    TRUE if write successful; otherwise FALSE
+ *
+ *****************************************************************************/
+uint32_t nand_writePage(uint32_t block, uint32_t page, uint8_t* pageBuf)
+{
+  uint32_t i = 0;
+  uint32_t addr = 0;
+
+  volatile uint8_t *pCLE;
+  volatile uint8_t *pALE;
+  volatile uint8_t *pData;
+
+  
+  pCLE  = K9F1G_CLE;
+  pALE  = K9F1G_ALE;
+  pData = K9F1G_DATA;
+
+  if (block >= NAND_NUM_BLOCKS) {
+    return FALSE;
+  }
+
+  if (page >= blockSize/pageSize) {
+    return FALSE;
+  }
+
+  addr = block * (blockSize/pageSize) + page;
+
+  /*
+   * Always writing to start of a page address.
+   * This means that the column address is always 0.
+   */ 
+
+  *pCLE = K9FXX_BLOCK_PROGRAM_1;
+  *pALE = 0; 
+  *pALE = 0; 
+  *pALE = (uint8_t)((addr & 0x00FF));
+  *pALE = (uint8_t)((addr & 0xFF00) >> 8);
+
+
+  for (i = 0; i < pageSize; i++) {
+    *pData = *pageBuf++;
+  }
+
+  *pCLE = K9FXX_BLOCK_PROGRAM_2;
+
+  TIM_Waitus(700);  
+  nandWaitReady();
+  
+  return ((nandStatus() & 0x01) != 0x01); 
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Erase a block
+ *
+ * Params:
+ *    block - block number to erase
+ *
+ * Returns:
+ *    TRUE if eras successful; otherwise FALSE
+ *
+ *****************************************************************************/
+uint32_t nand_eraseBlock(uint32_t block)
+{
+  uint32_t addr = 0;
+
+  volatile uint8_t *pCLE;
+  volatile uint8_t *pALE;
+
+  pCLE  = K9F1G_CLE;
+  pALE  = K9F1G_ALE;
+
+  if (block >= NAND_NUM_BLOCKS) {
+    return FALSE;
+  }
+    
+  addr = block * (blockSize/pageSize);
+
+  *pCLE = K9FXX_BLOCK_ERASE_1;
+  *pALE = (uint8_t)(addr & 0x00FF);
+  *pALE = (uint8_t)((addr & 0xFF00) >> 8);
+  *pCLE = K9FXX_BLOCK_ERASE_2;
+
+  TIM_Waitus(700);
+  nandWaitReady();
+
+  return ((nandStatus() & 0x01) != 0x01); 
+}
+
+#endif

+ 36 - 36
boards/embedded_artists/ea4357/nand.h → hw/boards/embedded_artists/ea4357/nand.h

@@ -1,36 +1,36 @@
-/*****************************************************************************
- *
- *   Copyright(C) 2011, Embedded Artists AB
- *   All rights reserved.
- *
- ******************************************************************************
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * products. This software is supplied "AS IS" without any warranties.
- * Embedded Artists AB assumes no responsibility or liability for the
- * use of the software, conveys no license or title under any patent,
- * copyright, or mask work right to the product. Embedded Artists AB
- * reserves the right to make changes in the software without
- * notification. Embedded Artists AB also make no representation or
- * warranty that such application will be suitable for the specified
- * use without further testing or modification.
- *****************************************************************************/
-#ifndef __NAND_H
-#define __NAND_H
-
-#define NAND_NUM_BLOCKS (1024)
-
-extern uint32_t nand_init (void);
-extern uint32_t nand_getPageSize(void);
-extern uint32_t nand_getBlockSize(void);
-extern uint32_t nand_getRedundantSize(void);
-extern uint32_t nand_isBlockValid(uint32_t blockNum);
-uint32_t nand_readPage(uint32_t block, uint32_t page, uint8_t* pageBuf);
-uint32_t nand_writePage(uint32_t block, uint32_t page, uint8_t* pageBuf);
-uint32_t nand_eraseBlock(uint32_t block);
-
-
-#endif /* end __NAND_H */
-/****************************************************************************
-**                            End Of File
-*****************************************************************************/
+/*****************************************************************************
+ *
+ *   Copyright(C) 2011, Embedded Artists AB
+ *   All rights reserved.
+ *
+ ******************************************************************************
+ * Software that is described herein is for illustrative purposes only
+ * which provides customers with programming information regarding the
+ * products. This software is supplied "AS IS" without any warranties.
+ * Embedded Artists AB assumes no responsibility or liability for the
+ * use of the software, conveys no license or title under any patent,
+ * copyright, or mask work right to the product. Embedded Artists AB
+ * reserves the right to make changes in the software without
+ * notification. Embedded Artists AB also make no representation or
+ * warranty that such application will be suitable for the specified
+ * use without further testing or modification.
+ *****************************************************************************/
+#ifndef __NAND_H
+#define __NAND_H
+
+#define NAND_NUM_BLOCKS (1024)
+
+extern uint32_t nand_init (void);
+extern uint32_t nand_getPageSize(void);
+extern uint32_t nand_getBlockSize(void);
+extern uint32_t nand_getRedundantSize(void);
+extern uint32_t nand_isBlockValid(uint32_t blockNum);
+uint32_t nand_readPage(uint32_t block, uint32_t page, uint8_t* pageBuf);
+uint32_t nand_writePage(uint32_t block, uint32_t page, uint8_t* pageBuf);
+uint32_t nand_eraseBlock(uint32_t block);
+
+
+#endif /* end __NAND_H */
+/****************************************************************************
+**                            End Of File
+*****************************************************************************/

+ 272 - 272
boards/embedded_artists/ea4357/sdram.c → hw/boards/embedded_artists/ea4357/sdram.c

@@ -1,272 +1,272 @@
-/*****************************************************************************
- *
- *   Copyright(C) 2011, Embedded Artists AB
- *   All rights reserved.
- *
- ******************************************************************************
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * products. This software is supplied "AS IS" without any warranties.
- * Embedded Artists AB assumes no responsibility or liability for the
- * use of the software, conveys no license or title under any patent,
- * copyright, or mask work right to the product. Embedded Artists AB
- * reserves the right to make changes in the software without
- * notification. Embedded Artists AB also make no representation or
- * warranty that such application will be suitable for the specified
- * use without further testing or modification.
- *****************************************************************************/
-
-
-
-/******************************************************************************
- * Includes
- *****************************************************************************/
-#include "../../board.h"
-
-#if BOARD == BOARD_EA4357
-
-#include "LPC43xx.h"
-#include "lpc_types.h"
-#include "lpc43xx_scu.h"
-#include "lpc43xx_timer.h"
-#include "lpc43xx_cgu.h"
-#include "sdram.h"
-#include <string.h>
-
-/******************************************************************************
- * Defines and typedefs
- *****************************************************************************/
-
-/* SDRAM refresh time to 16 clock num */
-#define EMC_SDRAM_REFRESH(freq,time)  \
-  (((uint64_t)((uint64_t)time * freq)/16000000000ull)+1)
-
-/******************************************************************************
- * External global variables
- *****************************************************************************/
-
-/******************************************************************************
- * Local variables
- *****************************************************************************/
-
-/******************************************************************************
- * Local Functions
- *****************************************************************************/
-
-
-/*-------------------------PRIVATE FUNCTIONS------------------------------*/
-/*********************************************************************
- * @brief		Calculate EMC Clock from nano second
- * @param[in]	freq - frequency of EMC Clk
- * @param[in]	time - nano second
- * @return 		None
- **********************************************************************/
-uint32_t NS2CLK(uint32_t freq, uint32_t time){
- return (((uint64_t)time*freq/1000000000));
-}
-
-static void pinConfig(void)
-{
-	/* Set up EMC pin */
-	scu_pinmux(	 2	,	 9	,	MD_PLN_FAST	,	3	);//A0
-	scu_pinmux(	 2	,	10	,	MD_PLN_FAST	,	3	);//A1
-	scu_pinmux(	 2	,	11	,	MD_PLN_FAST	,	3	);//A2
-	scu_pinmux(	 2	,	12	,	MD_PLN_FAST	,	3	);//A3
-	scu_pinmux(	 2	,	13	,	MD_PLN_FAST	,	3	);//A4
-	scu_pinmux(	 1	,	 0	,	MD_PLN_FAST	,	2	);//A5
-	scu_pinmux(	 1	,	 1	,	MD_PLN_FAST	,	2	);//A6
-	scu_pinmux(	 1	,	 2	,	MD_PLN_FAST	,	2	);//A7
-	scu_pinmux(	 2	,	 8	,	MD_PLN_FAST	,	3	);//A8
-	scu_pinmux(	 2	,	 7	,	MD_PLN_FAST	,	3	);//A9
-	scu_pinmux(	 2	,	 6	,	MD_PLN_FAST	,	2	);//A10
-	scu_pinmux(	 2	,	 2	,	MD_PLN_FAST	,	2	);//A11
-	scu_pinmux(	 2	,	 1	,	MD_PLN_FAST	,	2	);//A12
-	scu_pinmux(	 2	,	 0	,	MD_PLN_FAST	,	2	);//A13
-	scu_pinmux(	 6	,	 8	,	MD_PLN_FAST	,	1	);//A14
-	scu_pinmux(	 6	,	 7	,	MD_PLN_FAST	,	1	);//A15
-	scu_pinmux(	13	,	16	,	MD_PLN_FAST	,	2	);//A16
-	scu_pinmux(	13	,	15	,	MD_PLN_FAST	,	2	);//A17
-	scu_pinmux(	14	,	 0	,	MD_PLN_FAST	,	3	);//A18
-	scu_pinmux(	14	,	 1	,	MD_PLN_FAST	,	3	);//A19
-	scu_pinmux(	14	,	 2	,	MD_PLN_FAST	,	3	);//A20
-	scu_pinmux(	14	,	 3	,	MD_PLN_FAST	,	3	);//A21
-	scu_pinmux(	14	,	 4	,	MD_PLN_FAST	,	3	);//A22
-	scu_pinmux(	10	,	 4	,	MD_PLN_FAST	,	3	);//A23
-	
-	scu_pinmux(	 1	,	 7	,	MD_PLN_FAST	,	3	);//D0
-	scu_pinmux(	 1	,	 8	,	MD_PLN_FAST	,	3	);//D1
-	scu_pinmux(	 1	,	 9	,	MD_PLN_FAST	,	3	);//D2
-	scu_pinmux(	 1	,	10	,	MD_PLN_FAST	,	3	);//D3
-	scu_pinmux(	 1	,	11	,	MD_PLN_FAST	,	3	);//D4
-	scu_pinmux(	 1	,	12	,	MD_PLN_FAST	,	3	);//D5
-	scu_pinmux(	 1	,	13	,	MD_PLN_FAST	,	3	);//D6
-	scu_pinmux(	 1	,	14	,	MD_PLN_FAST	,	3	);//D7
-	scu_pinmux(	 5	,	 4	,	MD_PLN_FAST	,	2	);//D8
-	scu_pinmux(	 5	,	 5	,	MD_PLN_FAST	,	2	);//D9
-	scu_pinmux(	 5	,	 6	,	MD_PLN_FAST	,	2	);//D10
-	scu_pinmux(	 5	,	 7	,	MD_PLN_FAST	,	2	);//D11
-	scu_pinmux(	 5	,	 0	,	MD_PLN_FAST	,	2	);//D12
-	scu_pinmux(	 5	,	 1	,	MD_PLN_FAST	,	2	);//D13
-	scu_pinmux(	 5	,	 2	,	MD_PLN_FAST	,	2	);//D14
-	scu_pinmux(	 5	,	 3	,	MD_PLN_FAST	,	2	);//D15
-	scu_pinmux(	13	,	 2	,	MD_PLN_FAST	,	2	);//D16
-	scu_pinmux(	13	,	 3	,	MD_PLN_FAST	,	2	);//D17
-	scu_pinmux(	13	,	 4	,	MD_PLN_FAST	,	2	);//D18
-	scu_pinmux(	13	,	 5	,	MD_PLN_FAST	,	2	);//D19
-	scu_pinmux(	13	,	 6	,	MD_PLN_FAST	,	2	);//D20
-	scu_pinmux(	13	,	 7	,	MD_PLN_FAST	,	2	);//D21
-	scu_pinmux(	13	,	 8	,	MD_PLN_FAST	,	2	);//D22
-	scu_pinmux(	13	,	 9	,	MD_PLN_FAST	,	2	);//D23
-	scu_pinmux(	14	,	 5	,	MD_PLN_FAST	,	3	);//D24
-	scu_pinmux(	14	,	 6	,	MD_PLN_FAST	,	3	);//D25
-	scu_pinmux(	14	,	 7	,	MD_PLN_FAST	,	3	);//D26
-	scu_pinmux(	14	,	 8	,	MD_PLN_FAST	,	3	);//D27
-	scu_pinmux(	14	,	 9	,	MD_PLN_FAST	,	3	);//D28
-	scu_pinmux(	14	,	10	,	MD_PLN_FAST	,	3	);//D29
-	scu_pinmux(	14	,	11	,	MD_PLN_FAST	,	3	);//D30
-	scu_pinmux(	14	,	12	,	MD_PLN_FAST	,	3	);//D31
-		
-	scu_pinmux(	 1	,	 3	,	MD_PLN_FAST	,	3	);//OE
-	scu_pinmux(	 1	,	 6	,	MD_PLN_FAST	,	3	);//WE
-	
-	scu_pinmux(	 1	,	 4	,	MD_PLN_FAST	,	3	);//BLS0
-	scu_pinmux(	 6	,	 6	,	MD_PLN_FAST	,	1	);//BLS1	
-	scu_pinmux(	13	,	13	,	MD_PLN_FAST	,	2	);//BLS2
-	scu_pinmux(	13	,	10	,	MD_PLN_FAST	,	2	);//BLS3
-	
-	scu_pinmux(	 1	,	 5	,	MD_PLN_FAST	,	3	);//CS0	
-	scu_pinmux(	 6	,	 3	,	MD_PLN_FAST	,	3	);//CS1
-	scu_pinmux(	13	,	12	,	MD_PLN_FAST	,	2	);//CS2
-	scu_pinmux(	13	,	11	,	MD_PLN_FAST	,	2	);//CS3
-	
-	scu_pinmux(	 6	,	 4	,	MD_PLN_FAST	,	3	);//CAS
-	scu_pinmux(	 6	,	 5	,	MD_PLN_FAST	,	3	);//RAS
-	
-	scu_pinmux(  6	,	 9	,	MD_PLN_FAST	,	3	);//DYCS0
-	scu_pinmux(	 6	,	 1	,	MD_PLN_FAST	,	1	);//DYCS1
-	scu_pinmux(	13	,	14	,	MD_PLN_FAST	,	2	);//DYCS2
-	scu_pinmux(	15	,	14	,	MD_PLN_FAST	,	3	);//DYCS3
-
-	scu_pinmux(	 6	,	11	,	MD_PLN_FAST	,	3	);//CKEOUT0
-	scu_pinmux(	 6	,	 2	,	MD_PLN_FAST	,	1	);//CKEOUT1
-	scu_pinmux(	13	,	 1	,	MD_PLN_FAST	,	2	);//CKEOUT2
-	scu_pinmux(	14	,	15	,	MD_PLN_FAST	,	3	);//CKEOUT3
-	
-	scu_pinmux(	 6	,	12	,	MD_PLN_FAST	,	3	);//DQMOUT0
-	scu_pinmux(	 6	,	10	,	MD_PLN_FAST	,	3	);//DQMOUT1
-	scu_pinmux(	13	,	 0	,	MD_PLN_FAST	,	2	);//DQMOUT2
-	scu_pinmux(	14	,	13	,	MD_PLN_FAST	,	3	);//DQMOUT3
-}
-
-
-
-/******************************************************************************
- * Public Functions
- *****************************************************************************/
-
-
-/******************************************************************************
- *
- * Description:
- *    Initialize the SDRAM
- *
- *****************************************************************************/
-uint32_t sdram_init (void)
-{
-	uint32_t pclk, temp;
- 	uint64_t tmpclk;
-  
-  pinConfig(); //Full 32-bit Data bus, 24-bit Address 
-    
-	/* Select EMC clock-out */
-	LPC_SCU->SFSCLK_0 = MD_PLN_FAST;
-	LPC_SCU->SFSCLK_1 = MD_PLN_FAST;
-	LPC_SCU->SFSCLK_2 = MD_PLN_FAST;
-	LPC_SCU->SFSCLK_3 = MD_PLN_FAST;
-
-	LPC_EMC->CONTROL 	= 0x00000001;
-	LPC_EMC->CONFIG  	= 0x00000000;
-  LPC_EMC->DYNAMICCONFIG0    = 1<<14 | 0<<12 | 2<<9 | 1<<7; /* 256Mb, 8Mx32, 4 banks, row=12, column=9 */
-
-	pclk = CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE);
-
-  LPC_EMC->DYNAMICRASCAS0    = 0x00000202; /* 2 RAS, 2 CAS latency */
-	LPC_EMC->DYNAMICREADCONFIG = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */
-  
-	LPC_EMC->DYNAMICRP         = NS2CLK(pclk, 20);
-	LPC_EMC->DYNAMICRAS        = NS2CLK(pclk, 42);
-	LPC_EMC->DYNAMICSREX       = NS2CLK(pclk, 63);
-	LPC_EMC->DYNAMICAPR        = 0x00000005;
-	LPC_EMC->DYNAMICDAL        = 0x00000005;
-	LPC_EMC->DYNAMICWR         = 2;
-	LPC_EMC->DYNAMICRC         = NS2CLK(pclk, 63);
-	LPC_EMC->DYNAMICRFC        = NS2CLK(pclk, 63);
-	LPC_EMC->DYNAMICXSR        = NS2CLK(pclk, 63);
-	LPC_EMC->DYNAMICRRD        = NS2CLK(pclk, 14);
-	LPC_EMC->DYNAMICMRD        = 0x00000002;
-
-	TIM_Waitus(100);						   /* wait 100ms */
-	LPC_EMC->DYNAMICCONTROL    = 0x00000183; /* Issue NOP command */
-
-	TIM_Waitus(200);						   /* wait 200ms */
-	LPC_EMC->DYNAMICCONTROL    = 0x00000103; /* Issue PALL command */
-
-	LPC_EMC->DYNAMICREFRESH    = EMC_SDRAM_REFRESH(pclk,70); /* ( n * 16 ) -> 32 clock cycles */
-
-	//for(i = 0; i < 0x80; i++);	           /* wait 128 AHB clock cycles */
-	TIM_Waitus(200);						   /* wait 200ms */
-
-	tmpclk = (uint64_t)15625*(uint64_t)pclk/1000000000/16;
-	LPC_EMC->DYNAMICREFRESH    = tmpclk; /* ( n * 16 ) -> 736 clock cycles -> 15.330uS at 48MHz <= 15.625uS ( 64ms / 4096 row ) */
-
-	LPC_EMC->DYNAMICCONTROL    = 0x00000083; /* Issue MODE command */
-
-	//Timing for 48/60/72MHZ Bus
-	temp = *((volatile uint32_t *)(SDRAM_BASE | (2<<4| 2)<<(9+2+2))); /* 4 burst, 2 CAS latency */
-	temp = temp;
-	LPC_EMC->DYNAMICCONTROL    = 0x00000000; /* Issue NORMAL command */
-
-	//[re]enable buffers
-	LPC_EMC->DYNAMICCONFIG0    |= 1<<19;
-
-  return TRUE;
-}
-
-uint32_t sdram_test( void )
-{
-  volatile uint32_t *wr_ptr; 
-  volatile uint16_t *short_wr_ptr;
-  uint32_t data;
-  uint32_t i, j;
-
-  wr_ptr = (uint32_t *)SDRAM_BASE;
-  short_wr_ptr = (uint16_t *)wr_ptr;
-    
-  /* 16 bit write */
-  for (i = 0; i < SDRAM_SIZE/0x40000; i++)
-  {
-    for (j = 0; j < 0x100; j++)
-    {
-      *short_wr_ptr++ = (i + j) & 0xFFFF;
-      *short_wr_ptr++ = ((i + j) + 1) & 0xFFFF;
-    }
-  }
-
-  /* Verifying */
-  wr_ptr = (uint32_t *)SDRAM_BASE;
-  for (i = 0; i < SDRAM_SIZE/0x40000; i++)
-  {
-    for (j = 0; j < 0x100; j++)
-    {
-      data = *wr_ptr;          
-      if (data != (((((i + j) + 1) & 0xFFFF) << 16) | ((i + j) & 0xFFFF)))
-      {
-        return 0x0;
-      }
-      wr_ptr++;
-    }
-  }
-  return 0x1;
-}
-
-#endif
+/*****************************************************************************
+ *
+ *   Copyright(C) 2011, Embedded Artists AB
+ *   All rights reserved.
+ *
+ ******************************************************************************
+ * Software that is described herein is for illustrative purposes only
+ * which provides customers with programming information regarding the
+ * products. This software is supplied "AS IS" without any warranties.
+ * Embedded Artists AB assumes no responsibility or liability for the
+ * use of the software, conveys no license or title under any patent,
+ * copyright, or mask work right to the product. Embedded Artists AB
+ * reserves the right to make changes in the software without
+ * notification. Embedded Artists AB also make no representation or
+ * warranty that such application will be suitable for the specified
+ * use without further testing or modification.
+ *****************************************************************************/
+
+
+
+/******************************************************************************
+ * Includes
+ *****************************************************************************/
+#include "../../board.h"
+
+#if BOARD == BOARD_EA4357
+
+#include "LPC43xx.h"
+#include "lpc_types.h"
+#include "lpc43xx_scu.h"
+#include "lpc43xx_timer.h"
+#include "lpc43xx_cgu.h"
+#include "sdram.h"
+#include <string.h>
+
+/******************************************************************************
+ * Defines and typedefs
+ *****************************************************************************/
+
+/* SDRAM refresh time to 16 clock num */
+#define EMC_SDRAM_REFRESH(freq,time)  \
+  (((uint64_t)((uint64_t)time * freq)/16000000000ull)+1)
+
+/******************************************************************************
+ * External global variables
+ *****************************************************************************/
+
+/******************************************************************************
+ * Local variables
+ *****************************************************************************/
+
+/******************************************************************************
+ * Local Functions
+ *****************************************************************************/
+
+
+/*-------------------------PRIVATE FUNCTIONS------------------------------*/
+/*********************************************************************
+ * @brief		Calculate EMC Clock from nano second
+ * @param[in]	freq - frequency of EMC Clk
+ * @param[in]	time - nano second
+ * @return 		None
+ **********************************************************************/
+uint32_t NS2CLK(uint32_t freq, uint32_t time){
+ return (((uint64_t)time*freq/1000000000));
+}
+
+static void pinConfig(void)
+{
+	/* Set up EMC pin */
+	scu_pinmux(	 2	,	 9	,	MD_PLN_FAST	,	3	);//A0
+	scu_pinmux(	 2	,	10	,	MD_PLN_FAST	,	3	);//A1
+	scu_pinmux(	 2	,	11	,	MD_PLN_FAST	,	3	);//A2
+	scu_pinmux(	 2	,	12	,	MD_PLN_FAST	,	3	);//A3
+	scu_pinmux(	 2	,	13	,	MD_PLN_FAST	,	3	);//A4
+	scu_pinmux(	 1	,	 0	,	MD_PLN_FAST	,	2	);//A5
+	scu_pinmux(	 1	,	 1	,	MD_PLN_FAST	,	2	);//A6
+	scu_pinmux(	 1	,	 2	,	MD_PLN_FAST	,	2	);//A7
+	scu_pinmux(	 2	,	 8	,	MD_PLN_FAST	,	3	);//A8
+	scu_pinmux(	 2	,	 7	,	MD_PLN_FAST	,	3	);//A9
+	scu_pinmux(	 2	,	 6	,	MD_PLN_FAST	,	2	);//A10
+	scu_pinmux(	 2	,	 2	,	MD_PLN_FAST	,	2	);//A11
+	scu_pinmux(	 2	,	 1	,	MD_PLN_FAST	,	2	);//A12
+	scu_pinmux(	 2	,	 0	,	MD_PLN_FAST	,	2	);//A13
+	scu_pinmux(	 6	,	 8	,	MD_PLN_FAST	,	1	);//A14
+	scu_pinmux(	 6	,	 7	,	MD_PLN_FAST	,	1	);//A15
+	scu_pinmux(	13	,	16	,	MD_PLN_FAST	,	2	);//A16
+	scu_pinmux(	13	,	15	,	MD_PLN_FAST	,	2	);//A17
+	scu_pinmux(	14	,	 0	,	MD_PLN_FAST	,	3	);//A18
+	scu_pinmux(	14	,	 1	,	MD_PLN_FAST	,	3	);//A19
+	scu_pinmux(	14	,	 2	,	MD_PLN_FAST	,	3	);//A20
+	scu_pinmux(	14	,	 3	,	MD_PLN_FAST	,	3	);//A21
+	scu_pinmux(	14	,	 4	,	MD_PLN_FAST	,	3	);//A22
+	scu_pinmux(	10	,	 4	,	MD_PLN_FAST	,	3	);//A23
+	
+	scu_pinmux(	 1	,	 7	,	MD_PLN_FAST	,	3	);//D0
+	scu_pinmux(	 1	,	 8	,	MD_PLN_FAST	,	3	);//D1
+	scu_pinmux(	 1	,	 9	,	MD_PLN_FAST	,	3	);//D2
+	scu_pinmux(	 1	,	10	,	MD_PLN_FAST	,	3	);//D3
+	scu_pinmux(	 1	,	11	,	MD_PLN_FAST	,	3	);//D4
+	scu_pinmux(	 1	,	12	,	MD_PLN_FAST	,	3	);//D5
+	scu_pinmux(	 1	,	13	,	MD_PLN_FAST	,	3	);//D6
+	scu_pinmux(	 1	,	14	,	MD_PLN_FAST	,	3	);//D7
+	scu_pinmux(	 5	,	 4	,	MD_PLN_FAST	,	2	);//D8
+	scu_pinmux(	 5	,	 5	,	MD_PLN_FAST	,	2	);//D9
+	scu_pinmux(	 5	,	 6	,	MD_PLN_FAST	,	2	);//D10
+	scu_pinmux(	 5	,	 7	,	MD_PLN_FAST	,	2	);//D11
+	scu_pinmux(	 5	,	 0	,	MD_PLN_FAST	,	2	);//D12
+	scu_pinmux(	 5	,	 1	,	MD_PLN_FAST	,	2	);//D13
+	scu_pinmux(	 5	,	 2	,	MD_PLN_FAST	,	2	);//D14
+	scu_pinmux(	 5	,	 3	,	MD_PLN_FAST	,	2	);//D15
+	scu_pinmux(	13	,	 2	,	MD_PLN_FAST	,	2	);//D16
+	scu_pinmux(	13	,	 3	,	MD_PLN_FAST	,	2	);//D17
+	scu_pinmux(	13	,	 4	,	MD_PLN_FAST	,	2	);//D18
+	scu_pinmux(	13	,	 5	,	MD_PLN_FAST	,	2	);//D19
+	scu_pinmux(	13	,	 6	,	MD_PLN_FAST	,	2	);//D20
+	scu_pinmux(	13	,	 7	,	MD_PLN_FAST	,	2	);//D21
+	scu_pinmux(	13	,	 8	,	MD_PLN_FAST	,	2	);//D22
+	scu_pinmux(	13	,	 9	,	MD_PLN_FAST	,	2	);//D23
+	scu_pinmux(	14	,	 5	,	MD_PLN_FAST	,	3	);//D24
+	scu_pinmux(	14	,	 6	,	MD_PLN_FAST	,	3	);//D25
+	scu_pinmux(	14	,	 7	,	MD_PLN_FAST	,	3	);//D26
+	scu_pinmux(	14	,	 8	,	MD_PLN_FAST	,	3	);//D27
+	scu_pinmux(	14	,	 9	,	MD_PLN_FAST	,	3	);//D28
+	scu_pinmux(	14	,	10	,	MD_PLN_FAST	,	3	);//D29
+	scu_pinmux(	14	,	11	,	MD_PLN_FAST	,	3	);//D30
+	scu_pinmux(	14	,	12	,	MD_PLN_FAST	,	3	);//D31
+		
+	scu_pinmux(	 1	,	 3	,	MD_PLN_FAST	,	3	);//OE
+	scu_pinmux(	 1	,	 6	,	MD_PLN_FAST	,	3	);//WE
+	
+	scu_pinmux(	 1	,	 4	,	MD_PLN_FAST	,	3	);//BLS0
+	scu_pinmux(	 6	,	 6	,	MD_PLN_FAST	,	1	);//BLS1	
+	scu_pinmux(	13	,	13	,	MD_PLN_FAST	,	2	);//BLS2
+	scu_pinmux(	13	,	10	,	MD_PLN_FAST	,	2	);//BLS3
+	
+	scu_pinmux(	 1	,	 5	,	MD_PLN_FAST	,	3	);//CS0	
+	scu_pinmux(	 6	,	 3	,	MD_PLN_FAST	,	3	);//CS1
+	scu_pinmux(	13	,	12	,	MD_PLN_FAST	,	2	);//CS2
+	scu_pinmux(	13	,	11	,	MD_PLN_FAST	,	2	);//CS3
+	
+	scu_pinmux(	 6	,	 4	,	MD_PLN_FAST	,	3	);//CAS
+	scu_pinmux(	 6	,	 5	,	MD_PLN_FAST	,	3	);//RAS
+	
+	scu_pinmux(  6	,	 9	,	MD_PLN_FAST	,	3	);//DYCS0
+	scu_pinmux(	 6	,	 1	,	MD_PLN_FAST	,	1	);//DYCS1
+	scu_pinmux(	13	,	14	,	MD_PLN_FAST	,	2	);//DYCS2
+	scu_pinmux(	15	,	14	,	MD_PLN_FAST	,	3	);//DYCS3
+
+	scu_pinmux(	 6	,	11	,	MD_PLN_FAST	,	3	);//CKEOUT0
+	scu_pinmux(	 6	,	 2	,	MD_PLN_FAST	,	1	);//CKEOUT1
+	scu_pinmux(	13	,	 1	,	MD_PLN_FAST	,	2	);//CKEOUT2
+	scu_pinmux(	14	,	15	,	MD_PLN_FAST	,	3	);//CKEOUT3
+	
+	scu_pinmux(	 6	,	12	,	MD_PLN_FAST	,	3	);//DQMOUT0
+	scu_pinmux(	 6	,	10	,	MD_PLN_FAST	,	3	);//DQMOUT1
+	scu_pinmux(	13	,	 0	,	MD_PLN_FAST	,	2	);//DQMOUT2
+	scu_pinmux(	14	,	13	,	MD_PLN_FAST	,	3	);//DQMOUT3
+}
+
+
+
+/******************************************************************************
+ * Public Functions
+ *****************************************************************************/
+
+
+/******************************************************************************
+ *
+ * Description:
+ *    Initialize the SDRAM
+ *
+ *****************************************************************************/
+uint32_t sdram_init (void)
+{
+	uint32_t pclk, temp;
+ 	uint64_t tmpclk;
+  
+  pinConfig(); //Full 32-bit Data bus, 24-bit Address 
+    
+	/* Select EMC clock-out */
+	LPC_SCU->SFSCLK_0 = MD_PLN_FAST;
+	LPC_SCU->SFSCLK_1 = MD_PLN_FAST;
+	LPC_SCU->SFSCLK_2 = MD_PLN_FAST;
+	LPC_SCU->SFSCLK_3 = MD_PLN_FAST;
+
+	LPC_EMC->CONTROL 	= 0x00000001;
+	LPC_EMC->CONFIG  	= 0x00000000;
+  LPC_EMC->DYNAMICCONFIG0    = 1<<14 | 0<<12 | 2<<9 | 1<<7; /* 256Mb, 8Mx32, 4 banks, row=12, column=9 */
+
+	pclk = CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE);
+
+  LPC_EMC->DYNAMICRASCAS0    = 0x00000202; /* 2 RAS, 2 CAS latency */
+	LPC_EMC->DYNAMICREADCONFIG = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */
+  
+	LPC_EMC->DYNAMICRP         = NS2CLK(pclk, 20);
+	LPC_EMC->DYNAMICRAS        = NS2CLK(pclk, 42);
+	LPC_EMC->DYNAMICSREX       = NS2CLK(pclk, 63);
+	LPC_EMC->DYNAMICAPR        = 0x00000005;
+	LPC_EMC->DYNAMICDAL        = 0x00000005;
+	LPC_EMC->DYNAMICWR         = 2;
+	LPC_EMC->DYNAMICRC         = NS2CLK(pclk, 63);
+	LPC_EMC->DYNAMICRFC        = NS2CLK(pclk, 63);
+	LPC_EMC->DYNAMICXSR        = NS2CLK(pclk, 63);
+	LPC_EMC->DYNAMICRRD        = NS2CLK(pclk, 14);
+	LPC_EMC->DYNAMICMRD        = 0x00000002;
+
+	TIM_Waitus(100);						   /* wait 100ms */
+	LPC_EMC->DYNAMICCONTROL    = 0x00000183; /* Issue NOP command */
+
+	TIM_Waitus(200);						   /* wait 200ms */
+	LPC_EMC->DYNAMICCONTROL    = 0x00000103; /* Issue PALL command */
+
+	LPC_EMC->DYNAMICREFRESH    = EMC_SDRAM_REFRESH(pclk,70); /* ( n * 16 ) -> 32 clock cycles */
+
+	//for(i = 0; i < 0x80; i++);	           /* wait 128 AHB clock cycles */
+	TIM_Waitus(200);						   /* wait 200ms */
+
+	tmpclk = (uint64_t)15625*(uint64_t)pclk/1000000000/16;
+	LPC_EMC->DYNAMICREFRESH    = tmpclk; /* ( n * 16 ) -> 736 clock cycles -> 15.330uS at 48MHz <= 15.625uS ( 64ms / 4096 row ) */
+
+	LPC_EMC->DYNAMICCONTROL    = 0x00000083; /* Issue MODE command */
+
+	//Timing for 48/60/72MHZ Bus
+	temp = *((volatile uint32_t *)(SDRAM_BASE | (2<<4| 2)<<(9+2+2))); /* 4 burst, 2 CAS latency */
+	temp = temp;
+	LPC_EMC->DYNAMICCONTROL    = 0x00000000; /* Issue NORMAL command */
+
+	//[re]enable buffers
+	LPC_EMC->DYNAMICCONFIG0    |= 1<<19;
+
+  return TRUE;
+}
+
+uint32_t sdram_test( void )
+{
+  volatile uint32_t *wr_ptr; 
+  volatile uint16_t *short_wr_ptr;
+  uint32_t data;
+  uint32_t i, j;
+
+  wr_ptr = (uint32_t *)SDRAM_BASE;
+  short_wr_ptr = (uint16_t *)wr_ptr;
+    
+  /* 16 bit write */
+  for (i = 0; i < SDRAM_SIZE/0x40000; i++)
+  {
+    for (j = 0; j < 0x100; j++)
+    {
+      *short_wr_ptr++ = (i + j) & 0xFFFF;
+      *short_wr_ptr++ = ((i + j) + 1) & 0xFFFF;
+    }
+  }
+
+  /* Verifying */
+  wr_ptr = (uint32_t *)SDRAM_BASE;
+  for (i = 0; i < SDRAM_SIZE/0x40000; i++)
+  {
+    for (j = 0; j < 0x100; j++)
+    {
+      data = *wr_ptr;          
+      if (data != (((((i + j) + 1) & 0xFFFF) << 16) | ((i + j) & 0xFFFF)))
+      {
+        return 0x0;
+      }
+      wr_ptr++;
+    }
+  }
+  return 0x1;
+}
+
+#endif

+ 31 - 31
boards/embedded_artists/ea4357/sdram.h → hw/boards/embedded_artists/ea4357/sdram.h

@@ -1,31 +1,31 @@
-/*****************************************************************************
- *
- *   Copyright(C) 2011, Embedded Artists AB
- *   All rights reserved.
- *
- ******************************************************************************
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * products. This software is supplied "AS IS" without any warranties.
- * Embedded Artists AB assumes no responsibility or liability for the
- * use of the software, conveys no license or title under any patent,
- * copyright, or mask work right to the product. Embedded Artists AB
- * reserves the right to make changes in the software without
- * notification. Embedded Artists AB also make no representation or
- * warranty that such application will be suitable for the specified
- * use without further testing or modification.
- *****************************************************************************/
-#ifndef __SDRAM_H
-#define __SDRAM_H
-
-#define SDRAM_SIZE               0x2000000  /* 256Mbit = 32MB */
-
-#define SDRAM_BASE               0x28000000 /*CS0*/
-
-extern uint32_t sdram_init(void);
-extern uint32_t sdram_test(void);
-
-#endif /* end __SDRAM_H */
-/****************************************************************************
-**                            End Of File
-*****************************************************************************/
+/*****************************************************************************
+ *
+ *   Copyright(C) 2011, Embedded Artists AB
+ *   All rights reserved.
+ *
+ ******************************************************************************
+ * Software that is described herein is for illustrative purposes only
+ * which provides customers with programming information regarding the
+ * products. This software is supplied "AS IS" without any warranties.
+ * Embedded Artists AB assumes no responsibility or liability for the
+ * use of the software, conveys no license or title under any patent,
+ * copyright, or mask work right to the product. Embedded Artists AB
+ * reserves the right to make changes in the software without
+ * notification. Embedded Artists AB also make no representation or
+ * warranty that such application will be suitable for the specified
+ * use without further testing or modification.
+ *****************************************************************************/
+#ifndef __SDRAM_H
+#define __SDRAM_H
+
+#define SDRAM_SIZE               0x2000000  /* 256Mbit = 32MB */
+
+#define SDRAM_BASE               0x28000000 /*CS0*/
+
+extern uint32_t sdram_init(void);
+extern uint32_t sdram_test(void);
+
+#endif /* end __SDRAM_H */
+/****************************************************************************
+**                            End Of File
+*****************************************************************************/

+ 0 - 0
boards/embedded_artists/oem_base_board/acc.c → hw/boards/embedded_artists/oem_base_board/acc.c


+ 0 - 0
boards/embedded_artists/oem_base_board/acc.h → hw/boards/embedded_artists/oem_base_board/acc.h


+ 0 - 0
boards/embedded_artists/oem_base_board/base_eeprom.c → hw/boards/embedded_artists/oem_base_board/base_eeprom.c


+ 0 - 0
boards/embedded_artists/oem_base_board/base_eeprom.h → hw/boards/embedded_artists/oem_base_board/base_eeprom.h


+ 0 - 0
boards/embedded_artists/oem_base_board/lm75a.c → hw/boards/embedded_artists/oem_base_board/lm75a.c


+ 0 - 0
boards/embedded_artists/oem_base_board/lm75a.h → hw/boards/embedded_artists/oem_base_board/lm75a.h


+ 0 - 0
boards/embedded_artists/oem_base_board/memreg.c → hw/boards/embedded_artists/oem_base_board/memreg.c


+ 0 - 0
boards/embedded_artists/oem_base_board/memreg.h → hw/boards/embedded_artists/oem_base_board/memreg.h


+ 0 - 0
boards/embedded_artists/oem_base_board/norflash.c → hw/boards/embedded_artists/oem_base_board/norflash.c


+ 0 - 0
boards/embedded_artists/oem_base_board/norflash.h → hw/boards/embedded_artists/oem_base_board/norflash.h


+ 349 - 349
boards/embedded_artists/oem_base_board/pca9532.c → hw/boards/embedded_artists/oem_base_board/pca9532.c

@@ -1,349 +1,349 @@
-/*****************************************************************************
- *
- *   Copyright(C) 2011, Embedded Artists AB
- *   All rights reserved.
- *
- ******************************************************************************
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * products. This software is supplied "AS IS" without any warranties.
- * Embedded Artists AB assumes no responsibility or liability for the
- * use of the software, conveys no license or title under any patent,
- * copyright, or mask work right to the product. Embedded Artists AB
- * reserves the right to make changes in the software without
- * notification. Embedded Artists AB also make no representation or
- * warranty that such application will be suitable for the specified
- * use without further testing or modification.
- *****************************************************************************/
-
-/*
- * NOTE: I2C must have been initialized before calling any functions in this
- * file.
- */
-
-/******************************************************************************
- * Includes
- *****************************************************************************/
-#include "../../board.h"
-
-#if BOARD == BOARD_EA4357
-
-#include "lpc43xx_i2c.h"
-#include "lpc43xx_cgu.h"
-#include "lpc_types.h"
-#include "pca9532.h"
-
-/******************************************************************************
- * Defines and typedefs
- *****************************************************************************/
-
-#define I2C_PORT (LPC_I2C0)
-
-#define LS_MODE_ON     0x01
-#define LS_MODE_BLINK0 0x02
-#define LS_MODE_BLINK1 0x03
-
-/******************************************************************************
- * External global variables
- *****************************************************************************/
-
-
-/******************************************************************************
- * Local variables
- *****************************************************************************/
-
-static uint16_t blink0Shadow = 0;
-static uint16_t blink1Shadow = 0;
-static uint16_t ledStateShadow = 0;
-
-/******************************************************************************
- * Local Functions
- *****************************************************************************/
-
-static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len)
-{
-  I2C_M_SETUP_Type i2cData;
-
-	i2cData.sl_addr7bit = addr;
-	i2cData.tx_data = buf;
-	i2cData.tx_length = len;
-	i2cData.rx_data = NULL;
-	i2cData.rx_length = 0;
-	i2cData.retransmissions_max = 3;
-
-  return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING);
-}
-
-static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len)
-{
-  I2C_M_SETUP_Type i2cData;
-
-	i2cData.sl_addr7bit = addr;
-	i2cData.tx_data = NULL;
-	i2cData.tx_length = 0;
-	i2cData.rx_data = buf;
-	i2cData.rx_length = len;
-	i2cData.retransmissions_max = 3;
-
-  return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING);
-}
-
-static void setLsStates(uint16_t states, uint8_t* ls, uint8_t mode)
-{
-#define IS_LED_SET(bit, x) ( ( ((x) & (bit)) != 0 ) ? 1 : 0 )
-
-    int i = 0;
-
-    for (i = 0; i < 4; i++) {
-
-        ls[i] |= ( (IS_LED_SET(0x0001, states)*mode << 0)
-                | (IS_LED_SET(0x0002, states)*mode << 2)
-                | (IS_LED_SET(0x0004, states)*mode << 4)
-                | (IS_LED_SET(0x0008, states)*mode << 6) );
-
-        states >>= 4;
-    }
-}
-
-static void setLeds(void)
-{
-    uint8_t buf[5];
-    uint8_t ls[4] = {0,0,0,0};
-    uint16_t states = ledStateShadow;
-
-    /* LEDs in On/Off state */
-    setLsStates(states, ls, LS_MODE_ON);
-
-    /* set the LEDs that should blink */
-    setLsStates(blink0Shadow, ls, LS_MODE_BLINK0);
-    setLsStates(blink1Shadow, ls, LS_MODE_BLINK1);
-
-
-    buf[0] = PCA9532_LS0 | PCA9532_AUTO_INC;
-    buf[1] = ls[0];
-    buf[2] = ls[1];
-    buf[3] = ls[2];
-    buf[4] = ls[3];
-    I2CWrite(PCA9532_I2C_ADDR, buf, 5);
-}
-
-/******************************************************************************
- * Public Functions
- *****************************************************************************/
-
-/******************************************************************************
- *
- * Description:
- *    Initialize the PCA9532 Device
- *
- *****************************************************************************/
-void pca9532_init (void)
-{
-    /* nothing to initialize */
-}
-
-/******************************************************************************
- *
- * Description:
- *    Get the LED states
- *
- * Params:
- *    [in]  shadow  - TRUE if the states should be retrieved from the shadow
- *                    variables. The shadow variable are updated when any
- *                    of setLeds, setBlink0Leds and/or setBlink1Leds are
- *                    called.
- *
- *                    FALSE if the state should be retrieved from the PCA9532
- *                    device. A blinkin LED may be reported as on or off
- *                    depending on the state when calling the function.
- *
- * Returns:
- *      A mask where a 1 indicates that a LED is on (or blinking).
- *
- *****************************************************************************/
-uint16_t pca9532_getLedState (uint32_t shadow)
-{
-    uint8_t buf[2];
-    uint16_t ret = 0;
-
-    if (shadow) {
-        /* a blink LED is reported as on*/
-        ret = (ledStateShadow | blink0Shadow | blink1Shadow);
-    }
-    else {
-
-        /*
-         * A blinking LED may be reported as on or off depending on
-         * its state when reading the Input register.
-         */
-
-        buf[0] = PCA9532_INPUT0;
-        I2CWrite(PCA9532_I2C_ADDR, buf, 1);
-
-        I2CRead(PCA9532_I2C_ADDR, buf, 1);
-        ret = buf[0];
-
-
-        buf[0] = PCA9532_INPUT1;
-        I2CWrite(PCA9532_I2C_ADDR, buf, 1);
-
-        I2CRead(PCA9532_I2C_ADDR, buf, 1);
-        ret |= (buf[0] << 8);
-
-
-        /* invert since LEDs are active low */
-        ret = ((~ret) & 0xFFFF);
-    }
-
-    return (ret & ~PCA9532_NOT_USED);
-}
-
-
-/******************************************************************************
- *
- * Description:
- *    Set LED states (on or off).
- *
- * Params:
- *    [in]  ledOnMask  - The LEDs that should be turned on. This mask has
- *                       priority over ledOffMask
- *    [in]  ledOffMask - The LEDs that should be turned off.
- *
- *****************************************************************************/
-void pca9532_setLeds (uint16_t ledOnMask, uint16_t ledOffMask)
-{
-    /* turn off leds */
-    ledStateShadow &= (~(ledOffMask) & 0xffff);
-
-    /* ledOnMask has priority over ledOffMask */
-    ledStateShadow |= ledOnMask;
-
-    /* turn off blinking */
-    blink0Shadow &= (~(ledOffMask) & 0xffff);
-    blink1Shadow &= (~(ledOffMask) & 0xffff);
-
-    setLeds();
-}
-
-/******************************************************************************
- *
- * Description:
- *    Set the blink period for PWM0. Valid values are 0 - 255 where 0
- *    means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz.
- *
- * Params:
- *    [in]  period  - the period for pwm0
- *
- *****************************************************************************/
-void pca9532_setBlink0Period(uint8_t period)
-{
-    uint8_t buf[2];
-
-    buf[0] = PCA9532_PSC0;
-    buf[1] = period;
-    I2CWrite(PCA9532_I2C_ADDR, buf, 2);
-}
-
-/******************************************************************************
- *
- * Description:
- *    Set the duty cycle for PWM0. Valid values are 0 - 100. 25 means the LED
- *    is on 25% of the period.
- *
- * Params:
- *    [in]  duty  - duty cycle
- *
- *****************************************************************************/
-void pca9532_setBlink0Duty(uint8_t duty)
-{
-    uint8_t buf[2];
-    uint32_t tmp = duty;
-    if (tmp > 100) {
-        tmp = 100;
-    }
-
-    tmp = (256 * tmp)/100;
-
-    buf[0] = PCA9532_PWM0;
-    buf[1] = tmp;
-    I2CWrite(PCA9532_I2C_ADDR, buf, 2);
-}
-
-/******************************************************************************
- *
- * Description:
- *    Set the LEDs that should blink with rate and duty cycle from PWM0.
- *    Blinking is turned off with pca9532_setLeds.
- *
- * Params:
- *    [in]  ledMask  - LEDs that should blink.
- *
- *****************************************************************************/
-void pca9532_setBlink0Leds(uint16_t ledMask)
-{
-    blink0Shadow |= ledMask;
-    setLeds();
-}
-
-/******************************************************************************
- *
- * Description:
- *    Set the blink period for PWM1. Valid values are 0 - 255 where 0
- *    means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz.
- *
- * Params:
- *    [in]  period  - The period for PWM1
- *
- *****************************************************************************/
-void pca9532_setBlink1Period(uint8_t period)
-{
-    uint8_t buf[2];
-
-    buf[0] = PCA9532_PSC1;
-    buf[1] = period;
-    I2CWrite(PCA9532_I2C_ADDR, buf, 2);
-}
-
-/******************************************************************************
- *
- * Description:
- *    Set the duty cycle for PWM1. Valid values are 0 - 100. 25 means the LED
- *    is on 25% of the period.
- *
- * Params:
- *    [in]  duty  - duty cycle.
- *
- *****************************************************************************/
-void pca9532_setBlink1Duty(uint8_t duty)
-{
-    uint8_t buf[2];
-
-    uint32_t tmp = duty;
-    if (tmp > 100) {
-        tmp = 100;
-    }
-
-    tmp = (256 * tmp)/100;
-
-    buf[0] = PCA9532_PWM1;
-    buf[1] = tmp;
-    I2CWrite(PCA9532_I2C_ADDR, buf, 2);
-}
-
-/******************************************************************************
- *
- * Description:
- *    Set the LEDs that should blink with rate and duty cycle from PWM1.
- *    Blinking is turned off with pca9532_setLeds.
- *
- * Params:
- *    [in]  ledMask  - LEDs that should blink.
- *
- *****************************************************************************/
-void pca9532_setBlink1Leds(uint16_t ledMask)
-{
-    blink1Shadow |= ledMask;
-    setLeds();
-}
-
-#endif
+/*****************************************************************************
+ *
+ *   Copyright(C) 2011, Embedded Artists AB
+ *   All rights reserved.
+ *
+ ******************************************************************************
+ * Software that is described herein is for illustrative purposes only
+ * which provides customers with programming information regarding the
+ * products. This software is supplied "AS IS" without any warranties.
+ * Embedded Artists AB assumes no responsibility or liability for the
+ * use of the software, conveys no license or title under any patent,
+ * copyright, or mask work right to the product. Embedded Artists AB
+ * reserves the right to make changes in the software without
+ * notification. Embedded Artists AB also make no representation or
+ * warranty that such application will be suitable for the specified
+ * use without further testing or modification.
+ *****************************************************************************/
+
+/*
+ * NOTE: I2C must have been initialized before calling any functions in this
+ * file.
+ */
+
+/******************************************************************************
+ * Includes
+ *****************************************************************************/
+#include "../../board.h"
+
+#if BOARD == BOARD_EA4357
+
+#include "lpc43xx_i2c.h"
+#include "lpc43xx_cgu.h"
+#include "lpc_types.h"
+#include "pca9532.h"
+
+/******************************************************************************
+ * Defines and typedefs
+ *****************************************************************************/
+
+#define I2C_PORT (LPC_I2C0)
+
+#define LS_MODE_ON     0x01
+#define LS_MODE_BLINK0 0x02
+#define LS_MODE_BLINK1 0x03
+
+/******************************************************************************
+ * External global variables
+ *****************************************************************************/
+
+
+/******************************************************************************
+ * Local variables
+ *****************************************************************************/
+
+static uint16_t blink0Shadow = 0;
+static uint16_t blink1Shadow = 0;
+static uint16_t ledStateShadow = 0;
+
+/******************************************************************************
+ * Local Functions
+ *****************************************************************************/
+
+static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len)
+{
+  I2C_M_SETUP_Type i2cData;
+
+	i2cData.sl_addr7bit = addr;
+	i2cData.tx_data = buf;
+	i2cData.tx_length = len;
+	i2cData.rx_data = NULL;
+	i2cData.rx_length = 0;
+	i2cData.retransmissions_max = 3;
+
+  return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING);
+}
+
+static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len)
+{
+  I2C_M_SETUP_Type i2cData;
+
+	i2cData.sl_addr7bit = addr;
+	i2cData.tx_data = NULL;
+	i2cData.tx_length = 0;
+	i2cData.rx_data = buf;
+	i2cData.rx_length = len;
+	i2cData.retransmissions_max = 3;
+
+  return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING);
+}
+
+static void setLsStates(uint16_t states, uint8_t* ls, uint8_t mode)
+{
+#define IS_LED_SET(bit, x) ( ( ((x) & (bit)) != 0 ) ? 1 : 0 )
+
+    int i = 0;
+
+    for (i = 0; i < 4; i++) {
+
+        ls[i] |= ( (IS_LED_SET(0x0001, states)*mode << 0)
+                | (IS_LED_SET(0x0002, states)*mode << 2)
+                | (IS_LED_SET(0x0004, states)*mode << 4)
+                | (IS_LED_SET(0x0008, states)*mode << 6) );
+
+        states >>= 4;
+    }
+}
+
+static void setLeds(void)
+{
+    uint8_t buf[5];
+    uint8_t ls[4] = {0,0,0,0};
+    uint16_t states = ledStateShadow;
+
+    /* LEDs in On/Off state */
+    setLsStates(states, ls, LS_MODE_ON);
+
+    /* set the LEDs that should blink */
+    setLsStates(blink0Shadow, ls, LS_MODE_BLINK0);
+    setLsStates(blink1Shadow, ls, LS_MODE_BLINK1);
+
+
+    buf[0] = PCA9532_LS0 | PCA9532_AUTO_INC;
+    buf[1] = ls[0];
+    buf[2] = ls[1];
+    buf[3] = ls[2];
+    buf[4] = ls[3];
+    I2CWrite(PCA9532_I2C_ADDR, buf, 5);
+}
+
+/******************************************************************************
+ * Public Functions
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * Description:
+ *    Initialize the PCA9532 Device
+ *
+ *****************************************************************************/
+void pca9532_init (void)
+{
+    /* nothing to initialize */
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Get the LED states
+ *
+ * Params:
+ *    [in]  shadow  - TRUE if the states should be retrieved from the shadow
+ *                    variables. The shadow variable are updated when any
+ *                    of setLeds, setBlink0Leds and/or setBlink1Leds are
+ *                    called.
+ *
+ *                    FALSE if the state should be retrieved from the PCA9532
+ *                    device. A blinkin LED may be reported as on or off
+ *                    depending on the state when calling the function.
+ *
+ * Returns:
+ *      A mask where a 1 indicates that a LED is on (or blinking).
+ *
+ *****************************************************************************/
+uint16_t pca9532_getLedState (uint32_t shadow)
+{
+    uint8_t buf[2];
+    uint16_t ret = 0;
+
+    if (shadow) {
+        /* a blink LED is reported as on*/
+        ret = (ledStateShadow | blink0Shadow | blink1Shadow);
+    }
+    else {
+
+        /*
+         * A blinking LED may be reported as on or off depending on
+         * its state when reading the Input register.
+         */
+
+        buf[0] = PCA9532_INPUT0;
+        I2CWrite(PCA9532_I2C_ADDR, buf, 1);
+
+        I2CRead(PCA9532_I2C_ADDR, buf, 1);
+        ret = buf[0];
+
+
+        buf[0] = PCA9532_INPUT1;
+        I2CWrite(PCA9532_I2C_ADDR, buf, 1);
+
+        I2CRead(PCA9532_I2C_ADDR, buf, 1);
+        ret |= (buf[0] << 8);
+
+
+        /* invert since LEDs are active low */
+        ret = ((~ret) & 0xFFFF);
+    }
+
+    return (ret & ~PCA9532_NOT_USED);
+}
+
+
+/******************************************************************************
+ *
+ * Description:
+ *    Set LED states (on or off).
+ *
+ * Params:
+ *    [in]  ledOnMask  - The LEDs that should be turned on. This mask has
+ *                       priority over ledOffMask
+ *    [in]  ledOffMask - The LEDs that should be turned off.
+ *
+ *****************************************************************************/
+void pca9532_setLeds (uint16_t ledOnMask, uint16_t ledOffMask)
+{
+    /* turn off leds */
+    ledStateShadow &= (~(ledOffMask) & 0xffff);
+
+    /* ledOnMask has priority over ledOffMask */
+    ledStateShadow |= ledOnMask;
+
+    /* turn off blinking */
+    blink0Shadow &= (~(ledOffMask) & 0xffff);
+    blink1Shadow &= (~(ledOffMask) & 0xffff);
+
+    setLeds();
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Set the blink period for PWM0. Valid values are 0 - 255 where 0
+ *    means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz.
+ *
+ * Params:
+ *    [in]  period  - the period for pwm0
+ *
+ *****************************************************************************/
+void pca9532_setBlink0Period(uint8_t period)
+{
+    uint8_t buf[2];
+
+    buf[0] = PCA9532_PSC0;
+    buf[1] = period;
+    I2CWrite(PCA9532_I2C_ADDR, buf, 2);
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Set the duty cycle for PWM0. Valid values are 0 - 100. 25 means the LED
+ *    is on 25% of the period.
+ *
+ * Params:
+ *    [in]  duty  - duty cycle
+ *
+ *****************************************************************************/
+void pca9532_setBlink0Duty(uint8_t duty)
+{
+    uint8_t buf[2];
+    uint32_t tmp = duty;
+    if (tmp > 100) {
+        tmp = 100;
+    }
+
+    tmp = (256 * tmp)/100;
+
+    buf[0] = PCA9532_PWM0;
+    buf[1] = tmp;
+    I2CWrite(PCA9532_I2C_ADDR, buf, 2);
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Set the LEDs that should blink with rate and duty cycle from PWM0.
+ *    Blinking is turned off with pca9532_setLeds.
+ *
+ * Params:
+ *    [in]  ledMask  - LEDs that should blink.
+ *
+ *****************************************************************************/
+void pca9532_setBlink0Leds(uint16_t ledMask)
+{
+    blink0Shadow |= ledMask;
+    setLeds();
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Set the blink period for PWM1. Valid values are 0 - 255 where 0
+ *    means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz.
+ *
+ * Params:
+ *    [in]  period  - The period for PWM1
+ *
+ *****************************************************************************/
+void pca9532_setBlink1Period(uint8_t period)
+{
+    uint8_t buf[2];
+
+    buf[0] = PCA9532_PSC1;
+    buf[1] = period;
+    I2CWrite(PCA9532_I2C_ADDR, buf, 2);
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Set the duty cycle for PWM1. Valid values are 0 - 100. 25 means the LED
+ *    is on 25% of the period.
+ *
+ * Params:
+ *    [in]  duty  - duty cycle.
+ *
+ *****************************************************************************/
+void pca9532_setBlink1Duty(uint8_t duty)
+{
+    uint8_t buf[2];
+
+    uint32_t tmp = duty;
+    if (tmp > 100) {
+        tmp = 100;
+    }
+
+    tmp = (256 * tmp)/100;
+
+    buf[0] = PCA9532_PWM1;
+    buf[1] = tmp;
+    I2CWrite(PCA9532_I2C_ADDR, buf, 2);
+}
+
+/******************************************************************************
+ *
+ * Description:
+ *    Set the LEDs that should blink with rate and duty cycle from PWM1.
+ *    Blinking is turned off with pca9532_setLeds.
+ *
+ * Params:
+ *    [in]  ledMask  - LEDs that should blink.
+ *
+ *****************************************************************************/
+void pca9532_setBlink1Leds(uint16_t ledMask)
+{
+    blink1Shadow |= ledMask;
+    setLeds();
+}
+
+#endif

+ 0 - 0
boards/embedded_artists/oem_base_board/pca9532.h → hw/boards/embedded_artists/oem_base_board/pca9532.h


+ 0 - 0
boards/embedded_artists/oem_base_board/uda1380.c → hw/boards/embedded_artists/oem_base_board/uda1380.c


+ 0 - 0
boards/embedded_artists/oem_base_board/uda1380.h → hw/boards/embedded_artists/oem_base_board/uda1380.h


+ 0 - 0
boards/hitex/board_hitex4350.c → hw/boards/hitex/board_hitex4350.c


+ 0 - 0
boards/hitex/board_hitex4350.h → hw/boards/hitex/board_hitex4350.h


+ 0 - 0
boards/keil/board_mcb4300.c → hw/boards/keil/board_mcb4300.c


+ 0 - 0
boards/keil/board_mcb4300.h → hw/boards/keil/board_mcb4300.h


+ 126 - 126
boards/lpcxpresso/board_lpclink2.c → hw/boards/lpcxpresso/board_lpclink2.c

@@ -1,126 +1,126 @@
-/**************************************************************************/
-/*!
-    @file     board_lpclink2.c
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#include "../board.h"
-
-#if BOARD == BOARD_LPCLINK2
-
-#define BOARD_UART_PORT           LPC_USART0
-#define BOARD_UART_PIN_PORT       0x0f
-#define BOARD_UART_PIN_TX         10 // PF.10 : UART0_TXD
-#define BOARD_UART_PIN_RX         11 // PF.11 : UART0_RXD
-
-#define BOARD_MAX_LEDS  1
-
-const static struct {
-  uint8_t port;
-  uint8_t pin;
-}leds[BOARD_MAX_LEDS] = { {0, 8} };
-
-void board_init(void)
-{
-  CGU_Init();
-
-#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
-  SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE) / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
-#endif
-
-  //------------- USB -------------//
-
-
-  //------------- LED -------------//
-  for (uint8_t i=0; i<BOARD_MAX_LEDS; i++)
-  {
-    scu_pinmux(leds[i].port, leds[i].pin, MD_PUP|MD_EZI|MD_ZI, FUNC0);
-    GPIO_SetDir(leds[i].port, BIT_(leds[i].pin), 1); // output
-  }
-
-
-#if CFG_UART_ENABLE
-  //------------- UART -------------//
-  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN, FUNC1);
-  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN | MD_EZI | MD_ZI, FUNC1);
-
-  UART_CFG_Type UARTConfigStruct;
-  UART_ConfigStructInit(&UARTConfigStruct);
-  UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE;
-  UARTConfigStruct.Clock_Speed = 0;
-
-  UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
-  UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit
-#endif
-}
-
-//--------------------------------------------------------------------+
-// LEDS
-//--------------------------------------------------------------------+
-void board_leds(uint32_t on_mask, uint32_t off_mask)
-{
-  for (uint32_t i=0; i<BOARD_MAX_LEDS; i++)
-  {
-    if ( on_mask & BIT_(i))
-    {
-      GPIO_SetValue(leds[i].port, BIT_(leds[i].pin));
-    }else if ( off_mask & BIT_(i)) // on_mask take precedence over off_mask
-    {
-      GPIO_ClearValue(leds[i].port, BIT_(leds[i].pin));
-    }
-  }
-}
-
-//--------------------------------------------------------------------+
-// UART
-//--------------------------------------------------------------------+
-#if CFG_UART_ENABLE
-uint32_t board_uart_send(uint8_t *buffer, uint32_t length)
-{
-  return UART_Send(BOARD_UART_PORT, buffer, length, BLOCKING);
-}
-
-uint32_t board_uart_recv(uint8_t *buffer, uint32_t length)
-{
-  return UART_Receive(BOARD_UART_PORT, buffer, length, BLOCKING);
-}
-
-uint8_t  board_uart_getchar(void)
-{
-  return UART_ReceiveByte(BOARD_UART_PORT);
-}
-#endif
-
-#endif
+/**************************************************************************/
+/*!
+    @file     board_lpclink2.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "../board.h"
+
+#if BOARD == BOARD_LPCLINK2
+
+#define BOARD_UART_PORT           LPC_USART0
+#define BOARD_UART_PIN_PORT       0x0f
+#define BOARD_UART_PIN_TX         10 // PF.10 : UART0_TXD
+#define BOARD_UART_PIN_RX         11 // PF.11 : UART0_RXD
+
+#define BOARD_MAX_LEDS  1
+
+const static struct {
+  uint8_t port;
+  uint8_t pin;
+}leds[BOARD_MAX_LEDS] = { {0, 8} };
+
+void board_init(void)
+{
+  CGU_Init();
+
+#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
+  SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE) / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
+#endif
+
+  //------------- USB -------------//
+
+
+  //------------- LED -------------//
+  for (uint8_t i=0; i<BOARD_MAX_LEDS; i++)
+  {
+    scu_pinmux(leds[i].port, leds[i].pin, MD_PUP|MD_EZI|MD_ZI, FUNC0);
+    GPIO_SetDir(leds[i].port, BIT_(leds[i].pin), 1); // output
+  }
+
+
+#if CFG_UART_ENABLE
+  //------------- UART -------------//
+  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN, FUNC1);
+  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN | MD_EZI | MD_ZI, FUNC1);
+
+  UART_CFG_Type UARTConfigStruct;
+  UART_ConfigStructInit(&UARTConfigStruct);
+  UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE;
+  UARTConfigStruct.Clock_Speed = 0;
+
+  UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
+  UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit
+#endif
+}
+
+//--------------------------------------------------------------------+
+// LEDS
+//--------------------------------------------------------------------+
+void board_leds(uint32_t on_mask, uint32_t off_mask)
+{
+  for (uint32_t i=0; i<BOARD_MAX_LEDS; i++)
+  {
+    if ( on_mask & BIT_(i))
+    {
+      GPIO_SetValue(leds[i].port, BIT_(leds[i].pin));
+    }else if ( off_mask & BIT_(i)) // on_mask take precedence over off_mask
+    {
+      GPIO_ClearValue(leds[i].port, BIT_(leds[i].pin));
+    }
+  }
+}
+
+//--------------------------------------------------------------------+
+// UART
+//--------------------------------------------------------------------+
+#if CFG_UART_ENABLE
+uint32_t board_uart_send(uint8_t *buffer, uint32_t length)
+{
+  return UART_Send(BOARD_UART_PORT, buffer, length, BLOCKING);
+}
+
+uint32_t board_uart_recv(uint8_t *buffer, uint32_t length)
+{
+  return UART_Receive(BOARD_UART_PORT, buffer, length, BLOCKING);
+}
+
+uint8_t  board_uart_getchar(void)
+{
+  return UART_ReceiveByte(BOARD_UART_PORT);
+}
+#endif
+
+#endif

+ 59 - 59
boards/lpcxpresso/board_lpclink2.h → hw/boards/lpcxpresso/board_lpclink2.h

@@ -1,59 +1,59 @@
-/**************************************************************************/
-/*!
-    @file     board_lpclink2.h
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#ifndef _TUSB_BOARD_LPCLINK2_H_
-#define _TUSB_BOARD_LPCLINK2_H_
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-#include "LPC43xx.h"
-#include "lpc43xx_scu.h"
-#include "lpc43xx_cgu.h"a
-#include "lpc43xx_gpio.h"
-#include "lpc43xx_uart.h"
-#include "lpc43xx_i2c.h"
-
-#define CFG_PRINTF_TARGET       PRINTF_TARGET_UART
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif /* _TUSB_BOARD_LPCLINK2_H_ */
+/**************************************************************************/
+/*!
+    @file     board_lpclink2.h
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#ifndef _TUSB_BOARD_LPCLINK2_H_
+#define _TUSB_BOARD_LPCLINK2_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "LPC43xx.h"
+#include "lpc43xx_scu.h"
+#include "lpc43xx_cgu.h"a
+#include "lpc43xx_gpio.h"
+#include "lpc43xx_uart.h"
+#include "lpc43xx_i2c.h"
+
+#define CFG_PRINTF_TARGET       PRINTF_TARGET_UART
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_BOARD_LPCLINK2_H_ */

+ 0 - 0
boards/lpcxpresso/board_lpcxpresso11u14.c → hw/boards/lpcxpresso/board_lpcxpresso11u14.c


+ 0 - 0
boards/lpcxpresso/board_lpcxpresso11u14.h → hw/boards/lpcxpresso/board_lpcxpresso11u14.h


+ 114 - 114
boards/lpcxpresso/board_lpcxpresso11u68.c → hw/boards/lpcxpresso/board_lpcxpresso11u68.c

@@ -1,114 +1,114 @@
-/**************************************************************************/
-/*!
-    @file     board_rf1ghznode.c
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#include "../board.h"
-
-#if BOARD == BOARD_LPCXPRESSO11U68
-
-#define LED_PORT                  (1)
-#define LED_PIN                   (31)
-#define LED_ON                    (0)
-#define LED_OFF                   (1)
-
-const static struct {
-  uint8_t port;
-  uint8_t pin;
-} buttons[] = { { 0, 1 } };
-
-enum {
-  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
-};
-
-void board_init(void)
-{
-  SystemInit();
-
-#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
-  SysTick_Config(SystemCoreClock / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
-#endif
-
-  GPIOInit();
-
-  //------------- LED -------------//
-  GPIOSetDir(LED_PORT, LED_PIN, 1);
-
-  //------------- BUTTON -------------//
-  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOSetDir(buttons[i].port, buttons[i].pin, 0);
-
-  //------------- UART -------------//
-  UARTInit(CFG_UART_BAUDRATE);
-}
-
-//--------------------------------------------------------------------+
-// LEDS
-//--------------------------------------------------------------------+
-void board_leds(uint32_t on_mask, uint32_t off_mask)
-{
-  if (on_mask & BIT_(0))
-  {
-    GPIOSetBitValue(LED_PORT, LED_PIN, LED_ON);
-  }else if (off_mask & BIT_(0))
-  {
-    GPIOSetBitValue(LED_PORT, LED_PIN, LED_OFF);
-  }
-}
-
-//--------------------------------------------------------------------+
-// Buttons
-//--------------------------------------------------------------------+
-uint32_t board_buttons(void)
-{
-//  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOGetPinValue(buttons[i].port, buttons[i].pin);
-  return GPIOGetPinValue(buttons[0].port, buttons[0].pin) ? 0 : 1; // button is active low
-}
-
-//--------------------------------------------------------------------+
-// UART
-//--------------------------------------------------------------------+
-void board_uart_putchar(uint8_t c)
-{
-  UARTSend(&c, 1);
-}
-
-uint8_t  board_uart_getchar(void)
-{
-//  *buffer = get_key(); TODO cannot find available code for uart getchar
-  return 0;
-}
-
-#endif
+/**************************************************************************/
+/*!
+    @file     board_rf1ghznode.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "../board.h"
+
+#if BOARD == BOARD_LPCXPRESSO11U68
+
+#define LED_PORT                  (1)
+#define LED_PIN                   (31)
+#define LED_ON                    (0)
+#define LED_OFF                   (1)
+
+const static struct {
+  uint8_t port;
+  uint8_t pin;
+} buttons[] = { { 0, 1 } };
+
+enum {
+  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
+};
+
+void board_init(void)
+{
+  SystemInit();
+
+#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
+  SysTick_Config(SystemCoreClock / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
+#endif
+
+  GPIOInit();
+
+  //------------- LED -------------//
+  GPIOSetDir(LED_PORT, LED_PIN, 1);
+
+  //------------- BUTTON -------------//
+  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOSetDir(buttons[i].port, buttons[i].pin, 0);
+
+  //------------- UART -------------//
+  UARTInit(CFG_UART_BAUDRATE);
+}
+
+//--------------------------------------------------------------------+
+// LEDS
+//--------------------------------------------------------------------+
+void board_leds(uint32_t on_mask, uint32_t off_mask)
+{
+  if (on_mask & BIT_(0))
+  {
+    GPIOSetBitValue(LED_PORT, LED_PIN, LED_ON);
+  }else if (off_mask & BIT_(0))
+  {
+    GPIOSetBitValue(LED_PORT, LED_PIN, LED_OFF);
+  }
+}
+
+//--------------------------------------------------------------------+
+// Buttons
+//--------------------------------------------------------------------+
+uint32_t board_buttons(void)
+{
+//  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOGetPinValue(buttons[i].port, buttons[i].pin);
+  return GPIOGetPinValue(buttons[0].port, buttons[0].pin) ? 0 : 1; // button is active low
+}
+
+//--------------------------------------------------------------------+
+// UART
+//--------------------------------------------------------------------+
+void board_uart_putchar(uint8_t c)
+{
+  UARTSend(&c, 1);
+}
+
+uint8_t  board_uart_getchar(void)
+{
+//  *buffer = get_key(); TODO cannot find available code for uart getchar
+  return 0;
+}
+
+#endif

+ 57 - 57
boards/lpcxpresso/board_lpcxpresso11u68.h → hw/boards/lpcxpresso/board_lpcxpresso11u68.h

@@ -1,57 +1,57 @@
-/**************************************************************************/
-/*!
-    @file     board_lpcxpresso11u68.h
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#ifndef _TUSB_BOARD_LPCXPRESSO11U68_H_
-#define _TUSB_BOARD_LPCXPRESSO11U68_H_
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-#include "LPC11Uxx.h"
-#include "lpc11uxx_gpio.h"
-#include "lpc11uxx_uart.h"
-
-//#define CFG_PRINTF_TARGET             PRINTF_TARGET_SEMIHOST
-#define CFG_PRINTF_TARGET             PRINTF_TARGET_UART
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif /* _TUSB_BOARD_LPCXPRESSO11U68_H_ */
+/**************************************************************************/
+/*!
+    @file     board_lpcxpresso11u68.h
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#ifndef _TUSB_BOARD_LPCXPRESSO11U68_H_
+#define _TUSB_BOARD_LPCXPRESSO11U68_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "LPC11Uxx.h"
+#include "lpc11uxx_gpio.h"
+#include "lpc11uxx_uart.h"
+
+//#define CFG_PRINTF_TARGET             PRINTF_TARGET_SEMIHOST
+#define CFG_PRINTF_TARGET             PRINTF_TARGET_UART
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_BOARD_LPCXPRESSO11U68_H_ */

+ 132 - 132
boards/lpcxpresso/board_lpcxpresso1347.c → hw/boards/lpcxpresso/board_lpcxpresso1347.c

@@ -1,132 +1,132 @@
-/**************************************************************************/
-/*!
-    @file     board_lpcexpresso1347.c
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#include "../board.h"
-
-#if BOARD == BOARD_LPCXPRESSO1347
-
-#define LED_PORT                  (0)
-#define LED_PIN                   (7)
-#define LED_ON                    (1)
-#define LED_OFF                   (0)
-
-const static struct {
-  uint8_t port;
-  uint8_t pin;
-} buttons[] =
-{
-    {1, 22 }, // Joystick up
-    {1, 20 }, // Joystick down
-    {1, 23 }, // Joystick left
-    {1, 21 }, // Joystick right
-    {1, 19 }, // Joystick press
-    {0, 1  }, // SW3
-//    {1, 4  }, // SW4 (require to remove J28)
-};
-
-enum {
-  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
-};
-
-
-void board_init(void)
-{
-  SystemInit();
-
-#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
-  SysTick_Config(SystemCoreClock / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
-#endif
-
-  GPIOInit();
-
-  //------------- LED -------------//
-  GPIOSetDir(LED_PORT, LED_PIN, 1);
-
-  //------------- BUTTON -------------//
-  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOSetDir(buttons[i].port, BIT_(buttons[i].pin), 0);
-
-  //------------- UART -------------//
-  UARTInit(CFG_UART_BAUDRATE);
-
-}
-
-//--------------------------------------------------------------------+
-// LEDS
-//--------------------------------------------------------------------+
-void board_leds(uint32_t on_mask, uint32_t off_mask)
-{
-  if (on_mask & BIT_(0))
-  {
-    GPIOSetBitValue(LED_PORT, LED_PIN, LED_ON);
-  }else if (off_mask & BIT_(0))
-  {
-    GPIOSetBitValue(LED_PORT, LED_PIN, LED_OFF);
-  }
-}
-
-//--------------------------------------------------------------------+
-// BUTTONS
-//--------------------------------------------------------------------+
-static bool button_read(uint8_t id)
-{
-  return !GPIOGetPinValue(buttons[id].port, buttons[id].pin); // button is active low
-}
-
-uint32_t board_buttons(void)
-{
-  uint32_t result = 0;
-
-  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0);
-
-  return result;
-}
-
-//--------------------------------------------------------------------+
-// UART
-//--------------------------------------------------------------------+
-void board_uart_putchar(uint8_t c)
-{
-  UARTSend(&c, 1);
-}
-
-uint8_t  board_uart_getchar(void)
-{
-  return 0;
-}
-
-#endif
+/**************************************************************************/
+/*!
+    @file     board_lpcexpresso1347.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "../board.h"
+
+#if BOARD == BOARD_LPCXPRESSO1347
+
+#define LED_PORT                  (0)
+#define LED_PIN                   (7)
+#define LED_ON                    (1)
+#define LED_OFF                   (0)
+
+const static struct {
+  uint8_t port;
+  uint8_t pin;
+} buttons[] =
+{
+    {1, 22 }, // Joystick up
+    {1, 20 }, // Joystick down
+    {1, 23 }, // Joystick left
+    {1, 21 }, // Joystick right
+    {1, 19 }, // Joystick press
+    {0, 1  }, // SW3
+//    {1, 4  }, // SW4 (require to remove J28)
+};
+
+enum {
+  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
+};
+
+
+void board_init(void)
+{
+  SystemInit();
+
+#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
+  SysTick_Config(SystemCoreClock / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
+#endif
+
+  GPIOInit();
+
+  //------------- LED -------------//
+  GPIOSetDir(LED_PORT, LED_PIN, 1);
+
+  //------------- BUTTON -------------//
+  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOSetDir(buttons[i].port, BIT_(buttons[i].pin), 0);
+
+  //------------- UART -------------//
+  UARTInit(CFG_UART_BAUDRATE);
+
+}
+
+//--------------------------------------------------------------------+
+// LEDS
+//--------------------------------------------------------------------+
+void board_leds(uint32_t on_mask, uint32_t off_mask)
+{
+  if (on_mask & BIT_(0))
+  {
+    GPIOSetBitValue(LED_PORT, LED_PIN, LED_ON);
+  }else if (off_mask & BIT_(0))
+  {
+    GPIOSetBitValue(LED_PORT, LED_PIN, LED_OFF);
+  }
+}
+
+//--------------------------------------------------------------------+
+// BUTTONS
+//--------------------------------------------------------------------+
+static bool button_read(uint8_t id)
+{
+  return !GPIOGetPinValue(buttons[id].port, buttons[id].pin); // button is active low
+}
+
+uint32_t board_buttons(void)
+{
+  uint32_t result = 0;
+
+  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0);
+
+  return result;
+}
+
+//--------------------------------------------------------------------+
+// UART
+//--------------------------------------------------------------------+
+void board_uart_putchar(uint8_t c)
+{
+  UARTSend(&c, 1);
+}
+
+uint8_t  board_uart_getchar(void)
+{
+  return 0;
+}
+
+#endif

+ 56 - 56
boards/lpcxpresso/board_lpcxpresso1347.h → hw/boards/lpcxpresso/board_lpcxpresso1347.h

@@ -1,56 +1,56 @@
-/**************************************************************************/
-/*!
-    @file     board_lpcxpresso1347.h
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#ifndef _TUSB_BOARD_LPCXPRESSO1347_H_
-#define _TUSB_BOARD_LPCXPRESSO1347_H_
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-#include "LPC13Uxx.h"
-#include "gpio.h"
-#include "uart.h"
-
-#define CFG_PRINTF_TARGET PRINTF_TARGET_UART
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif /* _TUSB_BOARD_LPCXPRESSO1347_H_ */
+/**************************************************************************/
+/*!
+    @file     board_lpcxpresso1347.h
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#ifndef _TUSB_BOARD_LPCXPRESSO1347_H_
+#define _TUSB_BOARD_LPCXPRESSO1347_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "LPC13Uxx.h"
+#include "gpio.h"
+#include "uart.h"
+
+#define CFG_PRINTF_TARGET PRINTF_TARGET_UART
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_BOARD_LPCXPRESSO1347_H_ */

+ 159 - 159
boards/lpcxpresso/board_lpcxpresso1769.c → hw/boards/lpcxpresso/board_lpcxpresso1769.c

@@ -1,159 +1,159 @@
-/**************************************************************************/
-/*!
-    @file     board_lpcxpresso1769.c
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#include "../board.h"
-
-#if BOARD == BOARD_LPCXPRESSO1769
-
-#define BOARD_LED_PORT                  (0)
-#define BOARD_LED_PIN                   (22)
-
-const static struct {
-  uint8_t port;
-  uint8_t pin;
-} buttons[] =
-{
-    {2, 3  }, // Joystick up
-    {0, 15 }, // Joystick down
-    {2, 4  }, // Joystick left
-    {0, 16 }, // Joystick right
-    {0, 17 }, // Joystick press
-    {0, 4  }, // SW3
-//    {1, 31 }, // SW4 (require to remove J28)
-};
-
-enum {
-  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
-};
-
-#define BOARD_UART_PORT   LPC_UART3
-
-void board_init(void)
-{
-  SystemInit();
-
-#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
-  SysTick_Config(SystemCoreClock / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
-#endif
-
-  //------------- LED -------------//
-  GPIO_SetDir(BOARD_LED_PORT, BIT_(BOARD_LED_PIN), 1);
-
-  //------------- BUTTON -------------//
-  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIO_SetDir(buttons[i].port, BIT_(buttons[i].pin), 0);
-
-#if MODE_DEVICE_SUPPORTED
-  //------------- USB Device -------------//
-  // VBUS sense is wrongly connected to P0_5 (instead of P1_30). So we need to always pull P1_30 to high
-  // so that USB device block can work. However, Device Controller (thus tinyusb) cannot able to determine
-  // if device is disconnected or not
-  PINSEL_ConfigPin( &(PINSEL_CFG_Type) {
-      .Portnum = 1, .Pinnum = 30,
-      .Funcnum = 2, .Pinmode = PINSEL_PINMODE_PULLUP} );
-
-  //P0_21 instead of P2_9 as USB connect
-#endif
-
-  //------------- UART -------------//
-  PINSEL_CFG_Type PinCfg =
-  {
-      .Portnum   = 0,
-      .Pinnum    = 0, // TXD is P0.0
-      .Funcnum   = 2,
-      .OpenDrain = 0,
-      .Pinmode   = 0
-  };
-	PINSEL_ConfigPin(&PinCfg);
-
-	PinCfg.Portnum = 0;
-	PinCfg.Pinnum  = 1; // RXD is P0.1
-	PINSEL_ConfigPin(&PinCfg);
-
-	UART_CFG_Type UARTConfigStruct;
-  UART_ConfigStructInit(&UARTConfigStruct);
-	UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE;
-
-	UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
-	UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit
-}
-
-//--------------------------------------------------------------------+
-// LEDS
-//--------------------------------------------------------------------+
-void board_leds(uint32_t on_mask, uint32_t off_mask)
-{
-  if (on_mask & BIT_(0))
-  {
-    GPIO_SetValue(BOARD_LED_PORT, BIT_(BOARD_LED_PIN));
-  }else if (off_mask & BIT_(0))
-  {
-    GPIO_ClearValue(BOARD_LED_PORT, BIT_(BOARD_LED_PIN));
-  }
-}
-
-//--------------------------------------------------------------------+
-// BUTTONS
-//--------------------------------------------------------------------+
-static bool button_read(uint8_t id)
-{
-  return !BIT_TEST_( GPIO_ReadValue(buttons[id].port), buttons[id].pin ); // button is active low
-}
-
-uint32_t board_buttons(void)
-{
-  uint32_t result = 0;
-
-  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0);
-
-  return result;
-}
-
-//--------------------------------------------------------------------+
-// UART
-//--------------------------------------------------------------------+
-void board_uart_putchar(uint8_t c)
-{
-  UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);
-}
-
-uint8_t  board_uart_getchar(void)
-{
-  return UART_ReceiveByte(BOARD_UART_PORT);
-}
-
-#endif
+/**************************************************************************/
+/*!
+    @file     board_lpcxpresso1769.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "../board.h"
+
+#if BOARD == BOARD_LPCXPRESSO1769
+
+#define BOARD_LED_PORT                  (0)
+#define BOARD_LED_PIN                   (22)
+
+const static struct {
+  uint8_t port;
+  uint8_t pin;
+} buttons[] =
+{
+    {2, 3  }, // Joystick up
+    {0, 15 }, // Joystick down
+    {2, 4  }, // Joystick left
+    {0, 16 }, // Joystick right
+    {0, 17 }, // Joystick press
+    {0, 4  }, // SW3
+//    {1, 31 }, // SW4 (require to remove J28)
+};
+
+enum {
+  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
+};
+
+#define BOARD_UART_PORT   LPC_UART3
+
+void board_init(void)
+{
+  SystemInit();
+
+#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
+  SysTick_Config(SystemCoreClock / TUSB_CFG_TICKS_HZ); // 1 msec tick timer
+#endif
+
+  //------------- LED -------------//
+  GPIO_SetDir(BOARD_LED_PORT, BIT_(BOARD_LED_PIN), 1);
+
+  //------------- BUTTON -------------//
+  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIO_SetDir(buttons[i].port, BIT_(buttons[i].pin), 0);
+
+#if MODE_DEVICE_SUPPORTED
+  //------------- USB Device -------------//
+  // VBUS sense is wrongly connected to P0_5 (instead of P1_30). So we need to always pull P1_30 to high
+  // so that USB device block can work. However, Device Controller (thus tinyusb) cannot able to determine
+  // if device is disconnected or not
+  PINSEL_ConfigPin( &(PINSEL_CFG_Type) {
+      .Portnum = 1, .Pinnum = 30,
+      .Funcnum = 2, .Pinmode = PINSEL_PINMODE_PULLUP} );
+
+  //P0_21 instead of P2_9 as USB connect
+#endif
+
+  //------------- UART -------------//
+  PINSEL_CFG_Type PinCfg =
+  {
+      .Portnum   = 0,
+      .Pinnum    = 0, // TXD is P0.0
+      .Funcnum   = 2,
+      .OpenDrain = 0,
+      .Pinmode   = 0
+  };
+	PINSEL_ConfigPin(&PinCfg);
+
+	PinCfg.Portnum = 0;
+	PinCfg.Pinnum  = 1; // RXD is P0.1
+	PINSEL_ConfigPin(&PinCfg);
+
+	UART_CFG_Type UARTConfigStruct;
+  UART_ConfigStructInit(&UARTConfigStruct);
+	UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE;
+
+	UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
+	UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit
+}
+
+//--------------------------------------------------------------------+
+// LEDS
+//--------------------------------------------------------------------+
+void board_leds(uint32_t on_mask, uint32_t off_mask)
+{
+  if (on_mask & BIT_(0))
+  {
+    GPIO_SetValue(BOARD_LED_PORT, BIT_(BOARD_LED_PIN));
+  }else if (off_mask & BIT_(0))
+  {
+    GPIO_ClearValue(BOARD_LED_PORT, BIT_(BOARD_LED_PIN));
+  }
+}
+
+//--------------------------------------------------------------------+
+// BUTTONS
+//--------------------------------------------------------------------+
+static bool button_read(uint8_t id)
+{
+  return !BIT_TEST_( GPIO_ReadValue(buttons[id].port), buttons[id].pin ); // button is active low
+}
+
+uint32_t board_buttons(void)
+{
+  uint32_t result = 0;
+
+  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0);
+
+  return result;
+}
+
+//--------------------------------------------------------------------+
+// UART
+//--------------------------------------------------------------------+
+void board_uart_putchar(uint8_t c)
+{
+  UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);
+}
+
+uint8_t  board_uart_getchar(void)
+{
+  return UART_ReceiveByte(BOARD_UART_PORT);
+}
+
+#endif

+ 0 - 0
boards/lpcxpresso/board_lpcxpresso1769.h → hw/boards/lpcxpresso/board_lpcxpresso1769.h


+ 130 - 130
boards/microbuilder/board_lpc4357usb.c → hw/boards/microbuilder/board_lpc4357usb.c

@@ -1,130 +1,130 @@
-/**************************************************************************/
-/*!
-    @file     board_lpc4357usb.c
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#include "../board.h"
-
-#if BOARD == BOARD_LPC4357USB
-
-#define BOARD_UART_PORT       (LPC_USART0)
-#define BOARD_UART_PIN_PORT   (0x0F)
-#define BOARD_UART_PIN_TX     (10) // PF.10 : UART0_TXD
-#define BOARD_UART_PIN_RX     (11) // PF.11 : UART0_RXD
-
-#define BOARD_LED0_PORT       (0x0C)
-#define BOARD_LED0_PIN        (2)   // PC.2 = User LED
-#define BOARD_LED0_FUNCTION   (4)   // GPIO multiplexed as function 4 on PC.2
-#define BOARD_LED0_GPIO_PORT  (6)
-#define BOARD_LED0_GPIO_PIN   (1)   // PC.2 = GPIO 6[1]
-
-void board_init(void)
-{
-  CGU_Init();
-
-  /* Setup the systick time for 1ms ticks */
-  SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE) / TUSB_CFG_TICKS_HZ);
-
-  /* Configure LED0 as GPIO */
-  scu_pinmux(BOARD_LED0_PORT, BOARD_LED0_PIN, MD_PDN, BOARD_LED0_FUNCTION);
-  GPIO_SetDir(BOARD_LED0_GPIO_PORT, (1 << BOARD_LED0_GPIO_PIN), 1);
-
-  /* Configure TRACE pins */
-  scu_pinmux(0xF, 4, MD_PDN, 0x2); /* PF_4 = TRACECLK */
-  scu_pinmux(0x7, 4, MD_PDN, 0x5); /* P7_4 = TRACEDATA[0] */
-  scu_pinmux(0x7, 5, MD_PDN, 0x5); /* P7_5 = TRACEDATA[1] */
-  scu_pinmux(0x7, 6, MD_PDN, 0x5); /* P7_6 = TRACEDATA[2] */
-  scu_pinmux(0x7, 7, MD_PDN, 0x5); /* P7_7 = TRACEDATA[3] */
-
-  // USB0 Power: EA4357 channel B U20 GPIO26 active low (base board), P2_3 on LPC4357
-  scu_pinmux(0x2, 3, MD_PUP | MD_EZI, FUNC7);		// USB0 VBus Power
-
-  // 1.5Kohm pull-up resistor is needed on the USB DP data signal. GPIO28 (base), P9_5 (LPC4357) controls
-  //scu_pinmux(0x9, 5, MD_PUP|MD_EZI|MD_ZI, FUNC4);		// GPIO5[18]
-  //GPIO_SetDir(5, BIT_(18), 1); // output
-  //GPIO_ClearValue(5, BIT_(18));
-
-  /* Init I2C @ 400kHz */
-  I2C_Init(LPC_I2C0, 400000);
-  I2C_Cmd(LPC_I2C0, ENABLE);
-
-#if CFG_UART_ENABLE
-  //------------- UART init -------------//
-  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN             , FUNC1);
-  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN|MD_EZI|MD_ZI, FUNC1);
-
-  UART_CFG_Type UARTConfigStruct;
-  UART_ConfigStructInit(&UARTConfigStruct);
-  UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE;
-  UARTConfigStruct.Clock_Speed = 0;
-
-  UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
-  UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit
-#endif
-}
-
-//--------------------------------------------------------------------+
-// LEDS
-//--------------------------------------------------------------------+
-void board_leds(uint32_t on_mask, uint32_t off_mask)
-{
-  if (on_mask & 0x01)
-  {
-    LPC_GPIO_PORT->SET[BOARD_LED0_GPIO_PORT] = (1 << BOARD_LED0_GPIO_PIN);
-  }
-
-  if (off_mask & 0x01)
-  {
-    LPC_GPIO_PORT->CLR[BOARD_LED0_GPIO_PORT] = (1 << BOARD_LED0_GPIO_PIN);
-  }
-}
-
-//--------------------------------------------------------------------+
-// UART
-//--------------------------------------------------------------------+
-#if CFG_UART_ENABLE
-uint32_t board_uart_send(uint8_t *buffer, uint32_t length)
-{
-  return UART_Send(BOARD_UART_PORT, buffer, length, BLOCKING);
-}
-
-uint32_t board_uart_recv(uint8_t *buffer, uint32_t length)
-{
-  return UART_Receive(BOARD_UART_PORT, buffer, length, BLOCKING);
-}
-#endif
-
-#endif
+/**************************************************************************/
+/*!
+    @file     board_lpc4357usb.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "../board.h"
+
+#if BOARD == BOARD_LPC4357USB
+
+#define BOARD_UART_PORT       (LPC_USART0)
+#define BOARD_UART_PIN_PORT   (0x0F)
+#define BOARD_UART_PIN_TX     (10) // PF.10 : UART0_TXD
+#define BOARD_UART_PIN_RX     (11) // PF.11 : UART0_RXD
+
+#define BOARD_LED0_PORT       (0x0C)
+#define BOARD_LED0_PIN        (2)   // PC.2 = User LED
+#define BOARD_LED0_FUNCTION   (4)   // GPIO multiplexed as function 4 on PC.2
+#define BOARD_LED0_GPIO_PORT  (6)
+#define BOARD_LED0_GPIO_PIN   (1)   // PC.2 = GPIO 6[1]
+
+void board_init(void)
+{
+  CGU_Init();
+
+  /* Setup the systick time for 1ms ticks */
+  SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE) / TUSB_CFG_TICKS_HZ);
+
+  /* Configure LED0 as GPIO */
+  scu_pinmux(BOARD_LED0_PORT, BOARD_LED0_PIN, MD_PDN, BOARD_LED0_FUNCTION);
+  GPIO_SetDir(BOARD_LED0_GPIO_PORT, (1 << BOARD_LED0_GPIO_PIN), 1);
+
+  /* Configure TRACE pins */
+  scu_pinmux(0xF, 4, MD_PDN, 0x2); /* PF_4 = TRACECLK */
+  scu_pinmux(0x7, 4, MD_PDN, 0x5); /* P7_4 = TRACEDATA[0] */
+  scu_pinmux(0x7, 5, MD_PDN, 0x5); /* P7_5 = TRACEDATA[1] */
+  scu_pinmux(0x7, 6, MD_PDN, 0x5); /* P7_6 = TRACEDATA[2] */
+  scu_pinmux(0x7, 7, MD_PDN, 0x5); /* P7_7 = TRACEDATA[3] */
+
+  // USB0 Power: EA4357 channel B U20 GPIO26 active low (base board), P2_3 on LPC4357
+  scu_pinmux(0x2, 3, MD_PUP | MD_EZI, FUNC7);		// USB0 VBus Power
+
+  // 1.5Kohm pull-up resistor is needed on the USB DP data signal. GPIO28 (base), P9_5 (LPC4357) controls
+  //scu_pinmux(0x9, 5, MD_PUP|MD_EZI|MD_ZI, FUNC4);		// GPIO5[18]
+  //GPIO_SetDir(5, BIT_(18), 1); // output
+  //GPIO_ClearValue(5, BIT_(18));
+
+  /* Init I2C @ 400kHz */
+  I2C_Init(LPC_I2C0, 400000);
+  I2C_Cmd(LPC_I2C0, ENABLE);
+
+#if CFG_UART_ENABLE
+  //------------- UART init -------------//
+  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_TX, MD_PDN             , FUNC1);
+  scu_pinmux(BOARD_UART_PIN_PORT, BOARD_UART_PIN_RX, MD_PLN|MD_EZI|MD_ZI, FUNC1);
+
+  UART_CFG_Type UARTConfigStruct;
+  UART_ConfigStructInit(&UARTConfigStruct);
+  UARTConfigStruct.Baud_rate = CFG_UART_BAUDRATE;
+  UARTConfigStruct.Clock_Speed = 0;
+
+  UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
+  UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit
+#endif
+}
+
+//--------------------------------------------------------------------+
+// LEDS
+//--------------------------------------------------------------------+
+void board_leds(uint32_t on_mask, uint32_t off_mask)
+{
+  if (on_mask & 0x01)
+  {
+    LPC_GPIO_PORT->SET[BOARD_LED0_GPIO_PORT] = (1 << BOARD_LED0_GPIO_PIN);
+  }
+
+  if (off_mask & 0x01)
+  {
+    LPC_GPIO_PORT->CLR[BOARD_LED0_GPIO_PORT] = (1 << BOARD_LED0_GPIO_PIN);
+  }
+}
+
+//--------------------------------------------------------------------+
+// UART
+//--------------------------------------------------------------------+
+#if CFG_UART_ENABLE
+uint32_t board_uart_send(uint8_t *buffer, uint32_t length)
+{
+  return UART_Send(BOARD_UART_PORT, buffer, length, BLOCKING);
+}
+
+uint32_t board_uart_recv(uint8_t *buffer, uint32_t length)
+{
+  return UART_Receive(BOARD_UART_PORT, buffer, length, BLOCKING);
+}
+#endif
+
+#endif

+ 0 - 0
boards/microbuilder/board_lpc4357usb.h → hw/boards/microbuilder/board_lpc4357usb.h


+ 0 - 0
boards/microbuilder/board_lpc4357usb_etminit.ini → hw/boards/microbuilder/board_lpc4357usb_etminit.ini


+ 158 - 158
boards/ngx/board_ngx4330.c → hw/boards/ngx/board_ngx4330.c

@@ -1,158 +1,158 @@
-/**************************************************************************/
-/*!
-    @file     board_ngx4330.c
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#include "../board.h"
-
-#if BOARD == BOARD_NGX4330
-
-#define BOARD_UART_PORT           LPC_USART0
-
-const static struct {
-  uint8_t mux_port;
-  uint8_t mux_pin;
-
-  uint8_t gpio_port;
-  uint8_t gpio_pin;
-}leds[] = { {2, 11, 1, 11}, {2, 12, 1,12} };
-
-enum {
-  BOARD_MAX_LEDS = sizeof(leds) / sizeof(leds[0])
-};
-
-const static struct {
-  uint8_t mux_port;
-  uint8_t mux_pin;
-
-  uint8_t gpio_port;
-  uint8_t gpio_pin;
-}buttons[] = { {0x02, 7, 0, 7 } };
-
-enum {
-  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
-};
-
-void board_init(void)
-{
-  CGU_Init();
-
-#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
-  SysTick_Config( CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE)/TUSB_CFG_TICKS_HZ );	/* 1 ms Timer */
-#endif
-
-  //------------- USB Bus power HOST ONLY-------------//
-  scu_pinmux(0x1, 7, MD_PUP | MD_EZI, FUNC4);	// P1_7 USB0_PWR_EN, USB0 VBus function Xplorer
-
-  scu_pinmux(0x2, 6, MD_PUP | MD_EZI, FUNC4); // P2_6 is configured as GPIO5[6] for USB1_PWR_EN
-  GPIO_SetDir   (5, BIT_(6), 1);              // GPIO5[6] is output
-  GPIO_SetValue (5, BIT_(6));                 // GPIO5[6] output high
-
-  //------------- LED -------------//
-  for (uint8_t i=0; i<BOARD_MAX_LEDS; i++)
-  {
-    scu_pinmux(leds[i].mux_port, leds[i].mux_pin, MD_PUP|MD_EZI|MD_ZI, FUNC0);
-    GPIO_SetDir(leds[i].gpio_port, BIT_(leds[i].gpio_pin), 1); // output
-  }
-
-  //------------- BUTTONS -------------//
-  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++)
-  {
-    scu_pinmux(buttons[i].mux_port, buttons[i].mux_pin, GPIO_NOPULL, FUNC0);
-    GPIO_SetDir(buttons[i].gpio_port, BIT_(buttons[i].gpio_pin), 0);
-  }
-
-  //------------- UART init -------------//
-  scu_pinmux(0x6 ,4, MD_PDN | MD_EZI, FUNC2); 	// UART0_TXD
-  scu_pinmux(0x6 ,5, MD_PDN | MD_EZI, FUNC2); 	// UART0_RXD
-
-  UART_CFG_Type UARTConfigStruct;
-  UART_ConfigStructInit(&UARTConfigStruct);                   // default: baud = 9600, 8 bit data, 1 stop bit, no parity
-  UARTConfigStruct.Baud_rate   = CFG_UART_BAUDRATE;           // Re-configure baudrate
-  UARTConfigStruct.Clock_Speed = 0;
-
-  UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
-  UART_TxCmd(BOARD_UART_PORT, ENABLE);           // Enable UART
-}
-
-//--------------------------------------------------------------------+
-// LEDS
-//--------------------------------------------------------------------+
-void board_leds(uint32_t on_mask, uint32_t off_mask)
-{
-  for (uint32_t i=0; i<BOARD_MAX_LEDS; i++)
-  {
-    if ( on_mask & BIT_(i))
-    {
-      GPIO_SetValue(leds[i].gpio_port, BIT_(leds[i].gpio_pin));
-    }else if ( off_mask & BIT_(i)) // on_mask take precedence over off_mask
-    {
-      GPIO_ClearValue(leds[i].gpio_port, BIT_(leds[i].gpio_pin));
-    }
-  }
-}
-
-//--------------------------------------------------------------------+
-// BUTTONS
-//--------------------------------------------------------------------+
-static bool button_read(uint8_t id)
-{
-  return !BIT_TEST_( GPIO_ReadValue(buttons[id].gpio_port), buttons[id].gpio_pin ); // button is active low
-}
-
-uint32_t board_buttons(void)
-{
-  uint32_t result = 0;
-
-  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0);
-
-  return result;
-}
-
-//--------------------------------------------------------------------+
-// UART
-//--------------------------------------------------------------------+
-uint8_t  board_uart_getchar(void)
-{
-  return UART_ReceiveByte(BOARD_UART_PORT);
-}
-
-void board_uart_putchar(uint8_t c)
-{
-  UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);
-}
-
-#endif
+/**************************************************************************/
+/*!
+    @file     board_ngx4330.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "../board.h"
+
+#if BOARD == BOARD_NGX4330
+
+#define BOARD_UART_PORT           LPC_USART0
+
+const static struct {
+  uint8_t mux_port;
+  uint8_t mux_pin;
+
+  uint8_t gpio_port;
+  uint8_t gpio_pin;
+}leds[] = { {2, 11, 1, 11}, {2, 12, 1,12} };
+
+enum {
+  BOARD_MAX_LEDS = sizeof(leds) / sizeof(leds[0])
+};
+
+const static struct {
+  uint8_t mux_port;
+  uint8_t mux_pin;
+
+  uint8_t gpio_port;
+  uint8_t gpio_pin;
+}buttons[] = { {0x02, 7, 0, 7 } };
+
+enum {
+  BOARD_BUTTON_COUNT = sizeof(buttons) / sizeof(buttons[0])
+};
+
+void board_init(void)
+{
+  CGU_Init();
+
+#if TUSB_CFG_OS == TUSB_OS_NONE // TODO may move to main.c
+  SysTick_Config( CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE)/TUSB_CFG_TICKS_HZ );	/* 1 ms Timer */
+#endif
+
+  //------------- USB Bus power HOST ONLY-------------//
+  scu_pinmux(0x1, 7, MD_PUP | MD_EZI, FUNC4);	// P1_7 USB0_PWR_EN, USB0 VBus function Xplorer
+
+  scu_pinmux(0x2, 6, MD_PUP | MD_EZI, FUNC4); // P2_6 is configured as GPIO5[6] for USB1_PWR_EN
+  GPIO_SetDir   (5, BIT_(6), 1);              // GPIO5[6] is output
+  GPIO_SetValue (5, BIT_(6));                 // GPIO5[6] output high
+
+  //------------- LED -------------//
+  for (uint8_t i=0; i<BOARD_MAX_LEDS; i++)
+  {
+    scu_pinmux(leds[i].mux_port, leds[i].mux_pin, MD_PUP|MD_EZI|MD_ZI, FUNC0);
+    GPIO_SetDir(leds[i].gpio_port, BIT_(leds[i].gpio_pin), 1); // output
+  }
+
+  //------------- BUTTONS -------------//
+  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++)
+  {
+    scu_pinmux(buttons[i].mux_port, buttons[i].mux_pin, GPIO_NOPULL, FUNC0);
+    GPIO_SetDir(buttons[i].gpio_port, BIT_(buttons[i].gpio_pin), 0);
+  }
+
+  //------------- UART init -------------//
+  scu_pinmux(0x6 ,4, MD_PDN | MD_EZI, FUNC2); 	// UART0_TXD
+  scu_pinmux(0x6 ,5, MD_PDN | MD_EZI, FUNC2); 	// UART0_RXD
+
+  UART_CFG_Type UARTConfigStruct;
+  UART_ConfigStructInit(&UARTConfigStruct);                   // default: baud = 9600, 8 bit data, 1 stop bit, no parity
+  UARTConfigStruct.Baud_rate   = CFG_UART_BAUDRATE;           // Re-configure baudrate
+  UARTConfigStruct.Clock_Speed = 0;
+
+  UART_Init(BOARD_UART_PORT, &UARTConfigStruct);
+  UART_TxCmd(BOARD_UART_PORT, ENABLE);           // Enable UART
+}
+
+//--------------------------------------------------------------------+
+// LEDS
+//--------------------------------------------------------------------+
+void board_leds(uint32_t on_mask, uint32_t off_mask)
+{
+  for (uint32_t i=0; i<BOARD_MAX_LEDS; i++)
+  {
+    if ( on_mask & BIT_(i))
+    {
+      GPIO_SetValue(leds[i].gpio_port, BIT_(leds[i].gpio_pin));
+    }else if ( off_mask & BIT_(i)) // on_mask take precedence over off_mask
+    {
+      GPIO_ClearValue(leds[i].gpio_port, BIT_(leds[i].gpio_pin));
+    }
+  }
+}
+
+//--------------------------------------------------------------------+
+// BUTTONS
+//--------------------------------------------------------------------+
+static bool button_read(uint8_t id)
+{
+  return !BIT_TEST_( GPIO_ReadValue(buttons[id].gpio_port), buttons[id].gpio_pin ); // button is active low
+}
+
+uint32_t board_buttons(void)
+{
+  uint32_t result = 0;
+
+  for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) result |= (button_read(i) ? BIT_(i) : 0);
+
+  return result;
+}
+
+//--------------------------------------------------------------------+
+// UART
+//--------------------------------------------------------------------+
+uint8_t  board_uart_getchar(void)
+{
+  return UART_ReceiveByte(BOARD_UART_PORT);
+}
+
+void board_uart_putchar(uint8_t c)
+{
+  UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);
+}
+
+#endif

+ 0 - 0
boards/ngx/board_ngx4330.h → hw/boards/ngx/board_ngx4330.h


+ 163 - 163
boards/printf_retarget.c → hw/boards/printf_retarget.c

@@ -1,163 +1,163 @@
-/**************************************************************************/
-/*!
-    @file     printf_retarget.c
-    @author   hathach (tinyusb.org)
-
-    @section LICENSE
-
-    Software License Agreement (BSD License)
-
-    Copyright (c) 2013, hathach (tinyusb.org)
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-    1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-    3. Neither the name of the copyright holders nor the
-    names of its contributors may be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
-    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
-    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-    This file is part of the tinyusb stack.
-*/
-/**************************************************************************/
-
-#include "board.h"
-
-#if CFG_PRINTF_TARGET != PRINTF_TARGET_SEMIHOST
-
-#if CFG_PRINTF_TARGET == PRINTF_TARGET_UART
-  #define retarget_getchar()     board_uart_getchar()
-  #define retarget_putchar(c)    board_uart_putchar(c);
-#elif CFG_PRINTF_TARGET == PRINTF_TARGET_SWO
-  volatile int32_t ITM_RxBuffer;  // keil variable to read from SWO
-	#define retarget_getchar()     ITM_ReceiveChar()
-	#define retarget_putchar(c)    ITM_SendChar(c)
-#else
-	#error Target is not implemented yet
-#endif
-
-//--------------------------------------------------------------------+
-// LPCXPRESSO / RED SUITE
-//--------------------------------------------------------------------+
-#if defined __CODE_RED
-
-#if CFG_PRINTF_TARGET == PRINTF_TARGET_SWO
-  #error author does not know how to retarget SWO with lpcxpresso/red-suite
-#endif
-
-// Called by bottom level of printf routine within RedLib C library to write
-// a character. With the default semihosting stub, this would write the character
-// to the debugger console window . But this version writes
-// the character to the UART.
-int __sys_write (int iFileHandle, char *buf, int length)
-{
-  (void) iFileHandle;
-
-  for (int i=0; i<length; i++)
-  {
-    if (buf[i] == '\n') retarget_putchar('\r');
-
-    retarget_putchar( buf[i] );
-  }
-
-  return length;
-}
-
-// Called by bottom level of scanf routine within RedLib C library to read
-// a character. With the default semihosting stub, this would read the character
-// from the debugger console window (which acts as stdin). But this version reads
-// the character from the UART.
-int __sys_readc (void)
-{
-	return (int) retarget_getchar();
-}
-
-//--------------------------------------------------------------------+
-// KEIL
-//--------------------------------------------------------------------+
-#elif defined __CC_ARM // keil
-
-struct __FILE {
-  uint32_t handle;
-};
-
-void _ttywrch(int ch)
-{
-  if ( ch == '\n' ) retarget_putchar('\r');
-
-  retarget_putchar(ch);
-}
-
-int fgetc(FILE *f)
-{
-  return retarget_getchar();
-}
-
-int fputc(int ch, FILE *f)
-{
-  _ttywrch(ch);
-  return ch;
-}
-
-//--------------------------------------------------------------------+
-// IAR
-//--------------------------------------------------------------------+
-#elif defined __ICCARM__ // TODO could not able to retarget to UART with IAR
-
-#if CFG_PRINTF_TARGET == PRINTF_TARGET_UART
-#include <stddef.h>
-
-size_t __write(int handle, const unsigned char *buf, size_t length)
-{
-  /* Check for the command to flush all handles */
-  if (handle == -1) return 0;
-
-  /* Check for stdout and stderr (only necessary if FILE descriptors are enabled.) */
-  if (handle != 1 && handle != 2) return -1;
-
-  for (size_t i=0; i<length; i++)
-  {
-    if (buf[i] == '\n') retarget_putchar('\r');
-
-    retarget_putchar( buf[i] );
-  }
-
-  return length;
-}
-
-size_t __read(int handle, unsigned char *buf, size_t bufSize)
-{
-  /* Check for stdin (only necessary if FILE descriptors are enabled) */
-  if (handle != 0) return -1;
-
-  size_t i;
-  for (i=0; i<bufSize; i++)
-  {
-    uint8_t ch = board_uart_getchar();
-    if (ch == 0) break;
-    buf[i] = ch;
-  }
-
-  return i;
-}
-
-#endif
-
-#endif
-
-#endif // CFG_PRINTF_TARGET != PRINTF_TARGET_SEMIHOST
+/**************************************************************************/
+/*!
+    @file     printf_retarget.c
+    @author   hathach (tinyusb.org)
+
+    @section LICENSE
+
+    Software License Agreement (BSD License)
+
+    Copyright (c) 2013, hathach (tinyusb.org)
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+    1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+    3. Neither the name of the copyright holders nor the
+    names of its contributors may be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "board.h"
+
+#if CFG_PRINTF_TARGET != PRINTF_TARGET_SEMIHOST
+
+#if CFG_PRINTF_TARGET == PRINTF_TARGET_UART
+  #define retarget_getchar()     board_uart_getchar()
+  #define retarget_putchar(c)    board_uart_putchar(c);
+#elif CFG_PRINTF_TARGET == PRINTF_TARGET_SWO
+  volatile int32_t ITM_RxBuffer;  // keil variable to read from SWO
+	#define retarget_getchar()     ITM_ReceiveChar()
+	#define retarget_putchar(c)    ITM_SendChar(c)
+#else
+	#error Target is not implemented yet
+#endif
+
+//--------------------------------------------------------------------+
+// LPCXPRESSO / RED SUITE
+//--------------------------------------------------------------------+
+#if defined __CODE_RED
+
+#if CFG_PRINTF_TARGET == PRINTF_TARGET_SWO
+  #error author does not know how to retarget SWO with lpcxpresso/red-suite
+#endif
+
+// Called by bottom level of printf routine within RedLib C library to write
+// a character. With the default semihosting stub, this would write the character
+// to the debugger console window . But this version writes
+// the character to the UART.
+int __sys_write (int iFileHandle, char *buf, int length)
+{
+  (void) iFileHandle;
+
+  for (int i=0; i<length; i++)
+  {
+    if (buf[i] == '\n') retarget_putchar('\r');
+
+    retarget_putchar( buf[i] );
+  }
+
+  return length;
+}
+
+// Called by bottom level of scanf routine within RedLib C library to read
+// a character. With the default semihosting stub, this would read the character
+// from the debugger console window (which acts as stdin). But this version reads
+// the character from the UART.
+int __sys_readc (void)
+{
+	return (int) retarget_getchar();
+}
+
+//--------------------------------------------------------------------+
+// KEIL
+//--------------------------------------------------------------------+
+#elif defined __CC_ARM // keil
+
+struct __FILE {
+  uint32_t handle;
+};
+
+void _ttywrch(int ch)
+{
+  if ( ch == '\n' ) retarget_putchar('\r');
+
+  retarget_putchar(ch);
+}
+
+int fgetc(FILE *f)
+{
+  return retarget_getchar();
+}
+
+int fputc(int ch, FILE *f)
+{
+  _ttywrch(ch);
+  return ch;
+}
+
+//--------------------------------------------------------------------+
+// IAR
+//--------------------------------------------------------------------+
+#elif defined __ICCARM__ // TODO could not able to retarget to UART with IAR
+
+#if CFG_PRINTF_TARGET == PRINTF_TARGET_UART
+#include <stddef.h>
+
+size_t __write(int handle, const unsigned char *buf, size_t length)
+{
+  /* Check for the command to flush all handles */
+  if (handle == -1) return 0;
+
+  /* Check for stdout and stderr (only necessary if FILE descriptors are enabled.) */
+  if (handle != 1 && handle != 2) return -1;
+
+  for (size_t i=0; i<length; i++)
+  {
+    if (buf[i] == '\n') retarget_putchar('\r');
+
+    retarget_putchar( buf[i] );
+  }
+
+  return length;
+}
+
+size_t __read(int handle, unsigned char *buf, size_t bufSize)
+{
+  /* Check for stdin (only necessary if FILE descriptors are enabled) */
+  if (handle != 0) return -1;
+
+  size_t i;
+  for (i=0; i<bufSize; i++)
+  {
+    uint8_t ch = board_uart_getchar();
+    if (ch == 0) break;
+    buf[i] = ch;
+  }
+
+  return i;
+}
+
+#endif
+
+#endif
+
+#endif // CFG_PRINTF_TARGET != PRINTF_TARGET_SEMIHOST

+ 0 - 0
boards/readme.md → hw/boards/readme.md


+ 0 - 0
mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/history.txt → hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/history.txt


+ 0 - 0
mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/LPC11Uxx.h → hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/LPC11Uxx.h


+ 0 - 0
mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/core_cm0.h → hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/core_cm0.h


+ 0 - 0
mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/core_cmFunc.h → hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/core_cmFunc.h


+ 0 - 0
mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/core_cmInstr.h → hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/core_cmInstr.h


+ 0 - 0
mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/power_api.h → hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/power_api.h


+ 0 - 0
mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/system_LPC11Uxx.h → hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/inc/system_LPC11Uxx.h


+ 0 - 0
mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/liblinks.xml → hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/liblinks.xml


+ 0 - 0
mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/src/system_LPC11Uxx.c → hw/mcu/lpc11uxx/CMSIS_CORE_LPC11Uxx/src/system_LPC11Uxx.c


+ 819 - 819
mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_gpio.c → hw/mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_gpio.c

@@ -1,819 +1,819 @@
-/****************************************************************************
- *   $Id:: gpio.c 6172 2011-01-13 18:22:51Z usb00423                        $
- *   Project: NXP LPC11Uxx GPIO example
- *
- *   Description:
- *     This file contains GPIO code example which include GPIO
- *     initialization, GPIO interrupt handler, and related APIs for
- *     GPIO access.
- *
- ****************************************************************************
- * 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.
-****************************************************************************/
-#include "LPC11Uxx.h"			/* LPC11Uxx Peripheral Registers */
-#include "lpc11uxx_gpio.h"
-
-volatile uint32_t flex_int0_counter = 0;
-volatile uint32_t flex_int1_counter = 0;
-volatile uint32_t flex_int2_counter = 0;
-volatile uint32_t flex_int3_counter = 0;
-volatile uint32_t flex_int4_counter = 0;
-volatile uint32_t flex_int5_counter = 0;
-volatile uint32_t flex_int6_counter = 0;
-volatile uint32_t flex_int7_counter = 0;
-volatile uint32_t gint0_counter = 0;
-volatile uint32_t gint1_counter = 0;
-volatile uint32_t flex_int0_level_counter = 0;
-volatile uint32_t flex_int0_rising_edge_counter = 0;
-volatile uint32_t flex_int0_falling_edge_counter = 0;
-volatile uint32_t flex_int1_level_counter = 0;
-volatile uint32_t flex_int1_rising_edge_counter = 0;
-volatile uint32_t flex_int1_falling_edge_counter = 0;
-volatile uint32_t flex_int2_level_counter = 0;
-volatile uint32_t flex_int2_rising_edge_counter = 0;
-volatile uint32_t flex_int2_falling_edge_counter = 0;
-volatile uint32_t flex_int3_level_counter = 0;
-volatile uint32_t flex_int3_rising_edge_counter = 0;
-volatile uint32_t flex_int3_falling_edge_counter = 0;
-volatile uint32_t flex_int4_level_counter = 0;
-volatile uint32_t flex_int4_rising_edge_counter = 0;
-volatile uint32_t flex_int4_falling_edge_counter = 0;
-volatile uint32_t flex_int5_level_counter = 0;
-volatile uint32_t flex_int5_rising_edge_counter = 0;
-volatile uint32_t flex_int5_falling_edge_counter = 0;
-volatile uint32_t flex_int6_level_counter = 0;
-volatile uint32_t flex_int6_rising_edge_counter = 0;
-volatile uint32_t flex_int6_falling_edge_counter = 0;
-volatile uint32_t flex_int7_level_counter = 0;
-volatile uint32_t flex_int7_rising_edge_counter = 0;
-volatile uint32_t flex_int7_falling_edge_counter = 0;
-volatile uint32_t gint0_level_counter = 0;
-volatile uint32_t gint0_edge_counter = 0;
-volatile uint32_t gint1_level_counter = 0;
-volatile uint32_t gint1_edge_counter = 0;
-
-/*****************************************************************************
-** Function name:		FLEX_INT0_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void FLEX_INT0_IRQHandler(void)
-{
-  flex_int0_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<0) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<0) )
-	{
-	  flex_int0_level_counter++;
-	}
-	else
-	{
-	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<0) )
-	  {
-		flex_int0_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<0;
-	  }
-	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<0) )
-	  {
-		flex_int0_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<0;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<0;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		FLEX_INT1_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void FLEX_INT1_IRQHandler(void)
-{
-  flex_int1_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<1) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<1) )
-	{
-	  flex_int1_level_counter++;
-	}
-	else
-	{
-	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<1) )
-	  {
-		flex_int1_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<1;
-	  }
-	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<1) )
-	  {
-		flex_int1_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<1;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<1;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		FLEX_INT2_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void FLEX_INT2_IRQHandler(void)
-{
-  flex_int2_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<2) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<2) )
-	{
-	  flex_int2_level_counter++;
-	}
-	else
-	{
-	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<2) )
-	  {
-		flex_int2_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<2;
-	  }
-	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<2) )
-	  {
-		flex_int2_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<2;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<2;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		FLEX_INT3_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void FLEX_INT3_IRQHandler(void)
-{
-  flex_int3_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<3) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<3) )
-	{
-	  flex_int3_level_counter++;
-	}
-	else
-	{
-	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<3) )
-	  {
-		flex_int3_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<3;
-	  }
-	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<3) )
-	  {
-		flex_int3_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<3;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<3;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		FLEX_INT4_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void FLEX_INT4_IRQHandler(void)
-{
-  flex_int4_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<4) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<4) )
-	{
-	  flex_int4_level_counter++;
-	}
-	else
-	{
-	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<4) )
-	  {
-		flex_int4_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<4;
-	  }
-	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<4) )
-	  {
-		flex_int4_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<4;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<4;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		FLEX_INT5_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void FLEX_INT5_IRQHandler(void)
-{
-  flex_int5_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<5) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<5) )
-	{
-	  flex_int5_level_counter++;
-	}
-	else
-	{
-	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<5) )
-	  {
-		flex_int5_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<5;
-	  }
-	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<5) )
-	  {
-		flex_int5_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<5;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<5;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		FLEX_INT6_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void FLEX_INT6_IRQHandler(void)
-{
-  flex_int6_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<6) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<6) )
-	{
-	  flex_int6_level_counter++;
-	}
-	else
-	{
-	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<6) )
-	  {
-		flex_int6_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<6;
-	  }
-	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<6) )
-	  {
-		flex_int6_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<6;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<6;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		FLEX_INT7_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void FLEX_INT7_IRQHandler(void)
-{
-  flex_int7_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<7) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<7) )
-	{
-	  flex_int7_level_counter++;
-	}
-	else
-	{
-	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<7) )
-	  {
-		flex_int7_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<7;
-	  }
-	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<7) )
-	  {
-		flex_int7_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<7;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<7;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GINT0_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GINT0_IRQHandler(void)
-{
-  gint0_counter++;
-  if ( LPC_GPIO_GROUP_INT0->CTRL & 0x1 )
-  {
-	if ( LPC_GPIO_GROUP_INT0->CTRL & (0x1<<4) )
-	{
-	  gint0_level_counter++;
-	}
-	else
-	{
-	  gint0_edge_counter++;
-	}
-	LPC_GPIO_GROUP_INT0->CTRL |= 0x1;
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GINT1_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GINT1_IRQHandler(void)
-{
-  gint1_counter++;
-  if ( LPC_GPIO_GROUP_INT1->CTRL & 0x1 )
-  {
-	if ( LPC_GPIO_GROUP_INT1->CTRL & (0x1<<4) )
-	{
-	  gint1_level_counter++;
-	}
-	else
-	{
-	  gint1_edge_counter++;
-	}
-	LPC_GPIO_GROUP_INT1->CTRL |= 0x1;
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOInit
-**
-** Descriptions:		Initialize GPIO, install the
-**						GPIO interrupt handler
-**
-** parameters:			None
-**
-** Returned value:		true or false, return false if the VIC table
-**						is full and GPIO interrupt handler can be
-**						installed.
-**
-*****************************************************************************/
-void GPIOInit( void )
-{
-  /* Enable AHB clock to the GPIO domain. */
-  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
-
-  /* Enable AHB clock to the FlexInt, GroupedInt domain. */
-  LPC_SYSCON->SYSAHBCLKCTRL |= ((1<<19) | (1<<23) | (1<<24));
-
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOSetFlexInterrupt
-**
-** Descriptions:		Set interrupt sense, event, etc.
-**						sense: edge or level, 0 is edge, 1 is level
-**						event/polarity: 0 is active low/falling, 1 is high/rising.
-**
-** parameters:			channel #, port #, bit position, sense, event(polarity)
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOSetFlexInterrupt( uint32_t channelNum, uint32_t portNum, uint32_t bitPosi,
-		uint32_t sense, uint32_t event )
-{
-  switch ( channelNum )
-  {
-	case CHANNEL0:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINTSEL[0] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINTSEL[0] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(FLEX_INT0_IRQn);
-	break;
-	case CHANNEL1:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINTSEL[1] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINTSEL[1] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(FLEX_INT1_IRQn);
-	break;
-	case CHANNEL2:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINTSEL[2] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINTSEL[2] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(FLEX_INT2_IRQn);
-	break;
-	case CHANNEL3:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINTSEL[3] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINTSEL[3] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(FLEX_INT3_IRQn);
-	break;
-	case CHANNEL4:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINTSEL[4] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINTSEL[4] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(FLEX_INT4_IRQn);
-	break;
-	case CHANNEL5:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINTSEL[5] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINTSEL[5] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(FLEX_INT5_IRQn);
-	break;
-	case CHANNEL6:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINTSEL[6] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINTSEL[6] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(FLEX_INT6_IRQn);
-	break;
-	case CHANNEL7:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINTSEL[7] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINTSEL[7] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(FLEX_INT7_IRQn);
-	break;
-	default:
-	  break;
-  }
-  if ( sense == 0 )
-  {
-	LPC_GPIO_PIN_INT->ISEL &= ~(0x1<<channelNum);	/* Edge trigger */
-	if ( event == 0 )
-	{
-	  LPC_GPIO_PIN_INT->IENF |= (0x1<<channelNum);	/* faling edge */
-	}
-	else
-	{
-	  LPC_GPIO_PIN_INT->IENR |= (0x1<<channelNum);	/* Rising edge */
-	}
-  }
-  else
-  {
-	LPC_GPIO_PIN_INT->ISEL |= (0x1<<channelNum);	/* Level trigger. */
-	LPC_GPIO_PIN_INT->IENR |= (0x1<<channelNum);	/* Level enable */
-	if ( event == 0 )
-	{
-	  LPC_GPIO_PIN_INT->IENF &= ~(0x1<<channelNum);	/* active-low */
-	}
-	else
-	{
-	  LPC_GPIO_PIN_INT->IENF |= (0x1<<channelNum);	/* active-high */
-	}
-  }
-
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOFlexIntEnable
-**
-** Descriptions:		Enable Interrupt
-**
-** parameters:			channel num, event(0 is falling edge, 1 is rising edge)
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOFlexIntEnable( uint32_t channelNum, uint32_t event )
-{
-  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
-  {
-	if ( event == 0 )
-	{
-	  LPC_GPIO_PIN_INT->SIENF |= (0x1<<channelNum);	/* faling edge */
-	}
-	else
-	{
-	  LPC_GPIO_PIN_INT->SIENR |= (0x1<<channelNum);	/* Rising edge */
-	}
-  }
-  else
-  {
-	LPC_GPIO_PIN_INT->SIENR |= (0x1<<channelNum);	/* Level */
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOFlexIntDisable
-**
-** Descriptions:		Disable Interrupt
-**
-** parameters:			channel num, event(0 is falling edge, 1 is rising edge)
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOFlexIntDisable( uint32_t channelNum, uint32_t event )
-{
-  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
-  {
-	if ( event == 0 )
-	{
-	  LPC_GPIO_PIN_INT->CIENF |= (0x1<<channelNum);	/* faling edge */
-	}
-	else
-	{
-	  LPC_GPIO_PIN_INT->CIENR |= (0x1<<channelNum);	/* Rising edge */
-	}
-  }
-  else
-  {
-	LPC_GPIO_PIN_INT->CIENR |= (0x1<<channelNum);	/* Level */
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOFlexIntStatus
-**
-** Descriptions:		Get Interrupt status
-**
-** parameters:			channel num
-**
-** Returned value:		None
-**
-*****************************************************************************/
-uint32_t GPIOFlexIntStatus( uint32_t channelNum )
-{
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<channelNum) )
-  {
-	return( 1 );
-  }
-  else
-  {
-	return( 0 );
-  }
-}
-
-/*****************************************************************************
-** Function name:		GPIOFlexIntClear
-**
-** Descriptions:		Clear Interrupt
-**
-** parameters:			channel num
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOFlexIntClear( uint32_t channelNum )
-{
-  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
-  {
-	LPC_GPIO_PIN_INT->IST = (1<<channelNum);
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOSetGroupedInterrupt
-**
-** Descriptions:		Set interrupt logic, sense, eventPattern, etc.
-**						logic: AND or OR, 0 is OR, 1 is AND
-**						sensePattern: edge or level, 0 is edge, 1 is level
-**						event/polarity: 0 is active low/falling, 1 is high/rising.
-**
-** parameters:			group #, bit pattern, logic, sense, event(polarity) pattern
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOSetGroupedInterrupt( uint32_t groupNum, uint32_t *bitPattern, uint32_t logic,
-		uint32_t sense, uint32_t *eventPattern )
-{
-  switch ( groupNum )
-  {
-	case GROUP0:
-	  if ( sense == 0 )
-	  {
-		LPC_GPIO_GROUP_INT0->CTRL &= ~(0x1<<2);	/* Edge trigger */
-	  }
-	  else
-	  {
-		LPC_GPIO_GROUP_INT0->CTRL |= (0x1<<2);	/* Level trigger. */
-	  }
-	  LPC_GPIO_GROUP_INT0->CTRL |= (logic<<1);
-	  LPC_GPIO_GROUP_INT0->PORT_POL[0] = *((uint32_t *)(eventPattern + 0));
-	  LPC_GPIO_GROUP_INT0->PORT_POL[1] = *((uint32_t *)(eventPattern + 1));
-	  LPC_GPIO_GROUP_INT0->PORT_ENA[0] = *((uint32_t *)(bitPattern + 0));
-	  LPC_GPIO_GROUP_INT0->PORT_ENA[1] = *((uint32_t *)(bitPattern + 1));
-      /* as soon as enabled, an edge may be generated       */
-	  /* clear interrupt flag and NVIC pending interrupt to */
-	  /* workaround the potential edge generated as enabled */
-	  LPC_GPIO_GROUP_INT0->CTRL |= (1<<0);
-	  NVIC_ClearPendingIRQ(GINT0_IRQn);
-	  NVIC_EnableIRQ(GINT0_IRQn);
-	break;
-	case GROUP1:
-	  if ( sense == 0 )
-	  {
-		LPC_GPIO_GROUP_INT1->CTRL &= ~(0x1<<2);	/* Edge trigger */
-	  }
-	  else
-	  {
-		LPC_GPIO_GROUP_INT1->CTRL |= (0x1<<2);	/* Level trigger. */
-	  }
-	  LPC_GPIO_GROUP_INT1->CTRL |= (logic<<1);
-	  LPC_GPIO_GROUP_INT1->PORT_POL[0] = *((uint32_t *)(eventPattern + 0));
-	  LPC_GPIO_GROUP_INT1->PORT_POL[1] = *((uint32_t *)(eventPattern + 1));
-	  LPC_GPIO_GROUP_INT1->PORT_ENA[0] = *((uint32_t *)(bitPattern + 0));
-	  LPC_GPIO_GROUP_INT1->PORT_ENA[1] = *((uint32_t *)(bitPattern + 1));
-      /* as soon as enabled, an edge may be generated       */
-	  /* clear interrupt flag and NVIC pending interrupt to */
-	  /* workaround the potential edge generated as enabled */
-	  LPC_GPIO_GROUP_INT1->CTRL |= (1<<0);
-	  NVIC_ClearPendingIRQ(GINT1_IRQn);
-	  NVIC_EnableIRQ(GINT1_IRQn);
-	break;
-	default:
-	  break;
-  }
-
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOGetPinValue
-**
-** Descriptions:		Read Current state of port pin, PIN register value
-**
-** parameters:			port num, bit position
-** Returned value:		None
-**
-*****************************************************************************/
-uint32_t GPIOGetPinValue( uint32_t portNum, uint32_t bitPosi )
-{
-  uint32_t regVal = 0;
-
-  if( bitPosi < 0x20 )
-  {
-	if ( LPC_GPIO->PIN[portNum] & (0x1<<bitPosi) )
-	{
-	  regVal = 1;
-	}
-  }
-  else if( bitPosi == 0xFF )
-  {
-	regVal = LPC_GPIO->PIN[portNum];
-  }
-  return ( regVal );
-}
-
-/*****************************************************************************
-** Function name:		GPIOSetBitValue
-**
-** Descriptions:		Set/clear a bit in a specific position
-**
-** parameters:			port num, bit position, bit value
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOSetBitValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal )
-{
-  if ( bitVal )
-  {
-	LPC_GPIO->SET[portNum] = 1<<bitPosi;
-  }
-  else
-  {
-	LPC_GPIO->CLR[portNum] = 1<<bitPosi;
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOSetDir
-**
-** Descriptions:		Set the direction in GPIO port
-**
-** parameters:			portNum, bit position, direction (1 out, 0 input)
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir )
-{
-  if( dir )
-  {
-	LPC_GPIO->DIR[portNum] |= (1<<bitPosi);
-  }
-  else
-  {
-	LPC_GPIO->DIR[portNum] &= ~(1<<bitPosi);
-  }
-  return;
-}
-
-/******************************************************************************
-**                            End Of File
-******************************************************************************/
+/****************************************************************************
+ *   $Id:: gpio.c 6172 2011-01-13 18:22:51Z usb00423                        $
+ *   Project: NXP LPC11Uxx GPIO example
+ *
+ *   Description:
+ *     This file contains GPIO code example which include GPIO
+ *     initialization, GPIO interrupt handler, and related APIs for
+ *     GPIO access.
+ *
+ ****************************************************************************
+ * 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.
+****************************************************************************/
+#include "LPC11Uxx.h"			/* LPC11Uxx Peripheral Registers */
+#include "lpc11uxx_gpio.h"
+
+volatile uint32_t flex_int0_counter = 0;
+volatile uint32_t flex_int1_counter = 0;
+volatile uint32_t flex_int2_counter = 0;
+volatile uint32_t flex_int3_counter = 0;
+volatile uint32_t flex_int4_counter = 0;
+volatile uint32_t flex_int5_counter = 0;
+volatile uint32_t flex_int6_counter = 0;
+volatile uint32_t flex_int7_counter = 0;
+volatile uint32_t gint0_counter = 0;
+volatile uint32_t gint1_counter = 0;
+volatile uint32_t flex_int0_level_counter = 0;
+volatile uint32_t flex_int0_rising_edge_counter = 0;
+volatile uint32_t flex_int0_falling_edge_counter = 0;
+volatile uint32_t flex_int1_level_counter = 0;
+volatile uint32_t flex_int1_rising_edge_counter = 0;
+volatile uint32_t flex_int1_falling_edge_counter = 0;
+volatile uint32_t flex_int2_level_counter = 0;
+volatile uint32_t flex_int2_rising_edge_counter = 0;
+volatile uint32_t flex_int2_falling_edge_counter = 0;
+volatile uint32_t flex_int3_level_counter = 0;
+volatile uint32_t flex_int3_rising_edge_counter = 0;
+volatile uint32_t flex_int3_falling_edge_counter = 0;
+volatile uint32_t flex_int4_level_counter = 0;
+volatile uint32_t flex_int4_rising_edge_counter = 0;
+volatile uint32_t flex_int4_falling_edge_counter = 0;
+volatile uint32_t flex_int5_level_counter = 0;
+volatile uint32_t flex_int5_rising_edge_counter = 0;
+volatile uint32_t flex_int5_falling_edge_counter = 0;
+volatile uint32_t flex_int6_level_counter = 0;
+volatile uint32_t flex_int6_rising_edge_counter = 0;
+volatile uint32_t flex_int6_falling_edge_counter = 0;
+volatile uint32_t flex_int7_level_counter = 0;
+volatile uint32_t flex_int7_rising_edge_counter = 0;
+volatile uint32_t flex_int7_falling_edge_counter = 0;
+volatile uint32_t gint0_level_counter = 0;
+volatile uint32_t gint0_edge_counter = 0;
+volatile uint32_t gint1_level_counter = 0;
+volatile uint32_t gint1_edge_counter = 0;
+
+/*****************************************************************************
+** Function name:		FLEX_INT0_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void FLEX_INT0_IRQHandler(void)
+{
+  flex_int0_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<0) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<0) )
+	{
+	  flex_int0_level_counter++;
+	}
+	else
+	{
+	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<0) )
+	  {
+		flex_int0_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<0;
+	  }
+	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<0) )
+	  {
+		flex_int0_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<0;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<0;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		FLEX_INT1_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void FLEX_INT1_IRQHandler(void)
+{
+  flex_int1_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<1) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<1) )
+	{
+	  flex_int1_level_counter++;
+	}
+	else
+	{
+	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<1) )
+	  {
+		flex_int1_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<1;
+	  }
+	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<1) )
+	  {
+		flex_int1_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<1;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<1;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		FLEX_INT2_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void FLEX_INT2_IRQHandler(void)
+{
+  flex_int2_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<2) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<2) )
+	{
+	  flex_int2_level_counter++;
+	}
+	else
+	{
+	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<2) )
+	  {
+		flex_int2_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<2;
+	  }
+	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<2) )
+	  {
+		flex_int2_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<2;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<2;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		FLEX_INT3_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void FLEX_INT3_IRQHandler(void)
+{
+  flex_int3_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<3) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<3) )
+	{
+	  flex_int3_level_counter++;
+	}
+	else
+	{
+	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<3) )
+	  {
+		flex_int3_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<3;
+	  }
+	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<3) )
+	  {
+		flex_int3_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<3;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<3;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		FLEX_INT4_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void FLEX_INT4_IRQHandler(void)
+{
+  flex_int4_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<4) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<4) )
+	{
+	  flex_int4_level_counter++;
+	}
+	else
+	{
+	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<4) )
+	  {
+		flex_int4_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<4;
+	  }
+	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<4) )
+	  {
+		flex_int4_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<4;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<4;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		FLEX_INT5_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void FLEX_INT5_IRQHandler(void)
+{
+  flex_int5_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<5) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<5) )
+	{
+	  flex_int5_level_counter++;
+	}
+	else
+	{
+	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<5) )
+	  {
+		flex_int5_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<5;
+	  }
+	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<5) )
+	  {
+		flex_int5_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<5;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<5;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		FLEX_INT6_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void FLEX_INT6_IRQHandler(void)
+{
+  flex_int6_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<6) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<6) )
+	{
+	  flex_int6_level_counter++;
+	}
+	else
+	{
+	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<6) )
+	  {
+		flex_int6_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<6;
+	  }
+	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<6) )
+	  {
+		flex_int6_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<6;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<6;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		FLEX_INT7_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void FLEX_INT7_IRQHandler(void)
+{
+  flex_int7_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<7) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<7) )
+	{
+	  flex_int7_level_counter++;
+	}
+	else
+	{
+	  if ( LPC_GPIO_PIN_INT->RISE & (0x1<<7) )
+	  {
+		flex_int7_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<7;
+	  }
+	  else if ( LPC_GPIO_PIN_INT->FALL & (0x1<<7) )
+	  {
+		flex_int7_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<7;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<7;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GINT0_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GINT0_IRQHandler(void)
+{
+  gint0_counter++;
+  if ( LPC_GPIO_GROUP_INT0->CTRL & 0x1 )
+  {
+	if ( LPC_GPIO_GROUP_INT0->CTRL & (0x1<<4) )
+	{
+	  gint0_level_counter++;
+	}
+	else
+	{
+	  gint0_edge_counter++;
+	}
+	LPC_GPIO_GROUP_INT0->CTRL |= 0x1;
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GINT1_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GINT1_IRQHandler(void)
+{
+  gint1_counter++;
+  if ( LPC_GPIO_GROUP_INT1->CTRL & 0x1 )
+  {
+	if ( LPC_GPIO_GROUP_INT1->CTRL & (0x1<<4) )
+	{
+	  gint1_level_counter++;
+	}
+	else
+	{
+	  gint1_edge_counter++;
+	}
+	LPC_GPIO_GROUP_INT1->CTRL |= 0x1;
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOInit
+**
+** Descriptions:		Initialize GPIO, install the
+**						GPIO interrupt handler
+**
+** parameters:			None
+**
+** Returned value:		true or false, return false if the VIC table
+**						is full and GPIO interrupt handler can be
+**						installed.
+**
+*****************************************************************************/
+void GPIOInit( void )
+{
+  /* Enable AHB clock to the GPIO domain. */
+  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
+
+  /* Enable AHB clock to the FlexInt, GroupedInt domain. */
+  LPC_SYSCON->SYSAHBCLKCTRL |= ((1<<19) | (1<<23) | (1<<24));
+
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOSetFlexInterrupt
+**
+** Descriptions:		Set interrupt sense, event, etc.
+**						sense: edge or level, 0 is edge, 1 is level
+**						event/polarity: 0 is active low/falling, 1 is high/rising.
+**
+** parameters:			channel #, port #, bit position, sense, event(polarity)
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOSetFlexInterrupt( uint32_t channelNum, uint32_t portNum, uint32_t bitPosi,
+		uint32_t sense, uint32_t event )
+{
+  switch ( channelNum )
+  {
+	case CHANNEL0:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINTSEL[0] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINTSEL[0] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(FLEX_INT0_IRQn);
+	break;
+	case CHANNEL1:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINTSEL[1] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINTSEL[1] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(FLEX_INT1_IRQn);
+	break;
+	case CHANNEL2:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINTSEL[2] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINTSEL[2] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(FLEX_INT2_IRQn);
+	break;
+	case CHANNEL3:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINTSEL[3] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINTSEL[3] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(FLEX_INT3_IRQn);
+	break;
+	case CHANNEL4:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINTSEL[4] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINTSEL[4] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(FLEX_INT4_IRQn);
+	break;
+	case CHANNEL5:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINTSEL[5] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINTSEL[5] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(FLEX_INT5_IRQn);
+	break;
+	case CHANNEL6:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINTSEL[6] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINTSEL[6] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(FLEX_INT6_IRQn);
+	break;
+	case CHANNEL7:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINTSEL[7] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINTSEL[7] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(FLEX_INT7_IRQn);
+	break;
+	default:
+	  break;
+  }
+  if ( sense == 0 )
+  {
+	LPC_GPIO_PIN_INT->ISEL &= ~(0x1<<channelNum);	/* Edge trigger */
+	if ( event == 0 )
+	{
+	  LPC_GPIO_PIN_INT->IENF |= (0x1<<channelNum);	/* faling edge */
+	}
+	else
+	{
+	  LPC_GPIO_PIN_INT->IENR |= (0x1<<channelNum);	/* Rising edge */
+	}
+  }
+  else
+  {
+	LPC_GPIO_PIN_INT->ISEL |= (0x1<<channelNum);	/* Level trigger. */
+	LPC_GPIO_PIN_INT->IENR |= (0x1<<channelNum);	/* Level enable */
+	if ( event == 0 )
+	{
+	  LPC_GPIO_PIN_INT->IENF &= ~(0x1<<channelNum);	/* active-low */
+	}
+	else
+	{
+	  LPC_GPIO_PIN_INT->IENF |= (0x1<<channelNum);	/* active-high */
+	}
+  }
+
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOFlexIntEnable
+**
+** Descriptions:		Enable Interrupt
+**
+** parameters:			channel num, event(0 is falling edge, 1 is rising edge)
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOFlexIntEnable( uint32_t channelNum, uint32_t event )
+{
+  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
+  {
+	if ( event == 0 )
+	{
+	  LPC_GPIO_PIN_INT->SIENF |= (0x1<<channelNum);	/* faling edge */
+	}
+	else
+	{
+	  LPC_GPIO_PIN_INT->SIENR |= (0x1<<channelNum);	/* Rising edge */
+	}
+  }
+  else
+  {
+	LPC_GPIO_PIN_INT->SIENR |= (0x1<<channelNum);	/* Level */
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOFlexIntDisable
+**
+** Descriptions:		Disable Interrupt
+**
+** parameters:			channel num, event(0 is falling edge, 1 is rising edge)
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOFlexIntDisable( uint32_t channelNum, uint32_t event )
+{
+  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
+  {
+	if ( event == 0 )
+	{
+	  LPC_GPIO_PIN_INT->CIENF |= (0x1<<channelNum);	/* faling edge */
+	}
+	else
+	{
+	  LPC_GPIO_PIN_INT->CIENR |= (0x1<<channelNum);	/* Rising edge */
+	}
+  }
+  else
+  {
+	LPC_GPIO_PIN_INT->CIENR |= (0x1<<channelNum);	/* Level */
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOFlexIntStatus
+**
+** Descriptions:		Get Interrupt status
+**
+** parameters:			channel num
+**
+** Returned value:		None
+**
+*****************************************************************************/
+uint32_t GPIOFlexIntStatus( uint32_t channelNum )
+{
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<channelNum) )
+  {
+	return( 1 );
+  }
+  else
+  {
+	return( 0 );
+  }
+}
+
+/*****************************************************************************
+** Function name:		GPIOFlexIntClear
+**
+** Descriptions:		Clear Interrupt
+**
+** parameters:			channel num
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOFlexIntClear( uint32_t channelNum )
+{
+  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
+  {
+	LPC_GPIO_PIN_INT->IST = (1<<channelNum);
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOSetGroupedInterrupt
+**
+** Descriptions:		Set interrupt logic, sense, eventPattern, etc.
+**						logic: AND or OR, 0 is OR, 1 is AND
+**						sensePattern: edge or level, 0 is edge, 1 is level
+**						event/polarity: 0 is active low/falling, 1 is high/rising.
+**
+** parameters:			group #, bit pattern, logic, sense, event(polarity) pattern
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOSetGroupedInterrupt( uint32_t groupNum, uint32_t *bitPattern, uint32_t logic,
+		uint32_t sense, uint32_t *eventPattern )
+{
+  switch ( groupNum )
+  {
+	case GROUP0:
+	  if ( sense == 0 )
+	  {
+		LPC_GPIO_GROUP_INT0->CTRL &= ~(0x1<<2);	/* Edge trigger */
+	  }
+	  else
+	  {
+		LPC_GPIO_GROUP_INT0->CTRL |= (0x1<<2);	/* Level trigger. */
+	  }
+	  LPC_GPIO_GROUP_INT0->CTRL |= (logic<<1);
+	  LPC_GPIO_GROUP_INT0->PORT_POL[0] = *((uint32_t *)(eventPattern + 0));
+	  LPC_GPIO_GROUP_INT0->PORT_POL[1] = *((uint32_t *)(eventPattern + 1));
+	  LPC_GPIO_GROUP_INT0->PORT_ENA[0] = *((uint32_t *)(bitPattern + 0));
+	  LPC_GPIO_GROUP_INT0->PORT_ENA[1] = *((uint32_t *)(bitPattern + 1));
+      /* as soon as enabled, an edge may be generated       */
+	  /* clear interrupt flag and NVIC pending interrupt to */
+	  /* workaround the potential edge generated as enabled */
+	  LPC_GPIO_GROUP_INT0->CTRL |= (1<<0);
+	  NVIC_ClearPendingIRQ(GINT0_IRQn);
+	  NVIC_EnableIRQ(GINT0_IRQn);
+	break;
+	case GROUP1:
+	  if ( sense == 0 )
+	  {
+		LPC_GPIO_GROUP_INT1->CTRL &= ~(0x1<<2);	/* Edge trigger */
+	  }
+	  else
+	  {
+		LPC_GPIO_GROUP_INT1->CTRL |= (0x1<<2);	/* Level trigger. */
+	  }
+	  LPC_GPIO_GROUP_INT1->CTRL |= (logic<<1);
+	  LPC_GPIO_GROUP_INT1->PORT_POL[0] = *((uint32_t *)(eventPattern + 0));
+	  LPC_GPIO_GROUP_INT1->PORT_POL[1] = *((uint32_t *)(eventPattern + 1));
+	  LPC_GPIO_GROUP_INT1->PORT_ENA[0] = *((uint32_t *)(bitPattern + 0));
+	  LPC_GPIO_GROUP_INT1->PORT_ENA[1] = *((uint32_t *)(bitPattern + 1));
+      /* as soon as enabled, an edge may be generated       */
+	  /* clear interrupt flag and NVIC pending interrupt to */
+	  /* workaround the potential edge generated as enabled */
+	  LPC_GPIO_GROUP_INT1->CTRL |= (1<<0);
+	  NVIC_ClearPendingIRQ(GINT1_IRQn);
+	  NVIC_EnableIRQ(GINT1_IRQn);
+	break;
+	default:
+	  break;
+  }
+
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOGetPinValue
+**
+** Descriptions:		Read Current state of port pin, PIN register value
+**
+** parameters:			port num, bit position
+** Returned value:		None
+**
+*****************************************************************************/
+uint32_t GPIOGetPinValue( uint32_t portNum, uint32_t bitPosi )
+{
+  uint32_t regVal = 0;
+
+  if( bitPosi < 0x20 )
+  {
+	if ( LPC_GPIO->PIN[portNum] & (0x1<<bitPosi) )
+	{
+	  regVal = 1;
+	}
+  }
+  else if( bitPosi == 0xFF )
+  {
+	regVal = LPC_GPIO->PIN[portNum];
+  }
+  return ( regVal );
+}
+
+/*****************************************************************************
+** Function name:		GPIOSetBitValue
+**
+** Descriptions:		Set/clear a bit in a specific position
+**
+** parameters:			port num, bit position, bit value
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOSetBitValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal )
+{
+  if ( bitVal )
+  {
+	LPC_GPIO->SET[portNum] = 1<<bitPosi;
+  }
+  else
+  {
+	LPC_GPIO->CLR[portNum] = 1<<bitPosi;
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOSetDir
+**
+** Descriptions:		Set the direction in GPIO port
+**
+** parameters:			portNum, bit position, direction (1 out, 0 input)
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir )
+{
+  if( dir )
+  {
+	LPC_GPIO->DIR[portNum] |= (1<<bitPosi);
+  }
+  else
+  {
+	LPC_GPIO->DIR[portNum] &= ~(1<<bitPosi);
+  }
+  return;
+}
+
+/******************************************************************************
+**                            End Of File
+******************************************************************************/

+ 64 - 64
mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_gpio.h → hw/mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_gpio.h

@@ -1,64 +1,64 @@
-/****************************************************************************
- *   $Id:: gpio.h 6172 2011-01-13 18:22:51Z usb00423                        $
- *   Project: NXP LPC11Uxx software example
- *
- *   Description:
- *     This file contains definition and prototype for GPIO.
- *
- ****************************************************************************
- * 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.
-****************************************************************************/
-#ifndef __GPIO_H
-#define __GPIO_H
-
-#define CHANNEL0	0
-#define CHANNEL1	1
-#define CHANNEL2	2
-#define CHANNEL3	3
-#define CHANNEL4	4
-#define CHANNEL5	5
-#define CHANNEL6	6
-#define CHANNEL7	7
-
-#define PORT0		0
-#define PORT1		1
-
-#define GROUP0		0
-#define GROUP1		1
-
-void FLEX_INT0_IRQHandler(void);
-void FLEX_INT1_IRQHandler(void);
-void FLEX_INT2_IRQHandler(void);
-void FLEX_INT3_IRQHandler(void);
-void FLEX_INT4_IRQHandler(void);
-void FLEX_INT5_IRQHandler(void);
-void FLEX_INT6_IRQHandler(void);
-void FLEX_INT7_IRQHandler(void);
-void GINT0_IRQHandler(void);
-void GINT1_IRQHandler(void);
-void GPIOInit( void );
-void GPIOSetFlexInterrupt( uint32_t channelNum, uint32_t portNum, uint32_t bitPosi,
-		uint32_t sense, uint32_t event );
-void GPIOFlexIntEnable( uint32_t channelNum, uint32_t event );
-void GPIOFlexIntDisable( uint32_t channelNum, uint32_t event );
-uint32_t GPIOFlexIntStatus( uint32_t channelNum );
-void GPIOFlexIntClear( uint32_t channelNum );
-void GPIOSetGroupedInterrupt( uint32_t groupNum, uint32_t *bitPattern, uint32_t logic,
-		uint32_t sense, uint32_t *eventPattern );
-uint32_t GPIOGetPinValue( uint32_t portNum, uint32_t bitPosi );
-void GPIOSetBitValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal );
-void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir );
-
-#endif /* end __GPIO_H */
-/*****************************************************************************
-**                            End Of File
-******************************************************************************/
+/****************************************************************************
+ *   $Id:: gpio.h 6172 2011-01-13 18:22:51Z usb00423                        $
+ *   Project: NXP LPC11Uxx software example
+ *
+ *   Description:
+ *     This file contains definition and prototype for GPIO.
+ *
+ ****************************************************************************
+ * 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.
+****************************************************************************/
+#ifndef __GPIO_H
+#define __GPIO_H
+
+#define CHANNEL0	0
+#define CHANNEL1	1
+#define CHANNEL2	2
+#define CHANNEL3	3
+#define CHANNEL4	4
+#define CHANNEL5	5
+#define CHANNEL6	6
+#define CHANNEL7	7
+
+#define PORT0		0
+#define PORT1		1
+
+#define GROUP0		0
+#define GROUP1		1
+
+void FLEX_INT0_IRQHandler(void);
+void FLEX_INT1_IRQHandler(void);
+void FLEX_INT2_IRQHandler(void);
+void FLEX_INT3_IRQHandler(void);
+void FLEX_INT4_IRQHandler(void);
+void FLEX_INT5_IRQHandler(void);
+void FLEX_INT6_IRQHandler(void);
+void FLEX_INT7_IRQHandler(void);
+void GINT0_IRQHandler(void);
+void GINT1_IRQHandler(void);
+void GPIOInit( void );
+void GPIOSetFlexInterrupt( uint32_t channelNum, uint32_t portNum, uint32_t bitPosi,
+		uint32_t sense, uint32_t event );
+void GPIOFlexIntEnable( uint32_t channelNum, uint32_t event );
+void GPIOFlexIntDisable( uint32_t channelNum, uint32_t event );
+uint32_t GPIOFlexIntStatus( uint32_t channelNum );
+void GPIOFlexIntClear( uint32_t channelNum );
+void GPIOSetGroupedInterrupt( uint32_t groupNum, uint32_t *bitPattern, uint32_t logic,
+		uint32_t sense, uint32_t *eventPattern );
+uint32_t GPIOGetPinValue( uint32_t portNum, uint32_t bitPosi );
+void GPIOSetBitValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal );
+void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir );
+
+#endif /* end __GPIO_H */
+/*****************************************************************************
+**                            End Of File
+******************************************************************************/

+ 238 - 238
mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_uart.c → hw/mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_uart.c

@@ -1,238 +1,238 @@
-/*****************************************************************************
- *   uart.c:  UART API file for NXP LPC11xx Family Microprocessors
- *
- *   Copyright(C) 2008, NXP Semiconductor
- *   All rights reserved.
- *
- *   History
- *   2009.12.07  ver 1.00    Preliminary version, first Release
- *
-******************************************************************************/
-
-#include <stdint.h>
-#include "LPC11Uxx.h"
-#include "lpc11uxx_uart.h"
-
-volatile uint32_t UARTStatus;
-volatile uint8_t  UARTTxEmpty = 1;
-volatile uint8_t  UARTBuffer[BUFSIZE];
-volatile uint32_t UARTCount = 0;
-
-/*****************************************************************************
-** Function name:		UART_IRQHandler
-**
-** Descriptions:		UART interrupt handler
-**
-** parameters:			None
-** Returned value:		None
-**
-*****************************************************************************/
-void UART_IRQHandler(void)
-{
-  uint8_t IIRValue, LSRValue;
-  uint8_t Dummy = Dummy;
-
-  IIRValue = LPC_USART->IIR;
-
-  IIRValue >>= 1;			/* skip pending bit in IIR */
-  IIRValue &= 0x07;			/* check bit 1~3, interrupt identification */
-  if (IIRValue == IIR_RLS)		/* Receive Line Status */
-  {
-    LSRValue = LPC_USART->LSR;
-    /* Receive Line Status */
-    if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))
-    {
-      /* There are errors or break interrupt */
-      /* Read LSR will clear the interrupt */
-      UARTStatus = LSRValue;
-      Dummy = LPC_USART->RBR;	/* Dummy read on RX to clear
-								interrupt, then bail out */
-      return;
-    }
-    if (LSRValue & LSR_RDR)	/* Receive Data Ready */
-    {
-      /* If no error on RLS, normal ready, save into the data buffer. */
-      /* Note: read RBR will clear the interrupt */
-      UARTBuffer[UARTCount++] = LPC_USART->RBR;
-      if (UARTCount == BUFSIZE)
-      {
-        UARTCount = 0;		/* buffer overflow */
-      }
-    }
-  }
-  else if (IIRValue == IIR_RDA)	/* Receive Data Available */
-  {
-    /* Receive Data Available */
-    UARTBuffer[UARTCount++] = LPC_USART->RBR;
-    if (UARTCount == BUFSIZE)
-    {
-      UARTCount = 0;		/* buffer overflow */
-    }
-  }
-  else if (IIRValue == IIR_CTI)	/* Character timeout indicator */
-  {
-    /* Character Time-out indicator */
-    UARTStatus |= 0x100;		/* Bit 9 as the CTI error */
-  }
-  else if (IIRValue == IIR_THRE)	/* THRE, transmit holding register empty */
-  {
-    /* THRE interrupt */
-    LSRValue = LPC_USART->LSR;		/* Check status in the LSR to see if
-								valid data in U0THR or not */
-    if (LSRValue & LSR_THRE)
-    {
-      UARTTxEmpty = 1;
-    }
-    else
-    {
-      UARTTxEmpty = 0;
-    }
-  }
-  return;
-}
-
-#if MODEM_TEST
-/*****************************************************************************
-** Function name:		ModemInit
-**
-** Descriptions:		Initialize UART0 port as modem, setup pin select.
-**
-** parameters:			None
-** Returned value:		None
-**
-*****************************************************************************/
-void ModemInit( void )
-{
-  LPC_IOCON->PIO2_0 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO2_0 |= 0x01;     /* UART DTR */
-  LPC_IOCON->PIO0_7 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO0_7 |= 0x01;     /* UART CTS */
-  LPC_IOCON->PIO1_5 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO1_5 |= 0x01;     /* UART RTS */
-#if 1
-  LPC_IOCON->DSR_LOC	= 0;
-  LPC_IOCON->PIO2_1 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO2_1 |= 0x01;     /* UART DSR */
-
-  LPC_IOCON->DCD_LOC	= 0;
-  LPC_IOCON->PIO2_2 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO2_2 |= 0x01;     /* UART DCD */
-
-  LPC_IOCON->RI_LOC	= 0;
-  LPC_IOCON->PIO2_3 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO2_3 |= 0x01;     /* UART RI */
-
-#else
-  LPC_IOCON->DSR_LOC = 1;
-  LPC_IOCON->PIO3_1 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO3_1 |= 0x01;     /* UART DSR */
-
-  LPC_IOCON->DCD_LOC = 1;
-  LPC_IOCON->PIO3_2 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO3_2 |= 0x01;     /* UART DCD */
-
-  LPC_IOCON->RI_LOC = 1;
-  LPC_IOCON->PIO3_3 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO3_3 |= 0x01;     /* UART RI */
-#endif
-  LPC_USART->MCR = 0xC0;          /* Enable Auto RTS and Auto CTS. */
-  return;
-}
-#endif
-
-/*****************************************************************************
-** Function name:		UARTInit
-**
-** Descriptions:		Initialize UART0 port, setup pin select,
-**				clock, parity, stop bits, FIFO, etc.
-**
-** parameters:			UART baudrate
-** Returned value:		None
-**
-*****************************************************************************/
-void UARTInit(uint32_t baudrate)
-{
-  uint32_t Fdiv;
-  uint32_t regVal;
-
-  UARTTxEmpty = 1;
-  UARTCount = 0;
-
-  NVIC_DisableIRQ(UART_IRQn);
-
-  LPC_IOCON->PIO0_18 &= ~0x07;    /*  UART I/O config */
-  LPC_IOCON->PIO0_18 |= 0x01;     /* UART RXD */
-  LPC_IOCON->PIO0_19 &= ~0x07;
-  LPC_IOCON->PIO0_19 |= 0x01;     /* UART TXD */
-  /* Enable UART clock */
-  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);
-  LPC_SYSCON->UARTCLKDIV = 0x1;     /* divided by 1 */
-
-  LPC_USART->LCR = 0x83;            /* 8 bits, no Parity, 1 Stop bit */
-  regVal = LPC_SYSCON->UARTCLKDIV;
-
-  Fdiv = (((SystemCoreClock*LPC_SYSCON->SYSAHBCLKDIV)/regVal)/16)/baudrate ;	/*baud rate */
-
-  LPC_USART->DLM = Fdiv / 256;
-  LPC_USART->DLL = Fdiv % 256;
-  LPC_USART->LCR = 0x03;		/* DLAB = 0 */
-  LPC_USART->FCR = 0x07;		/* Enable and reset TX and RX FIFO. */
-
-  /* Read to clear the line status. */
-  regVal = LPC_USART->LSR;
-
-  /* Ensure a clean start, no data in either TX or RX FIFO. */
-// CodeRed - added parentheses around comparison in operand of &
-  while (( LPC_USART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) );
-  while ( LPC_USART->LSR & LSR_RDR )
-  {
-	regVal = LPC_USART->RBR;	/* Dump data from RX FIFO */
-  }
-
-  /* Enable the UART Interrupt */
-  NVIC_EnableIRQ(UART_IRQn);
-
-#if CONFIG_UART_ENABLE_INTERRUPT==1
-#if CONFIG_UART_ENABLE_TX_INTERRUPT==1
-  LPC_USART->IER = IER_RBR | IER_THRE | IER_RLS;	/* Enable UART interrupt */
-#else
-  LPC_USART->IER = IER_RBR | IER_RLS;	/* Enable UART interrupt */
-#endif
-#endif
-  return;
-}
-
-/*****************************************************************************
-** Function name:		UARTSend
-**
-** Descriptions:		Send a block of data to the UART 0 port based
-**				on the data length
-**
-** parameters:		buffer pointer, and data length
-** Returned value:	None
-**
-*****************************************************************************/
-void UARTSend(uint8_t *BufferPtr, uint32_t Length)
-{
-
-  while ( Length != 0 )
-  {
-	  /* THRE status, contain valid data */
-#if CONFIG_UART_ENABLE_TX_INTERRUPT==1
-	  /* Below flag is set inside the interrupt handler when THRE occurs. */
-      while ( !(UARTTxEmpty & 0x01) );
-	  LPC_USART->THR = *BufferPtr;
-      UARTTxEmpty = 0;	/* not empty in the THR until it shifts out */
-#else
-	  while ( !(LPC_USART->LSR & LSR_THRE) );
-	  LPC_USART->THR = *BufferPtr;
-#endif
-      BufferPtr++;
-      Length--;
-  }
-  return;
-}
-
-/******************************************************************************
-**                            End Of File
-******************************************************************************/
+/*****************************************************************************
+ *   uart.c:  UART API file for NXP LPC11xx Family Microprocessors
+ *
+ *   Copyright(C) 2008, NXP Semiconductor
+ *   All rights reserved.
+ *
+ *   History
+ *   2009.12.07  ver 1.00    Preliminary version, first Release
+ *
+******************************************************************************/
+
+#include <stdint.h>
+#include "LPC11Uxx.h"
+#include "lpc11uxx_uart.h"
+
+volatile uint32_t UARTStatus;
+volatile uint8_t  UARTTxEmpty = 1;
+volatile uint8_t  UARTBuffer[BUFSIZE];
+volatile uint32_t UARTCount = 0;
+
+/*****************************************************************************
+** Function name:		UART_IRQHandler
+**
+** Descriptions:		UART interrupt handler
+**
+** parameters:			None
+** Returned value:		None
+**
+*****************************************************************************/
+void UART_IRQHandler(void)
+{
+  uint8_t IIRValue, LSRValue;
+  uint8_t Dummy = Dummy;
+
+  IIRValue = LPC_USART->IIR;
+
+  IIRValue >>= 1;			/* skip pending bit in IIR */
+  IIRValue &= 0x07;			/* check bit 1~3, interrupt identification */
+  if (IIRValue == IIR_RLS)		/* Receive Line Status */
+  {
+    LSRValue = LPC_USART->LSR;
+    /* Receive Line Status */
+    if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))
+    {
+      /* There are errors or break interrupt */
+      /* Read LSR will clear the interrupt */
+      UARTStatus = LSRValue;
+      Dummy = LPC_USART->RBR;	/* Dummy read on RX to clear
+								interrupt, then bail out */
+      return;
+    }
+    if (LSRValue & LSR_RDR)	/* Receive Data Ready */
+    {
+      /* If no error on RLS, normal ready, save into the data buffer. */
+      /* Note: read RBR will clear the interrupt */
+      UARTBuffer[UARTCount++] = LPC_USART->RBR;
+      if (UARTCount == BUFSIZE)
+      {
+        UARTCount = 0;		/* buffer overflow */
+      }
+    }
+  }
+  else if (IIRValue == IIR_RDA)	/* Receive Data Available */
+  {
+    /* Receive Data Available */
+    UARTBuffer[UARTCount++] = LPC_USART->RBR;
+    if (UARTCount == BUFSIZE)
+    {
+      UARTCount = 0;		/* buffer overflow */
+    }
+  }
+  else if (IIRValue == IIR_CTI)	/* Character timeout indicator */
+  {
+    /* Character Time-out indicator */
+    UARTStatus |= 0x100;		/* Bit 9 as the CTI error */
+  }
+  else if (IIRValue == IIR_THRE)	/* THRE, transmit holding register empty */
+  {
+    /* THRE interrupt */
+    LSRValue = LPC_USART->LSR;		/* Check status in the LSR to see if
+								valid data in U0THR or not */
+    if (LSRValue & LSR_THRE)
+    {
+      UARTTxEmpty = 1;
+    }
+    else
+    {
+      UARTTxEmpty = 0;
+    }
+  }
+  return;
+}
+
+#if MODEM_TEST
+/*****************************************************************************
+** Function name:		ModemInit
+**
+** Descriptions:		Initialize UART0 port as modem, setup pin select.
+**
+** parameters:			None
+** Returned value:		None
+**
+*****************************************************************************/
+void ModemInit( void )
+{
+  LPC_IOCON->PIO2_0 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO2_0 |= 0x01;     /* UART DTR */
+  LPC_IOCON->PIO0_7 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO0_7 |= 0x01;     /* UART CTS */
+  LPC_IOCON->PIO1_5 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO1_5 |= 0x01;     /* UART RTS */
+#if 1
+  LPC_IOCON->DSR_LOC	= 0;
+  LPC_IOCON->PIO2_1 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO2_1 |= 0x01;     /* UART DSR */
+
+  LPC_IOCON->DCD_LOC	= 0;
+  LPC_IOCON->PIO2_2 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO2_2 |= 0x01;     /* UART DCD */
+
+  LPC_IOCON->RI_LOC	= 0;
+  LPC_IOCON->PIO2_3 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO2_3 |= 0x01;     /* UART RI */
+
+#else
+  LPC_IOCON->DSR_LOC = 1;
+  LPC_IOCON->PIO3_1 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO3_1 |= 0x01;     /* UART DSR */
+
+  LPC_IOCON->DCD_LOC = 1;
+  LPC_IOCON->PIO3_2 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO3_2 |= 0x01;     /* UART DCD */
+
+  LPC_IOCON->RI_LOC = 1;
+  LPC_IOCON->PIO3_3 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO3_3 |= 0x01;     /* UART RI */
+#endif
+  LPC_USART->MCR = 0xC0;          /* Enable Auto RTS and Auto CTS. */
+  return;
+}
+#endif
+
+/*****************************************************************************
+** Function name:		UARTInit
+**
+** Descriptions:		Initialize UART0 port, setup pin select,
+**				clock, parity, stop bits, FIFO, etc.
+**
+** parameters:			UART baudrate
+** Returned value:		None
+**
+*****************************************************************************/
+void UARTInit(uint32_t baudrate)
+{
+  uint32_t Fdiv;
+  uint32_t regVal;
+
+  UARTTxEmpty = 1;
+  UARTCount = 0;
+
+  NVIC_DisableIRQ(UART_IRQn);
+
+  LPC_IOCON->PIO0_18 &= ~0x07;    /*  UART I/O config */
+  LPC_IOCON->PIO0_18 |= 0x01;     /* UART RXD */
+  LPC_IOCON->PIO0_19 &= ~0x07;
+  LPC_IOCON->PIO0_19 |= 0x01;     /* UART TXD */
+  /* Enable UART clock */
+  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);
+  LPC_SYSCON->UARTCLKDIV = 0x1;     /* divided by 1 */
+
+  LPC_USART->LCR = 0x83;            /* 8 bits, no Parity, 1 Stop bit */
+  regVal = LPC_SYSCON->UARTCLKDIV;
+
+  Fdiv = (((SystemCoreClock*LPC_SYSCON->SYSAHBCLKDIV)/regVal)/16)/baudrate ;	/*baud rate */
+
+  LPC_USART->DLM = Fdiv / 256;
+  LPC_USART->DLL = Fdiv % 256;
+  LPC_USART->LCR = 0x03;		/* DLAB = 0 */
+  LPC_USART->FCR = 0x07;		/* Enable and reset TX and RX FIFO. */
+
+  /* Read to clear the line status. */
+  regVal = LPC_USART->LSR;
+
+  /* Ensure a clean start, no data in either TX or RX FIFO. */
+// CodeRed - added parentheses around comparison in operand of &
+  while (( LPC_USART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) );
+  while ( LPC_USART->LSR & LSR_RDR )
+  {
+	regVal = LPC_USART->RBR;	/* Dump data from RX FIFO */
+  }
+
+  /* Enable the UART Interrupt */
+  NVIC_EnableIRQ(UART_IRQn);
+
+#if CONFIG_UART_ENABLE_INTERRUPT==1
+#if CONFIG_UART_ENABLE_TX_INTERRUPT==1
+  LPC_USART->IER = IER_RBR | IER_THRE | IER_RLS;	/* Enable UART interrupt */
+#else
+  LPC_USART->IER = IER_RBR | IER_RLS;	/* Enable UART interrupt */
+#endif
+#endif
+  return;
+}
+
+/*****************************************************************************
+** Function name:		UARTSend
+**
+** Descriptions:		Send a block of data to the UART 0 port based
+**				on the data length
+**
+** parameters:		buffer pointer, and data length
+** Returned value:	None
+**
+*****************************************************************************/
+void UARTSend(uint8_t *BufferPtr, uint32_t Length)
+{
+
+  while ( Length != 0 )
+  {
+	  /* THRE status, contain valid data */
+#if CONFIG_UART_ENABLE_TX_INTERRUPT==1
+	  /* Below flag is set inside the interrupt handler when THRE occurs. */
+      while ( !(UARTTxEmpty & 0x01) );
+	  LPC_USART->THR = *BufferPtr;
+      UARTTxEmpty = 0;	/* not empty in the THR until it shifts out */
+#else
+	  while ( !(LPC_USART->LSR & LSR_THRE) );
+	  LPC_USART->THR = *BufferPtr;
+#endif
+      BufferPtr++;
+      Length--;
+  }
+  return;
+}
+
+/******************************************************************************
+**                            End Of File
+******************************************************************************/

+ 55 - 55
mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_uart.h → hw/mcu/lpc11uxx/LPC11Uxx_DriverLib/lpc11uxx_uart.h

@@ -1,55 +1,55 @@
-/*****************************************************************************
- *   uart.h:  Header file for NXP LPC1xxx Family Microprocessors
- *
- *   Copyright(C) 2008, NXP Semiconductor
- *   All rights reserved.
- *
- *   History
- *   2009.12.07  ver 1.00    Preliminary version, first Release
- *
-******************************************************************************/
-#ifndef __UART_H
-#define __UART_H
-
-#define RS485_ENABLED		0
-#define TX_INTERRUPT		0		/* 0 if TX uses polling, 1 interrupt driven. */
-#define MODEM_TEST			0
-
-#define IER_RBR		0x01
-#define IER_THRE	0x02
-#define IER_RLS		0x04
-
-#define IIR_PEND	0x01
-#define IIR_RLS		0x03
-#define IIR_RDA		0x02
-#define IIR_CTI		0x06
-#define IIR_THRE	0x01
-
-#define LSR_RDR		0x01
-#define LSR_OE		0x02
-#define LSR_PE		0x04
-#define LSR_FE		0x08
-#define LSR_BI		0x10
-#define LSR_THRE	0x20
-#define LSR_TEMT	0x40
-#define LSR_RXFE	0x80
-
-#define BUFSIZE		0x40
-
-/* RS485 mode definition. */
-#define RS485_NMMEN		(0x1<<0)
-#define RS485_RXDIS		(0x1<<1)
-#define RS485_AADEN		(0x1<<2)
-#define RS485_SEL		(0x1<<3)
-#define RS485_DCTRL		(0x1<<4)
-#define RS485_OINV		(0x1<<5)
-
-void ModemInit( void );
-void UARTInit(uint32_t Baudrate);
-void UART_IRQHandler(void);
-void UARTSend(uint8_t *BufferPtr, uint32_t Length);
-
-#endif /* end __UART_H */
-/*****************************************************************************
-**                            End Of File
-******************************************************************************/
+/*****************************************************************************
+ *   uart.h:  Header file for NXP LPC1xxx Family Microprocessors
+ *
+ *   Copyright(C) 2008, NXP Semiconductor
+ *   All rights reserved.
+ *
+ *   History
+ *   2009.12.07  ver 1.00    Preliminary version, first Release
+ *
+******************************************************************************/
+#ifndef __UART_H
+#define __UART_H
+
+#define RS485_ENABLED		0
+#define TX_INTERRUPT		0		/* 0 if TX uses polling, 1 interrupt driven. */
+#define MODEM_TEST			0
+
+#define IER_RBR		0x01
+#define IER_THRE	0x02
+#define IER_RLS		0x04
+
+#define IIR_PEND	0x01
+#define IIR_RLS		0x03
+#define IIR_RDA		0x02
+#define IIR_CTI		0x06
+#define IIR_THRE	0x01
+
+#define LSR_RDR		0x01
+#define LSR_OE		0x02
+#define LSR_PE		0x04
+#define LSR_FE		0x08
+#define LSR_BI		0x10
+#define LSR_THRE	0x20
+#define LSR_TEMT	0x40
+#define LSR_RXFE	0x80
+
+#define BUFSIZE		0x40
+
+/* RS485 mode definition. */
+#define RS485_NMMEN		(0x1<<0)
+#define RS485_RXDIS		(0x1<<1)
+#define RS485_AADEN		(0x1<<2)
+#define RS485_SEL		(0x1<<3)
+#define RS485_DCTRL		(0x1<<4)
+#define RS485_OINV		(0x1<<5)
+
+void ModemInit( void );
+void UARTInit(uint32_t Baudrate);
+void UART_IRQHandler(void);
+void UARTSend(uint8_t *BufferPtr, uint32_t Length);
+
+#endif /* end __UART_H */
+/*****************************************************************************
+**                            End Of File
+******************************************************************************/

+ 0 - 0
mcu/lpc11uxx/iar/startup_lpc11xx.s → hw/mcu/lpc11uxx/iar/startup_lpc11xx.s


+ 19 - 19
mcu/lpc11uxx/keil/lpc11uxx.sct → hw/mcu/lpc11uxx/keil/lpc11uxx.sct

@@ -1,19 +1,19 @@
-; *************************************************************
-; *** Scatter-Loading Description File generated by uVision ***
-; *************************************************************
-
-LR_IROM1 0x00000000 0x00020000  {    ; load region size_region
-  ER_IROM1 0x00000000 0x00020000  {  ; load address = execution address
-   *.o (RESET, +First)
-   *(InRoot$$Sections)
-   .ANY (+RO)
-  }
-  RW_IRAM1 0x10000000 0x00002000  {  ; RW data
-   .ANY (+RW +ZI)
-  }
-  
-  RW_IRAM2 0x20004000 0x00000800  {
-   *(USBRAM_SECTION)
-  }
-}
-
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x00000000 0x00020000  {    ; load region size_region
+  ER_IROM1 0x00000000 0x00020000  {  ; load address = execution address
+   *.o (RESET, +First)
+   *(InRoot$$Sections)
+   .ANY (+RO)
+  }
+  RW_IRAM1 0x10000000 0x00002000  {  ; RW data
+   .ANY (+RW +ZI)
+  }
+  
+  RW_IRAM2 0x20004000 0x00000800  {
+   *(USBRAM_SECTION)
+  }
+}
+

+ 0 - 0
mcu/lpc11uxx/keil/startup_LPC11Uxx.s → hw/mcu/lpc11uxx/keil/startup_LPC11Uxx.s


+ 0 - 0
mcu/lpc11uxx/lpcxpresso/cr_startup_lpc11u.c → hw/mcu/lpc11uxx/lpcxpresso/cr_startup_lpc11u.c


+ 0 - 0
mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/history.txt → hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/history.txt


+ 0 - 0
mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/LPC13Uxx.h → hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/LPC13Uxx.h


+ 0 - 0
mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/core_cm3.h → hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/core_cm3.h


+ 0 - 0
mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/core_cmFunc.h → hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/core_cmFunc.h


+ 0 - 0
mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/core_cmInstr.h → hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/core_cmInstr.h


+ 0 - 0
mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/power_api.h → hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/power_api.h


+ 0 - 0
mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/system_LPC13Uxx.h → hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/inc/system_LPC13Uxx.h


+ 0 - 0
mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/liblinks.xml → hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/liblinks.xml


+ 0 - 0
mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/src/system_LPC13Uxx.c → hw/mcu/lpc13uxx/CMSIS_CORE_LPC13Uxx/src/system_LPC13Uxx.c


+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/clkconfig.h → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/clkconfig.h


+ 64 - 64
mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/gpio.h → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/gpio.h

@@ -1,64 +1,64 @@
-/****************************************************************************
- *   $Id:: gpio.h 6172 2011-01-13 18:22:51Z usb00423                        $
- *   Project: NXP LPC13Uxx software example
- *
- *   Description:
- *     This file contains definition and prototype for GPIO.
- *
- ****************************************************************************
- * 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.
-****************************************************************************/
-#ifndef __GPIO_H
-#define __GPIO_H
-
-#define CHANNEL0	0
-#define CHANNEL1	1
-#define CHANNEL2	2
-#define CHANNEL3	3
-#define CHANNEL4	4
-#define CHANNEL5	5
-#define CHANNEL6	6
-#define CHANNEL7	7
-
-#define PORT0		0
-#define PORT1		1
-
-#define GROUP0		0
-#define GROUP1		1
-
-void PIN_INT0_IRQHandler(void);
-void PIN_INT1_IRQHandler(void);
-void PIN_INT2_IRQHandler(void);
-void PIN_INT3_IRQHandler(void);
-void PIN_INT4_IRQHandler(void);
-void PIN_INT5_IRQHandler(void);
-void PIN_INT6_IRQHandler(void);
-void PIN_INT7_IRQHandler(void);
-void GINT0_IRQHandler(void);
-void GINT1_IRQHandler(void);
-void GPIOInit( void );
-void GPIOSetPinInterrupt( uint32_t channelNum, uint32_t portNum, uint32_t bitPosi,
-		uint32_t sense, uint32_t event );
-void GPIOPinIntEnable( uint32_t channelNum, uint32_t event );
-void GPIOPinIntDisable( uint32_t channelNum, uint32_t event );
-uint32_t GPIOPinIntStatus( uint32_t channelNum );
-void GPIOPinIntClear( uint32_t channelNum );
-void GPIOSetGroupedInterrupt( uint32_t groupNum, uint32_t *bitPattern, uint32_t logic,
-		uint32_t sense, uint32_t *eventPattern );
-uint32_t GPIOGetPinValue( uint32_t portNum, uint32_t bitPosi );
-void GPIOSetBitValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal );
-void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir );
-
-#endif /* end __GPIO_H */
-/*****************************************************************************
-**                            End Of File
-******************************************************************************/
+/****************************************************************************
+ *   $Id:: gpio.h 6172 2011-01-13 18:22:51Z usb00423                        $
+ *   Project: NXP LPC13Uxx software example
+ *
+ *   Description:
+ *     This file contains definition and prototype for GPIO.
+ *
+ ****************************************************************************
+ * 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.
+****************************************************************************/
+#ifndef __GPIO_H
+#define __GPIO_H
+
+#define CHANNEL0	0
+#define CHANNEL1	1
+#define CHANNEL2	2
+#define CHANNEL3	3
+#define CHANNEL4	4
+#define CHANNEL5	5
+#define CHANNEL6	6
+#define CHANNEL7	7
+
+#define PORT0		0
+#define PORT1		1
+
+#define GROUP0		0
+#define GROUP1		1
+
+void PIN_INT0_IRQHandler(void);
+void PIN_INT1_IRQHandler(void);
+void PIN_INT2_IRQHandler(void);
+void PIN_INT3_IRQHandler(void);
+void PIN_INT4_IRQHandler(void);
+void PIN_INT5_IRQHandler(void);
+void PIN_INT6_IRQHandler(void);
+void PIN_INT7_IRQHandler(void);
+void GINT0_IRQHandler(void);
+void GINT1_IRQHandler(void);
+void GPIOInit( void );
+void GPIOSetPinInterrupt( uint32_t channelNum, uint32_t portNum, uint32_t bitPosi,
+		uint32_t sense, uint32_t event );
+void GPIOPinIntEnable( uint32_t channelNum, uint32_t event );
+void GPIOPinIntDisable( uint32_t channelNum, uint32_t event );
+uint32_t GPIOPinIntStatus( uint32_t channelNum );
+void GPIOPinIntClear( uint32_t channelNum );
+void GPIOSetGroupedInterrupt( uint32_t groupNum, uint32_t *bitPattern, uint32_t logic,
+		uint32_t sense, uint32_t *eventPattern );
+uint32_t GPIOGetPinValue( uint32_t portNum, uint32_t bitPosi );
+void GPIOSetBitValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal );
+void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir );
+
+#endif /* end __GPIO_H */
+/*****************************************************************************
+**                            End Of File
+******************************************************************************/

+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/nmi.h → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/nmi.h


+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/power_api.h → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/power_api.h


+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/timer16.h → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/timer16.h


+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/timer32.h → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/timer32.h


+ 52 - 52
mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/type.h → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/type.h

@@ -1,52 +1,52 @@
-/****************************************************************************
- *   $Id:: type.h 6172 2011-01-13 18:22:51Z usb00423                        $
- *   Project: NXP LPC13Uxx software example
- *
- *   Description:
- *     This file contains different type definition.
- *
- ****************************************************************************
- * 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.
-****************************************************************************/
-#ifndef __TYPE_H__
-#define __TYPE_H__
-
-#if defined (__GNUC__)
-#include <stdint.h>
-
-#else
-/* exact-width signed integer types */
-typedef   signed          char int8_t;
-typedef   signed short     int int16_t;
-typedef   signed           int int32_t;
-//typedef   signed       __int64 int64_t;
-
-     /* exact-width unsigned integer types */
-typedef unsigned          char uint8_t;
-typedef unsigned short     int uint16_t;
-typedef unsigned           int uint32_t;
-//typedef unsigned       __int64 uint64_t;
-#endif
-
-#ifndef NULL
-#define NULL    ((void *)0)
-#endif
-
-#ifndef FALSE
-#define FALSE   (0)
-#endif
-
-#ifndef TRUE
-#define TRUE    (1)
-#endif
-
-#endif  /* __TYPE_H__ */
+/****************************************************************************
+ *   $Id:: type.h 6172 2011-01-13 18:22:51Z usb00423                        $
+ *   Project: NXP LPC13Uxx software example
+ *
+ *   Description:
+ *     This file contains different type definition.
+ *
+ ****************************************************************************
+ * 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.
+****************************************************************************/
+#ifndef __TYPE_H__
+#define __TYPE_H__
+
+#if defined (__GNUC__)
+#include <stdint.h>
+
+#else
+/* exact-width signed integer types */
+typedef   signed          char int8_t;
+typedef   signed short     int int16_t;
+typedef   signed           int int32_t;
+//typedef   signed       __int64 int64_t;
+
+     /* exact-width unsigned integer types */
+typedef unsigned          char uint8_t;
+typedef unsigned short     int uint16_t;
+typedef unsigned           int uint32_t;
+//typedef unsigned       __int64 uint64_t;
+#endif
+
+#ifndef NULL
+#define NULL    ((void *)0)
+#endif
+
+#ifndef FALSE
+#define FALSE   (0)
+#endif
+
+#ifndef TRUE
+#define TRUE    (1)
+#endif
+
+#endif  /* __TYPE_H__ */

+ 72 - 72
mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/uart.h → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/uart.h

@@ -1,72 +1,72 @@
-/****************************************************************************
- *   $Id:: uart.h 6172 2011-01-13 18:22:51Z usb00423                        $
- *   Project: NXP LPC13Uxx software example
- *
- *   Description:
- *     This file contains definition and prototype for UART configuration.
- *
- ****************************************************************************
- * 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.
-****************************************************************************/
-#ifndef __UART_H
-#define __UART_H
-
-#define AUTOBAUD_ENABLE 0
-#define FDR_CALIBRATION 0
-#define RS485_ENABLED   0
-#define TX_INTERRUPT    0		/* 0 if TX uses polling, 1 interrupt driven. */
-#define MODEM_TEST      0
-
-#define IER_RBR         (0x01<<0)
-#define IER_THRE        (0x01<<1)
-#define IER_RLS         (0x01<<2)
-#define IER_ABEO        (0x01<<8)
-#define IER_ABTO        (0x01<<9)
-
-#define IIR_PEND        0x01
-#define IIR_RLS         0x03
-#define IIR_RDA         0x02
-#define IIR_CTI         0x06
-#define IIR_THRE        0x01
-#define IIR_ABEO        (0x01<<8)
-#define IIR_ABTO        (0x01<<9)
-
-#define LSR_RDR         (0x01<<0)
-#define LSR_OE          (0x01<<1)
-#define LSR_PE          (0x01<<2)
-#define LSR_FE          (0x01<<3)
-#define LSR_BI          (0x01<<4)
-#define LSR_THRE        (0x01<<5)
-#define LSR_TEMT        (0x01<<6)
-#define LSR_RXFE        (0x01<<7)
-
-#define BUFSIZE         0x40
-
-/* RS485 mode definition. */
-#define RS485_NMMEN		(0x1<<0)
-#define RS485_RXDIS		(0x1<<1)
-#define RS485_AADEN		(0x1<<2)
-#define RS485_SEL             (0x1<<3)
-#define RS485_DCTRL		(0x1<<4)
-#define RS485_OINV		(0x1<<5)
-
-void ModemInit( void );
-void UARTInit(uint32_t Baudrate);
-void USART_IRQHandler(void);
-void UARTSend(uint8_t *BufferPtr, uint32_t Length);
-void print_string( uint8_t *str_ptr );
-uint8_t get_key( void );
-
-#endif /* end __UART_H */
-/*****************************************************************************
-**                            End Of File
-******************************************************************************/
+/****************************************************************************
+ *   $Id:: uart.h 6172 2011-01-13 18:22:51Z usb00423                        $
+ *   Project: NXP LPC13Uxx software example
+ *
+ *   Description:
+ *     This file contains definition and prototype for UART configuration.
+ *
+ ****************************************************************************
+ * 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.
+****************************************************************************/
+#ifndef __UART_H
+#define __UART_H
+
+#define AUTOBAUD_ENABLE 0
+#define FDR_CALIBRATION 0
+#define RS485_ENABLED   0
+#define TX_INTERRUPT    0		/* 0 if TX uses polling, 1 interrupt driven. */
+#define MODEM_TEST      0
+
+#define IER_RBR         (0x01<<0)
+#define IER_THRE        (0x01<<1)
+#define IER_RLS         (0x01<<2)
+#define IER_ABEO        (0x01<<8)
+#define IER_ABTO        (0x01<<9)
+
+#define IIR_PEND        0x01
+#define IIR_RLS         0x03
+#define IIR_RDA         0x02
+#define IIR_CTI         0x06
+#define IIR_THRE        0x01
+#define IIR_ABEO        (0x01<<8)
+#define IIR_ABTO        (0x01<<9)
+
+#define LSR_RDR         (0x01<<0)
+#define LSR_OE          (0x01<<1)
+#define LSR_PE          (0x01<<2)
+#define LSR_FE          (0x01<<3)
+#define LSR_BI          (0x01<<4)
+#define LSR_THRE        (0x01<<5)
+#define LSR_TEMT        (0x01<<6)
+#define LSR_RXFE        (0x01<<7)
+
+#define BUFSIZE         0x40
+
+/* RS485 mode definition. */
+#define RS485_NMMEN		(0x1<<0)
+#define RS485_RXDIS		(0x1<<1)
+#define RS485_AADEN		(0x1<<2)
+#define RS485_SEL             (0x1<<3)
+#define RS485_DCTRL		(0x1<<4)
+#define RS485_OINV		(0x1<<5)
+
+void ModemInit( void );
+void UARTInit(uint32_t Baudrate);
+void USART_IRQHandler(void);
+void UARTSend(uint8_t *BufferPtr, uint32_t Length);
+void print_string( uint8_t *str_ptr );
+uint8_t get_key( void );
+
+#endif /* end __UART_H */
+/*****************************************************************************
+**                            End Of File
+******************************************************************************/

+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/usart.h → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/inc/usart.h


+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/src/Serial.c → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/Serial.c


+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/src/clkconfig.c → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/clkconfig.c


+ 838 - 838
mcu/lpc13uxx/LPC13Uxx_DriverLib/src/gpio.c → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/gpio.c

@@ -1,838 +1,838 @@
-/****************************************************************************
- *   $Id:: gpio.c 6874 2011-03-22 01:58:31Z usb00423                        $
- *   Project: NXP LPC13Uxx GPIO example
- *
- *   Description:
- *     This file contains GPIO code example which include GPIO
- *     initialization, GPIO interrupt handler, and related APIs for
- *     GPIO access.
- *
- ****************************************************************************
-* 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.
-* Permission to use, copy, modify, and distribute this software and its
-* documentation is hereby granted, under NXP Semiconductors'
-* relevant copyright in the software, without fee, provided that it
-* is used in conjunction with NXP Semiconductors microcontrollers.  This
-* copyright, permission, and disclaimer notice must appear in all copies of
-* this code.
-****************************************************************************/
-#include "LPC13Uxx.h"			/* LPC13Uxx Peripheral Registers */
-#include "gpio.h"
-
-volatile uint32_t pin_int0_counter = 0;
-volatile uint32_t pin_int1_counter = 0;
-volatile uint32_t pin_int2_counter = 0;
-volatile uint32_t pin_int3_counter = 0;
-volatile uint32_t pin_int4_counter = 0;
-volatile uint32_t pin_int5_counter = 0;
-volatile uint32_t pin_int6_counter = 0;
-volatile uint32_t pin_int7_counter = 0;
-volatile uint32_t gint0_counter = 0;
-volatile uint32_t gint1_counter = 0;
-volatile uint32_t pin_int0_level_counter = 0;
-volatile uint32_t pin_int0_rising_edge_counter = 0;
-volatile uint32_t pin_int0_falling_edge_counter = 0;
-volatile uint32_t pin_int1_level_counter = 0;
-volatile uint32_t pin_int1_rising_edge_counter = 0;
-volatile uint32_t pin_int1_falling_edge_counter = 0;
-volatile uint32_t pin_int2_level_counter = 0;
-volatile uint32_t pin_int2_rising_edge_counter = 0;
-volatile uint32_t pin_int2_falling_edge_counter = 0;
-volatile uint32_t pin_int3_level_counter = 0;
-volatile uint32_t pin_int3_rising_edge_counter = 0;
-volatile uint32_t pin_int3_falling_edge_counter = 0;
-volatile uint32_t pin_int4_level_counter = 0;
-volatile uint32_t pin_int4_rising_edge_counter = 0;
-volatile uint32_t pin_int4_falling_edge_counter = 0;
-volatile uint32_t pin_int5_level_counter = 0;
-volatile uint32_t pin_int5_rising_edge_counter = 0;
-volatile uint32_t pin_int5_falling_edge_counter = 0;
-volatile uint32_t pin_int6_level_counter = 0;
-volatile uint32_t pin_int6_rising_edge_counter = 0;
-volatile uint32_t pin_int6_falling_edge_counter = 0;
-volatile uint32_t pin_int7_level_counter = 0;
-volatile uint32_t pin_int7_rising_edge_counter = 0;
-volatile uint32_t pin_int7_falling_edge_counter = 0;
-volatile uint32_t gint0_level_counter = 0;
-volatile uint32_t gint0_edge_counter = 0;
-volatile uint32_t gint1_level_counter = 0;
-volatile uint32_t gint1_edge_counter = 0;
-
-/*****************************************************************************
-** Function name:		PIN_INT0_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void PIN_INT0_IRQHandler(void)
-{
-  pin_int0_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<0) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<0) )
-	{
-	  pin_int0_level_counter++;
-	}
-	else
-	{
-	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<0) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<0) ) )
-	  {
-		pin_int0_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<0;
-	  }
-	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<0) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<0) ) )
-	  {
-		pin_int0_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<0;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<0;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		PIN_INT1_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void PIN_INT1_IRQHandler(void)
-{
-  pin_int1_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<1) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<1) )
-	{
-	  pin_int1_level_counter++;
-	}
-	else
-	{
-	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<1) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<1) ) )
-	  {
-		pin_int1_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<1;
-	  }
-	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<1) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<1) ) )
-	  {
-		pin_int1_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<1;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<1;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		PIN_INT2_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void PIN_INT2_IRQHandler(void)
-{
-  pin_int2_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<2) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<2) )
-	{
-	  pin_int2_level_counter++;
-	}
-	else
-	{
-	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<2) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<2) ) )
-	  {
-		pin_int2_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<2;
-	  }
-	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<2) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<2) ) )
-	  {
-		pin_int2_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<2;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<2;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		PIN_INT3_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void PIN_INT3_IRQHandler(void)
-{
-  pin_int3_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<3) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<3) )
-	{
-	  pin_int3_level_counter++;
-	}
-	else
-	{
-	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<3) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<3) ) )
-	  {
-		pin_int3_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<3;
-	  }
-	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<3) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<3) ) )
-	  {
-		pin_int3_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<3;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<3;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		PIN_INT4_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void PIN_INT4_IRQHandler(void)
-{
-  pin_int4_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<4) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<4) )
-	{
-	  pin_int4_level_counter++;
-	}
-	else
-	{
-	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<4) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<4) ) )
-	  {
-		pin_int4_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<4;
-	  }
-	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<4) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<4) ) )
-	  {
-		pin_int4_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<4;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<4;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		PIN_INT5_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void PIN_INT5_IRQHandler(void)
-{
-  pin_int5_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<5) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<5) )
-	{
-	  pin_int5_level_counter++;
-	}
-	else
-	{
-	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<5) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<5) ) )
-	  {
-		pin_int5_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<5;
-	  }
-	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<5) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<5) ) )
-	  {
-		pin_int5_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<5;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<5;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		PIN_INT6_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void PIN_INT6_IRQHandler(void)
-{
-  pin_int6_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<6) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<6) )
-	{
-	  pin_int6_level_counter++;
-	}
-	else
-	{
-	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<6) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<6) ) )
-	  {
-		pin_int6_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<6;
-	  }
-	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<6) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<6) ) )
-	  {
-		pin_int6_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<6;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<6;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		PIN_INT7_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void PIN_INT7_IRQHandler(void)
-{
-  pin_int7_counter++;
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<7) )
-  {
-	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<7) )
-	{
-	  pin_int7_level_counter++;
-	}
-	else
-	{
-	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<7) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<7) ) )
-	  {
-		pin_int7_rising_edge_counter++;
-		LPC_GPIO_PIN_INT->RISE = 0x1<<7;
-	  }
-	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<7) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<7) ) )
-	  {
-		pin_int7_falling_edge_counter++;
-		LPC_GPIO_PIN_INT->FALL = 0x1<<7;
-	  }
-	  LPC_GPIO_PIN_INT->IST = 0x1<<7;
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GINT0_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GINT0_IRQHandler(void)
-{
-  gint0_counter++;
-  if ( LPC_GPIO_GROUP_INT0->CTRL & (0x1<<0) )
-  {
-	if ( LPC_GPIO_GROUP_INT0->CTRL & (0x1<<2) )
-	{
-	  gint0_level_counter++;
-	}
-	else
-	{
-	  gint0_edge_counter++;
-	}
-	LPC_GPIO_GROUP_INT0->CTRL |= (0x1<<0);
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GINT1_IRQHandler
-**
-** Descriptions:		Use one GPIO pin as interrupt source
-**
-** parameters:			None
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GINT1_IRQHandler(void)
-{
-  gint1_counter++;
-  if ( LPC_GPIO_GROUP_INT1->CTRL & (0x1<<0) )
-  {
-	if ( LPC_GPIO_GROUP_INT1->CTRL & (0x1<<2) )
-	{
-	  gint1_level_counter++;
-	}
-	else
-	{
-	  gint1_edge_counter++;
-	}
-	LPC_GPIO_GROUP_INT1->CTRL |= (0x1<<0);
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOInit
-**
-** Descriptions:		Initialize GPIO, install the
-**						GPIO interrupt handler
-**
-** parameters:			None
-**
-** Returned value:		true or false, return false if the VIC table
-**						is full and GPIO interrupt handler can be
-**						installed.
-**
-*****************************************************************************/
-void GPIOInit( void )
-{
-  /* Enable AHB clock to the GPIO domain. */
-  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
-
-  /* Enable AHB clock to the PinInt, GroupedInt domain. */
-  LPC_SYSCON->SYSAHBCLKCTRL |= ((1<<19) | (1<<23) | (1<<24));
-
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOSetPinInterrupt
-**
-** Descriptions:		Set interrupt sense, event, etc.
-**						sense: edge or level, 0 is edge, 1 is level
-**						event/polarity: 0 is active low/falling, 1 is high/rising.
-**
-** parameters:			channel #, port #, bit position, sense, event(polarity)
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOSetPinInterrupt( uint32_t channelNum, uint32_t portNum, uint32_t bitPosi,
-		uint32_t sense, uint32_t event )
-{
-  switch ( channelNum )
-  {
-	case CHANNEL0:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINSEL[0] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINSEL[0] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(PIN_INT0_IRQn);
-	break;
-	case CHANNEL1:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINSEL[1] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINSEL[1] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(PIN_INT1_IRQn);
-	break;
-	case CHANNEL2:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINSEL[2] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINSEL[2] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(PIN_INT2_IRQn);
-	break;
-	case CHANNEL3:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINSEL[3] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINSEL[3] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(PIN_INT3_IRQn);
-	break;
-	case CHANNEL4:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINSEL[4] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINSEL[4] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(PIN_INT4_IRQn);
-	break;
-	case CHANNEL5:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINSEL[5] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINSEL[5] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(PIN_INT5_IRQn);
-	break;
-	case CHANNEL6:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINSEL[6] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINSEL[6] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(PIN_INT6_IRQn);
-	break;
-	case CHANNEL7:
-	  if ( portNum )
-	  {
-		LPC_SYSCON->PINSEL[7] = bitPosi + 24;
-	  }
-	  else
-	  {
-		LPC_SYSCON->PINSEL[7] = bitPosi;
-	  }
-	  NVIC_EnableIRQ(PIN_INT7_IRQn);
-	break;
-	default:
-	  break;
-  }
-  if ( sense == 0 )
-  {
-	LPC_GPIO_PIN_INT->ISEL &= ~(0x1<<channelNum);	/* Edge trigger */
-	if ( event == 0 )
-	{
-	  LPC_GPIO_PIN_INT->IENF |= (0x1<<channelNum);	/* faling edge */
-	}
-	else
-	{
-	  LPC_GPIO_PIN_INT->IENR |= (0x1<<channelNum);	/* Rising edge */
-	}
-  }
-  else
-  {
-	LPC_GPIO_PIN_INT->ISEL |= (0x1<<channelNum);	/* Level trigger. */
-	LPC_GPIO_PIN_INT->IENR |= (0x1<<channelNum);	/* Level enable */
-	if ( event == 0 )
-	{
-	  LPC_GPIO_PIN_INT->IENF &= ~(0x1<<channelNum);	/* active-low */
-	}
-	else
-	{
-	  LPC_GPIO_PIN_INT->IENF |= (0x1<<channelNum);	/* active-high */
-	}
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOPinIntEnable
-**
-** Descriptions:		Enable Interrupt
-**
-** parameters:			channel num, event(0 is falling edge, 1 is rising edge)
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOPinIntEnable( uint32_t channelNum, uint32_t event )
-{
-  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
-  {
-	if ( event == 0 )
-	{
-	  LPC_GPIO_PIN_INT->SIENF |= (0x1<<channelNum);	/* faling edge */
-	}
-	else
-	{
-	  LPC_GPIO_PIN_INT->SIENR |= (0x1<<channelNum);	/* Rising edge */
-	}
-  }
-  else
-  {
-	LPC_GPIO_PIN_INT->SIENR |= (0x1<<channelNum);	/* Level */
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOPinIntDisable
-**
-** Descriptions:		Disable Interrupt
-**
-** parameters:			channel num, event(0 is falling edge, 1 is rising edge)
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOPinIntDisable( uint32_t channelNum, uint32_t event )
-{
-  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
-  {
-	if ( event == 0 )
-	{
-	  LPC_GPIO_PIN_INT->CIENF |= (0x1<<channelNum);	/* faling edge */
-	}
-	else
-	{
-	  LPC_GPIO_PIN_INT->CIENR |= (0x1<<channelNum);	/* Rising edge */
-	}
-  }
-  else
-  {
-	LPC_GPIO_PIN_INT->CIENR |= (0x1<<channelNum);	/* Level */
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOPinIntStatus
-**
-** Descriptions:		Get Interrupt status
-**
-** parameters:			channel num
-**
-** Returned value:		None
-**
-*****************************************************************************/
-uint32_t GPIOPinIntStatus( uint32_t channelNum )
-{
-  if ( LPC_GPIO_PIN_INT->IST & (0x1<<channelNum) )
-  {
-	return( 1 );
-  }
-  else
-  {
-	return( 0 );
-  }
-}
-
-/*****************************************************************************
-** Function name:		GPIOPinIntClear
-**
-** Descriptions:		Clear Interrupt
-**
-** parameters:			channel num
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOPinIntClear( uint32_t channelNum )
-{
-  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
-  {
-	LPC_GPIO_PIN_INT->IST = (1<<channelNum);
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOSetGroupedInterrupt
-**
-** Descriptions:		Set interrupt logic, sense, eventPattern, etc.
-**						logic: AND or OR, 0 is OR, 1 is AND
-**						sensePattern: edge or level, 0 is edge, 1 is level
-**						event/polarity: 0 is active low/falling, 1 is high/rising.
-**
-** parameters:			group #, bit pattern, logic, sense, event(polarity) pattern
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOSetGroupedInterrupt( uint32_t groupNum, uint32_t *bitPattern, uint32_t logic,
-		uint32_t sense, uint32_t *eventPattern )
-{
-  switch ( groupNum )
-  {
-	case GROUP0:
-	  if ( sense == 0 )
-	  {
-		LPC_GPIO_GROUP_INT0->CTRL &= ~(0x1<<2);	/* Edge trigger */
-	  }
-	  else
-	  {
-		LPC_GPIO_GROUP_INT0->CTRL |= (0x1<<2);	/* Level trigger. */
-	  }
-	  if ( logic == 0 )
-	  {
-		LPC_GPIO_GROUP_INT0->CTRL &= ~(0x1<<1);	/* OR */
-	  }
-	  else
-	  {
-		LPC_GPIO_GROUP_INT0->CTRL |= (0x1<<1);	/* AND */
-	  }
-	  LPC_GPIO_GROUP_INT0->PORT_POL[0] = *((uint32_t *)(eventPattern + 0));
-	  LPC_GPIO_GROUP_INT0->PORT_POL[1] = *((uint32_t *)(eventPattern + 1));
-	  LPC_GPIO_GROUP_INT0->PORT_ENA[0] = *((uint32_t *)(bitPattern + 0));
-	  LPC_GPIO_GROUP_INT0->PORT_ENA[1] = *((uint32_t *)(bitPattern + 1));
-      /* as soon as enabled, an edge may be generated       */
-	  /* clear interrupt flag and NVIC pending interrupt to */
-	  /* workaround the potential edge generated as enabled */
-	  LPC_GPIO_GROUP_INT0->CTRL |= (1<<0);
-	  NVIC_ClearPendingIRQ(GINT0_IRQn);
-	  NVIC_EnableIRQ(GINT0_IRQn);
-	break;
-	case GROUP1:
-	  if ( sense == 0 )
-	  {
-		LPC_GPIO_GROUP_INT1->CTRL &= ~(0x1<<2);	/* Edge trigger */
-	  }
-	  else
-	  {
-		LPC_GPIO_GROUP_INT1->CTRL |= (0x1<<2);	/* Level trigger. */
-	  }
-	  if ( logic == 0 )
-	  {
-		LPC_GPIO_GROUP_INT1->CTRL &= ~(0x1<<1);	/* OR */
-	  }
-	  else
-	  {
-		LPC_GPIO_GROUP_INT1->CTRL |= (0x1<<1);	/* AND */
-	  }
-	  LPC_GPIO_GROUP_INT1->PORT_POL[0] = *((uint32_t *)(eventPattern + 0));
-	  LPC_GPIO_GROUP_INT1->PORT_POL[1] = *((uint32_t *)(eventPattern + 1));
-	  LPC_GPIO_GROUP_INT1->PORT_ENA[0] = *((uint32_t *)(bitPattern + 0));
-	  LPC_GPIO_GROUP_INT1->PORT_ENA[1] = *((uint32_t *)(bitPattern + 1));
-      /* as soon as enabled, an edge may be generated       */
-	  /* clear interrupt flag and NVIC pending interrupt to */
-	  /* workaround the potential edge generated as enabled */
-	  LPC_GPIO_GROUP_INT1->CTRL |= (1<<0);
-	  NVIC_ClearPendingIRQ(GINT1_IRQn);
-	  NVIC_EnableIRQ(GINT1_IRQn);
-	break;
-	default:
-	  break;
-  }
-
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOGetPinValue
-**
-** Descriptions:		Read Current state of port pin, PIN register value
-**
-** parameters:			port num, bit position
-** Returned value:		None
-**
-*****************************************************************************/
-uint32_t GPIOGetPinValue( uint32_t portNum, uint32_t bitPosi )
-{
-  uint32_t regVal = 0;
-
-  if( bitPosi < 0x20 )
-  {
-	if ( LPC_GPIO->PIN[portNum] & (0x1<<bitPosi) )
-	{
-	  regVal = 1;
-	}
-  }
-  else if( bitPosi == 0xFF )
-  {
-	regVal = LPC_GPIO->PIN[portNum];
-  }
-  return ( regVal );
-}
-
-/*****************************************************************************
-** Function name:		GPIOSetBitValue
-**
-** Descriptions:		Set/clear a bit in a specific position
-**
-** parameters:			port num, bit position, bit value
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOSetBitValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal )
-{
-  if ( bitVal )
-  {
-	LPC_GPIO->SET[portNum] = 1<<bitPosi;
-  }
-  else
-  {
-	LPC_GPIO->CLR[portNum] = 1<<bitPosi;
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		GPIOSetDir
-**
-** Descriptions:		Set the direction in GPIO port
-**
-** parameters:			portNum, bit position, direction (1 out, 0 input)
-**
-** Returned value:		None
-**
-*****************************************************************************/
-void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir )
-{
-  if( dir )
-  {
-	LPC_GPIO->DIR[portNum] |= (1<<bitPosi);
-  }
-  else
-  {
-	LPC_GPIO->DIR[portNum] &= ~(1<<bitPosi);
-  }
-  return;
-}
-
-/******************************************************************************
-**                            End Of File
-******************************************************************************/
+/****************************************************************************
+ *   $Id:: gpio.c 6874 2011-03-22 01:58:31Z usb00423                        $
+ *   Project: NXP LPC13Uxx GPIO example
+ *
+ *   Description:
+ *     This file contains GPIO code example which include GPIO
+ *     initialization, GPIO interrupt handler, and related APIs for
+ *     GPIO access.
+ *
+ ****************************************************************************
+* 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.
+* Permission to use, copy, modify, and distribute this software and its
+* documentation is hereby granted, under NXP Semiconductors'
+* relevant copyright in the software, without fee, provided that it
+* is used in conjunction with NXP Semiconductors microcontrollers.  This
+* copyright, permission, and disclaimer notice must appear in all copies of
+* this code.
+****************************************************************************/
+#include "LPC13Uxx.h"			/* LPC13Uxx Peripheral Registers */
+#include "gpio.h"
+
+volatile uint32_t pin_int0_counter = 0;
+volatile uint32_t pin_int1_counter = 0;
+volatile uint32_t pin_int2_counter = 0;
+volatile uint32_t pin_int3_counter = 0;
+volatile uint32_t pin_int4_counter = 0;
+volatile uint32_t pin_int5_counter = 0;
+volatile uint32_t pin_int6_counter = 0;
+volatile uint32_t pin_int7_counter = 0;
+volatile uint32_t gint0_counter = 0;
+volatile uint32_t gint1_counter = 0;
+volatile uint32_t pin_int0_level_counter = 0;
+volatile uint32_t pin_int0_rising_edge_counter = 0;
+volatile uint32_t pin_int0_falling_edge_counter = 0;
+volatile uint32_t pin_int1_level_counter = 0;
+volatile uint32_t pin_int1_rising_edge_counter = 0;
+volatile uint32_t pin_int1_falling_edge_counter = 0;
+volatile uint32_t pin_int2_level_counter = 0;
+volatile uint32_t pin_int2_rising_edge_counter = 0;
+volatile uint32_t pin_int2_falling_edge_counter = 0;
+volatile uint32_t pin_int3_level_counter = 0;
+volatile uint32_t pin_int3_rising_edge_counter = 0;
+volatile uint32_t pin_int3_falling_edge_counter = 0;
+volatile uint32_t pin_int4_level_counter = 0;
+volatile uint32_t pin_int4_rising_edge_counter = 0;
+volatile uint32_t pin_int4_falling_edge_counter = 0;
+volatile uint32_t pin_int5_level_counter = 0;
+volatile uint32_t pin_int5_rising_edge_counter = 0;
+volatile uint32_t pin_int5_falling_edge_counter = 0;
+volatile uint32_t pin_int6_level_counter = 0;
+volatile uint32_t pin_int6_rising_edge_counter = 0;
+volatile uint32_t pin_int6_falling_edge_counter = 0;
+volatile uint32_t pin_int7_level_counter = 0;
+volatile uint32_t pin_int7_rising_edge_counter = 0;
+volatile uint32_t pin_int7_falling_edge_counter = 0;
+volatile uint32_t gint0_level_counter = 0;
+volatile uint32_t gint0_edge_counter = 0;
+volatile uint32_t gint1_level_counter = 0;
+volatile uint32_t gint1_edge_counter = 0;
+
+/*****************************************************************************
+** Function name:		PIN_INT0_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void PIN_INT0_IRQHandler(void)
+{
+  pin_int0_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<0) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<0) )
+	{
+	  pin_int0_level_counter++;
+	}
+	else
+	{
+	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<0) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<0) ) )
+	  {
+		pin_int0_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<0;
+	  }
+	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<0) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<0) ) )
+	  {
+		pin_int0_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<0;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<0;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		PIN_INT1_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void PIN_INT1_IRQHandler(void)
+{
+  pin_int1_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<1) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<1) )
+	{
+	  pin_int1_level_counter++;
+	}
+	else
+	{
+	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<1) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<1) ) )
+	  {
+		pin_int1_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<1;
+	  }
+	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<1) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<1) ) )
+	  {
+		pin_int1_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<1;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<1;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		PIN_INT2_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void PIN_INT2_IRQHandler(void)
+{
+  pin_int2_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<2) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<2) )
+	{
+	  pin_int2_level_counter++;
+	}
+	else
+	{
+	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<2) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<2) ) )
+	  {
+		pin_int2_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<2;
+	  }
+	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<2) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<2) ) )
+	  {
+		pin_int2_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<2;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<2;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		PIN_INT3_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void PIN_INT3_IRQHandler(void)
+{
+  pin_int3_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<3) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<3) )
+	{
+	  pin_int3_level_counter++;
+	}
+	else
+	{
+	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<3) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<3) ) )
+	  {
+		pin_int3_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<3;
+	  }
+	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<3) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<3) ) )
+	  {
+		pin_int3_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<3;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<3;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		PIN_INT4_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void PIN_INT4_IRQHandler(void)
+{
+  pin_int4_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<4) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<4) )
+	{
+	  pin_int4_level_counter++;
+	}
+	else
+	{
+	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<4) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<4) ) )
+	  {
+		pin_int4_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<4;
+	  }
+	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<4) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<4) ) )
+	  {
+		pin_int4_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<4;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<4;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		PIN_INT5_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void PIN_INT5_IRQHandler(void)
+{
+  pin_int5_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<5) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<5) )
+	{
+	  pin_int5_level_counter++;
+	}
+	else
+	{
+	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<5) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<5) ) )
+	  {
+		pin_int5_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<5;
+	  }
+	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<5) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<5) ) )
+	  {
+		pin_int5_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<5;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<5;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		PIN_INT6_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void PIN_INT6_IRQHandler(void)
+{
+  pin_int6_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<6) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<6) )
+	{
+	  pin_int6_level_counter++;
+	}
+	else
+	{
+	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<6) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<6) ) )
+	  {
+		pin_int6_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<6;
+	  }
+	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<6) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<6) ) )
+	  {
+		pin_int6_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<6;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<6;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		PIN_INT7_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void PIN_INT7_IRQHandler(void)
+{
+  pin_int7_counter++;
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<7) )
+  {
+	if ( LPC_GPIO_PIN_INT->ISEL & (0x1<<7) )
+	{
+	  pin_int7_level_counter++;
+	}
+	else
+	{
+	  if ( ( LPC_GPIO_PIN_INT->RISE & (0x1<<7) ) && ( LPC_GPIO_PIN_INT->IENR & (0x1<<7) ) )
+	  {
+		pin_int7_rising_edge_counter++;
+		LPC_GPIO_PIN_INT->RISE = 0x1<<7;
+	  }
+	  if ( ( LPC_GPIO_PIN_INT->FALL & (0x1<<7) ) && ( LPC_GPIO_PIN_INT->IENF & (0x1<<7) ) )
+	  {
+		pin_int7_falling_edge_counter++;
+		LPC_GPIO_PIN_INT->FALL = 0x1<<7;
+	  }
+	  LPC_GPIO_PIN_INT->IST = 0x1<<7;
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GINT0_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GINT0_IRQHandler(void)
+{
+  gint0_counter++;
+  if ( LPC_GPIO_GROUP_INT0->CTRL & (0x1<<0) )
+  {
+	if ( LPC_GPIO_GROUP_INT0->CTRL & (0x1<<2) )
+	{
+	  gint0_level_counter++;
+	}
+	else
+	{
+	  gint0_edge_counter++;
+	}
+	LPC_GPIO_GROUP_INT0->CTRL |= (0x1<<0);
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GINT1_IRQHandler
+**
+** Descriptions:		Use one GPIO pin as interrupt source
+**
+** parameters:			None
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GINT1_IRQHandler(void)
+{
+  gint1_counter++;
+  if ( LPC_GPIO_GROUP_INT1->CTRL & (0x1<<0) )
+  {
+	if ( LPC_GPIO_GROUP_INT1->CTRL & (0x1<<2) )
+	{
+	  gint1_level_counter++;
+	}
+	else
+	{
+	  gint1_edge_counter++;
+	}
+	LPC_GPIO_GROUP_INT1->CTRL |= (0x1<<0);
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOInit
+**
+** Descriptions:		Initialize GPIO, install the
+**						GPIO interrupt handler
+**
+** parameters:			None
+**
+** Returned value:		true or false, return false if the VIC table
+**						is full and GPIO interrupt handler can be
+**						installed.
+**
+*****************************************************************************/
+void GPIOInit( void )
+{
+  /* Enable AHB clock to the GPIO domain. */
+  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
+
+  /* Enable AHB clock to the PinInt, GroupedInt domain. */
+  LPC_SYSCON->SYSAHBCLKCTRL |= ((1<<19) | (1<<23) | (1<<24));
+
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOSetPinInterrupt
+**
+** Descriptions:		Set interrupt sense, event, etc.
+**						sense: edge or level, 0 is edge, 1 is level
+**						event/polarity: 0 is active low/falling, 1 is high/rising.
+**
+** parameters:			channel #, port #, bit position, sense, event(polarity)
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOSetPinInterrupt( uint32_t channelNum, uint32_t portNum, uint32_t bitPosi,
+		uint32_t sense, uint32_t event )
+{
+  switch ( channelNum )
+  {
+	case CHANNEL0:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINSEL[0] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINSEL[0] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(PIN_INT0_IRQn);
+	break;
+	case CHANNEL1:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINSEL[1] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINSEL[1] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(PIN_INT1_IRQn);
+	break;
+	case CHANNEL2:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINSEL[2] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINSEL[2] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(PIN_INT2_IRQn);
+	break;
+	case CHANNEL3:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINSEL[3] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINSEL[3] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(PIN_INT3_IRQn);
+	break;
+	case CHANNEL4:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINSEL[4] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINSEL[4] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(PIN_INT4_IRQn);
+	break;
+	case CHANNEL5:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINSEL[5] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINSEL[5] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(PIN_INT5_IRQn);
+	break;
+	case CHANNEL6:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINSEL[6] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINSEL[6] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(PIN_INT6_IRQn);
+	break;
+	case CHANNEL7:
+	  if ( portNum )
+	  {
+		LPC_SYSCON->PINSEL[7] = bitPosi + 24;
+	  }
+	  else
+	  {
+		LPC_SYSCON->PINSEL[7] = bitPosi;
+	  }
+	  NVIC_EnableIRQ(PIN_INT7_IRQn);
+	break;
+	default:
+	  break;
+  }
+  if ( sense == 0 )
+  {
+	LPC_GPIO_PIN_INT->ISEL &= ~(0x1<<channelNum);	/* Edge trigger */
+	if ( event == 0 )
+	{
+	  LPC_GPIO_PIN_INT->IENF |= (0x1<<channelNum);	/* faling edge */
+	}
+	else
+	{
+	  LPC_GPIO_PIN_INT->IENR |= (0x1<<channelNum);	/* Rising edge */
+	}
+  }
+  else
+  {
+	LPC_GPIO_PIN_INT->ISEL |= (0x1<<channelNum);	/* Level trigger. */
+	LPC_GPIO_PIN_INT->IENR |= (0x1<<channelNum);	/* Level enable */
+	if ( event == 0 )
+	{
+	  LPC_GPIO_PIN_INT->IENF &= ~(0x1<<channelNum);	/* active-low */
+	}
+	else
+	{
+	  LPC_GPIO_PIN_INT->IENF |= (0x1<<channelNum);	/* active-high */
+	}
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOPinIntEnable
+**
+** Descriptions:		Enable Interrupt
+**
+** parameters:			channel num, event(0 is falling edge, 1 is rising edge)
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOPinIntEnable( uint32_t channelNum, uint32_t event )
+{
+  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
+  {
+	if ( event == 0 )
+	{
+	  LPC_GPIO_PIN_INT->SIENF |= (0x1<<channelNum);	/* faling edge */
+	}
+	else
+	{
+	  LPC_GPIO_PIN_INT->SIENR |= (0x1<<channelNum);	/* Rising edge */
+	}
+  }
+  else
+  {
+	LPC_GPIO_PIN_INT->SIENR |= (0x1<<channelNum);	/* Level */
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOPinIntDisable
+**
+** Descriptions:		Disable Interrupt
+**
+** parameters:			channel num, event(0 is falling edge, 1 is rising edge)
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOPinIntDisable( uint32_t channelNum, uint32_t event )
+{
+  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
+  {
+	if ( event == 0 )
+	{
+	  LPC_GPIO_PIN_INT->CIENF |= (0x1<<channelNum);	/* faling edge */
+	}
+	else
+	{
+	  LPC_GPIO_PIN_INT->CIENR |= (0x1<<channelNum);	/* Rising edge */
+	}
+  }
+  else
+  {
+	LPC_GPIO_PIN_INT->CIENR |= (0x1<<channelNum);	/* Level */
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOPinIntStatus
+**
+** Descriptions:		Get Interrupt status
+**
+** parameters:			channel num
+**
+** Returned value:		None
+**
+*****************************************************************************/
+uint32_t GPIOPinIntStatus( uint32_t channelNum )
+{
+  if ( LPC_GPIO_PIN_INT->IST & (0x1<<channelNum) )
+  {
+	return( 1 );
+  }
+  else
+  {
+	return( 0 );
+  }
+}
+
+/*****************************************************************************
+** Function name:		GPIOPinIntClear
+**
+** Descriptions:		Clear Interrupt
+**
+** parameters:			channel num
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOPinIntClear( uint32_t channelNum )
+{
+  if ( !( LPC_GPIO_PIN_INT->ISEL & (0x1<<channelNum) ) )
+  {
+	LPC_GPIO_PIN_INT->IST = (1<<channelNum);
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOSetGroupedInterrupt
+**
+** Descriptions:		Set interrupt logic, sense, eventPattern, etc.
+**						logic: AND or OR, 0 is OR, 1 is AND
+**						sensePattern: edge or level, 0 is edge, 1 is level
+**						event/polarity: 0 is active low/falling, 1 is high/rising.
+**
+** parameters:			group #, bit pattern, logic, sense, event(polarity) pattern
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOSetGroupedInterrupt( uint32_t groupNum, uint32_t *bitPattern, uint32_t logic,
+		uint32_t sense, uint32_t *eventPattern )
+{
+  switch ( groupNum )
+  {
+	case GROUP0:
+	  if ( sense == 0 )
+	  {
+		LPC_GPIO_GROUP_INT0->CTRL &= ~(0x1<<2);	/* Edge trigger */
+	  }
+	  else
+	  {
+		LPC_GPIO_GROUP_INT0->CTRL |= (0x1<<2);	/* Level trigger. */
+	  }
+	  if ( logic == 0 )
+	  {
+		LPC_GPIO_GROUP_INT0->CTRL &= ~(0x1<<1);	/* OR */
+	  }
+	  else
+	  {
+		LPC_GPIO_GROUP_INT0->CTRL |= (0x1<<1);	/* AND */
+	  }
+	  LPC_GPIO_GROUP_INT0->PORT_POL[0] = *((uint32_t *)(eventPattern + 0));
+	  LPC_GPIO_GROUP_INT0->PORT_POL[1] = *((uint32_t *)(eventPattern + 1));
+	  LPC_GPIO_GROUP_INT0->PORT_ENA[0] = *((uint32_t *)(bitPattern + 0));
+	  LPC_GPIO_GROUP_INT0->PORT_ENA[1] = *((uint32_t *)(bitPattern + 1));
+      /* as soon as enabled, an edge may be generated       */
+	  /* clear interrupt flag and NVIC pending interrupt to */
+	  /* workaround the potential edge generated as enabled */
+	  LPC_GPIO_GROUP_INT0->CTRL |= (1<<0);
+	  NVIC_ClearPendingIRQ(GINT0_IRQn);
+	  NVIC_EnableIRQ(GINT0_IRQn);
+	break;
+	case GROUP1:
+	  if ( sense == 0 )
+	  {
+		LPC_GPIO_GROUP_INT1->CTRL &= ~(0x1<<2);	/* Edge trigger */
+	  }
+	  else
+	  {
+		LPC_GPIO_GROUP_INT1->CTRL |= (0x1<<2);	/* Level trigger. */
+	  }
+	  if ( logic == 0 )
+	  {
+		LPC_GPIO_GROUP_INT1->CTRL &= ~(0x1<<1);	/* OR */
+	  }
+	  else
+	  {
+		LPC_GPIO_GROUP_INT1->CTRL |= (0x1<<1);	/* AND */
+	  }
+	  LPC_GPIO_GROUP_INT1->PORT_POL[0] = *((uint32_t *)(eventPattern + 0));
+	  LPC_GPIO_GROUP_INT1->PORT_POL[1] = *((uint32_t *)(eventPattern + 1));
+	  LPC_GPIO_GROUP_INT1->PORT_ENA[0] = *((uint32_t *)(bitPattern + 0));
+	  LPC_GPIO_GROUP_INT1->PORT_ENA[1] = *((uint32_t *)(bitPattern + 1));
+      /* as soon as enabled, an edge may be generated       */
+	  /* clear interrupt flag and NVIC pending interrupt to */
+	  /* workaround the potential edge generated as enabled */
+	  LPC_GPIO_GROUP_INT1->CTRL |= (1<<0);
+	  NVIC_ClearPendingIRQ(GINT1_IRQn);
+	  NVIC_EnableIRQ(GINT1_IRQn);
+	break;
+	default:
+	  break;
+  }
+
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOGetPinValue
+**
+** Descriptions:		Read Current state of port pin, PIN register value
+**
+** parameters:			port num, bit position
+** Returned value:		None
+**
+*****************************************************************************/
+uint32_t GPIOGetPinValue( uint32_t portNum, uint32_t bitPosi )
+{
+  uint32_t regVal = 0;
+
+  if( bitPosi < 0x20 )
+  {
+	if ( LPC_GPIO->PIN[portNum] & (0x1<<bitPosi) )
+	{
+	  regVal = 1;
+	}
+  }
+  else if( bitPosi == 0xFF )
+  {
+	regVal = LPC_GPIO->PIN[portNum];
+  }
+  return ( regVal );
+}
+
+/*****************************************************************************
+** Function name:		GPIOSetBitValue
+**
+** Descriptions:		Set/clear a bit in a specific position
+**
+** parameters:			port num, bit position, bit value
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOSetBitValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal )
+{
+  if ( bitVal )
+  {
+	LPC_GPIO->SET[portNum] = 1<<bitPosi;
+  }
+  else
+  {
+	LPC_GPIO->CLR[portNum] = 1<<bitPosi;
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		GPIOSetDir
+**
+** Descriptions:		Set the direction in GPIO port
+**
+** parameters:			portNum, bit position, direction (1 out, 0 input)
+**
+** Returned value:		None
+**
+*****************************************************************************/
+void GPIOSetDir( uint32_t portNum, uint32_t bitPosi, uint32_t dir )
+{
+  if( dir )
+  {
+	LPC_GPIO->DIR[portNum] |= (1<<bitPosi);
+  }
+  else
+  {
+	LPC_GPIO->DIR[portNum] &= ~(1<<bitPosi);
+  }
+  return;
+}
+
+/******************************************************************************
+**                            End Of File
+******************************************************************************/

+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/src/nmi.c → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/nmi.c


+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/src/timer16.c → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/timer16.c


+ 0 - 0
mcu/lpc13uxx/LPC13Uxx_DriverLib/src/timer32.c → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/timer32.c


+ 437 - 437
mcu/lpc13uxx/LPC13Uxx_DriverLib/src/uart.c → hw/mcu/lpc13uxx/LPC13Uxx_DriverLib/src/uart.c

@@ -1,437 +1,437 @@
-/****************************************************************************
- *   $Id:: uart.c 7125 2011-04-15 00:22:12Z usb01267                        $
- *   Project: NXP LPC13Uxx UART example
- *
- *   Description:
- *     This file contains UART code example which include UART
- *     initialization, UART interrupt handler, and related APIs for
- *     UART access.
- *
- ****************************************************************************
-* 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.
-* Permission to use, copy, modify, and distribute this software and its
-* documentation is hereby granted, under NXP Semiconductors'
-* relevant copyright in the software, without fee, provided that it
-* is used in conjunction with NXP Semiconductors microcontrollers.  This
-* copyright, permission, and disclaimer notice must appear in all copies of
-* this code.
-****************************************************************************/
-#include "LPC13Uxx.h"
-#include "type.h"
-#include "uart.h"
-
-volatile uint32_t UARTStatus;
-volatile uint8_t  UARTTxEmpty = 1;
-volatile uint8_t  UARTBuffer[BUFSIZE];
-volatile uint32_t UARTCount = 0;
-
-#if AUTOBAUD_ENABLE
-volatile uint32_t UARTAutoBaud = 0, AutoBaudTimeout = 0;
-#endif
-
-/*****************************************************************************
-** Function name:		USART_IRQHandler
-**
-** Descriptions:		USART interrupt handler
-**
-** parameters:			None
-** Returned value:		None
-**
-*****************************************************************************/
-void USART_IRQHandler(void)
-{
-  uint8_t IIRValue, LSRValue;
-  uint8_t Dummy = Dummy;
-
-  IIRValue = LPC_USART->IIR;
-
-  IIRValue >>= 1;			/* skip pending bit in IIR */
-  IIRValue &= 0x07;			/* check bit 1~3, interrupt identification */
-  if (IIRValue == IIR_RLS)		/* Receive Line Status */
-  {
-    LSRValue = LPC_USART->LSR;
-    /* Receive Line Status */
-    if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))
-    {
-      /* There are errors or break interrupt */
-      /* Read LSR will clear the interrupt */
-      UARTStatus = LSRValue;
-      Dummy = LPC_USART->RBR;	/* Dummy read on RX to clear
-								interrupt, then bail out */
-      return;
-    }
-    if (LSRValue & LSR_RDR)	/* Receive Data Ready */
-    {
-      /* If no error on RLS, normal ready, save into the data buffer. */
-      /* Note: read RBR will clear the interrupt */
-      UARTBuffer[UARTCount++] = LPC_USART->RBR;
-      if (UARTCount == BUFSIZE)
-      {
-        UARTCount = 0;		/* buffer overflow */
-      }
-    }
-  }
-  else if (IIRValue == IIR_RDA)	/* Receive Data Available */
-  {
-    /* Receive Data Available */
-    UARTBuffer[UARTCount++] = LPC_USART->RBR;
-    if (UARTCount == BUFSIZE)
-    {
-      UARTCount = 0;		/* buffer overflow */
-    }
-  }
-  else if (IIRValue == IIR_CTI)	/* Character timeout indicator */
-  {
-    /* Character Time-out indicator */
-    UARTStatus |= 0x100;		/* Bit 9 as the CTI error */
-  }
-  else if (IIRValue == IIR_THRE)	/* THRE, transmit holding register empty */
-  {
-    /* THRE interrupt */
-    LSRValue = LPC_USART->LSR;		/* Check status in the LSR to see if
-								valid data in U0THR or not */
-    if (LSRValue & LSR_THRE)
-    {
-      UARTTxEmpty = 1;
-    }
-    else
-    {
-      UARTTxEmpty = 0;
-    }
-  }
-#if AUTOBAUD_ENABLE
-  if (LPC_USART->IIR & IIR_ABEO) /* End of Auto baud */
-  {
-	LPC_USART->IER &= ~IIR_ABEO;
-	/* clear bit ABEOInt in the IIR by set ABEOIntClr in the ACR register */
-	LPC_USART->ACR |= IIR_ABEO;
-	UARTAutoBaud = 1;
-  }
-  else if (LPC_USART->IIR & IIR_ABTO)/* Auto baud time out */
-  {
-	LPC_USART->IER &= ~IIR_ABTO;
-	AutoBaudTimeout = 1;
-	/* clear bit ABTOInt in the IIR by set ABTOIntClr in the ACR register */
-	LPC_USART->ACR |= IIR_ABTO;
-  }
-#endif
-  return;
-}
-
-#if MODEM_TEST
-/*****************************************************************************
-** Function name:		ModemInit
-**
-** Descriptions:		Initialize UART0 port as modem, setup pin select.
-**
-** parameters:			None
-** Returned value:		None
-**
-*****************************************************************************/
-void ModemInit( void )
-{
-
-  LPC_IOCON->PIO0_7 &= ~0x07;     /* UART I/O config */
-  LPC_IOCON->PIO0_7 |= 0x01;      /* UART CTS */
-  LPC_IOCON->PIO0_17 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO0_17 |= 0x01;     /* UART RTS */
-#if 1
-  LPC_IOCON->PIO1_13 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO1_13 |= 0x01;     /* UART DTR */
-  LPC_IOCON->PIO1_14 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO1_14 |= 0x01;     /* UART DSR */
-  LPC_IOCON->PIO1_15 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO1_15 |= 0x01;     /* UART DCD */
-  LPC_IOCON->PIO1_16 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO1_16 |= 0x01;     /* UART RI */
-
-#else
-  LPC_IOCON->PIO1_19 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO1_19 |= 0x01;     /* UART DTR */
-  LPC_IOCON->PIO1_20 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO1_20 |= 0x01;     /* UART DSR */
-  LPC_IOCON->PIO1_21 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO1_21 |= 0x01;     /* UART DCD */
-  LPC_IOCON->PIO1_22 &= ~0x07;    /* UART I/O config */
-  LPC_IOCON->PIO1_22 |= 0x01;     /* UART RI */
-#endif
-  LPC_USART->MCR = 0xC0;          /* Enable Auto RTS and Auto CTS. */
-  return;
-}
-#endif
-
-/***********************************************************************
- *
- * Function: uart_set_divisors
- *
- * Purpose: Determines best dividers to get a target clock rate
- *
- * Processing:
- *     See function.
- *
- * Parameters:
- *     UARTClk    : UART clock
- *     baudrate   : Desired UART baud rate
- *
- * Outputs:
- *	  baudrate : Sets the estimated buadrate value in DLL, DLM, and FDR.
- *
- * Returns: Error status.
- *
- * Notes: None
- *
- **********************************************************************/
-uint32_t uart_set_divisors(uint32_t UARTClk, uint32_t baudrate)
-{
-  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 */
-  uClk = UARTClk >> 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 / 30))
-  {
-    /* Set the `Divisor Latch Access Bit` and enable so the DLL/DLM access*/
-    /* Initialise the `Divisor latch LSB` and `Divisor latch MSB` registers */
-    LPC_USART->DLM = (diviserOptimal >> 8) & 0xFF;
-    LPC_USART->DLL = diviserOptimal & 0xFF;
-
-    /* Initialise the Fractional Divider Register */
-    LPC_USART->FDR = ((mulFracDivOptimal & 0xF) << 4) | (dividerAddOptimal & 0xF);
-    return( TRUE );
-  }
-  return ( FALSE );
-}
-
-/*****************************************************************************
-** Function name:		UARTInit
-**
-** Descriptions:		Initialize UART0 port, setup pin select,
-**				clock, parity, stop bits, FIFO, etc.
-**
-** parameters:			UART baudrate
-** Returned value:		None
-**
-*****************************************************************************/
-void UARTInit(uint32_t baudrate)
-{
-#if !AUTOBAUD_ENABLE
-  uint32_t Fdiv;
-#endif
-  volatile uint32_t regVal;
-
-  UARTTxEmpty = 1;
-  UARTCount = 0;
-
-  NVIC_DisableIRQ(USART_IRQn);
-  /* Select only one location from below. */
-#if 1
-  LPC_IOCON->PIO0_18 &= ~0x07;    /*  UART I/O config */
-  LPC_IOCON->PIO0_18 |= 0x01;     /* UART RXD */
-  LPC_IOCON->PIO0_19 &= ~0x07;
-  LPC_IOCON->PIO0_19 |= 0x01;     /* UART TXD */
-#endif
-#if 0
-  LPC_IOCON->PIO1_14 &= ~0x07;    /*  UART I/O config */
-  LPC_IOCON->PIO1_14 |= 0x03;     /* UART RXD */
-  LPC_IOCON->PIO1_13 &= ~0x07;
-  LPC_IOCON->PIO1_13 |= 0x03;     /* UART TXD */
-#endif
-#if 0
-  LPC_IOCON->PIO1_17 &= ~0x07;    /*  UART I/O config */
-  LPC_IOCON->PIO1_17 |= 0x02;     /* UART RXD */
-  LPC_IOCON->PIO1_18 &= ~0x07;
-  LPC_IOCON->PIO1_18 |= 0x02;     /* UART TXD */
-#endif
-#if 0
-  LPC_IOCON->PIO1_26 &= ~0x07;    /*  UART I/O config */
-  LPC_IOCON->PIO1_26 |= 0x02;     /* UART RXD */
-  LPC_IOCON->PIO1_27 &= ~0x07;
-  LPC_IOCON->PIO1_27 |= 0x02;     /* UART TXD */
-#endif
-
-  /* Enable UART clock */
-  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);
-  LPC_SYSCON->UARTCLKDIV = 0x1;     /* divided by 1 */
-
-  LPC_USART->LCR = 0x83;            /* 8 bits, no Parity, 1 Stop bit */
-#if !AUTOBAUD_ENABLE
-#if FDR_CALIBRATION
-	if ( uart_set_divisors(SystemCoreClock/LPC_SYSCON->UARTCLKDIV, baudrate) != TRUE )
-	{
-      Fdiv = ((SystemCoreClock/LPC_SYSCON->UARTCLKDIV)/16)/baudrate ;	/*baud rate */
-      LPC_USART->DLM = Fdiv / 256;
-      LPC_USART->DLL = Fdiv % 256;
-	  LPC_USART->FDR = 0x10;		/* Default */
-	}
-#else
-    Fdiv = ((SystemCoreClock/LPC_SYSCON->UARTCLKDIV)/16)/baudrate ;	/*baud rate */
-    LPC_USART->DLM = Fdiv / 256;
-    LPC_USART->DLL = Fdiv % 256;
-	LPC_USART->FDR = 0x10;		/* Default */
-#endif
-#endif
-  LPC_USART->LCR = 0x03;		/* DLAB = 0 */
-  LPC_USART->FCR = 0x07;		/* Enable and reset TX and RX FIFO. */
-
-  /* Read to clear the line status. */
-  regVal = LPC_USART->LSR;
-
-  /* Ensure a clean start, no data in either TX or RX FIFO. */
-  while (( LPC_USART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) );
-  while ( LPC_USART->LSR & LSR_RDR )
-  {
-	regVal = LPC_USART->RBR;	/* Dump data from RX FIFO */
-  }
-
-  /* Enable the UART Interrupt */
-  NVIC_EnableIRQ(USART_IRQn);
-
-#if TX_INTERRUPT
-  LPC_USART->IER = IER_RBR | IER_THRE | IER_RLS;	/* Enable UART interrupt */
-#else
-  LPC_USART->IER = IER_RBR | IER_RLS;	/* Enable UART interrupt */
-#endif
-#if AUTOBAUD_ENABLE
-    LPC_USART->IER |= IER_ABEO | IER_ABTO;
-#endif
-  return;
-}
-
-/*****************************************************************************
-** Function name:		UARTSend
-**
-** Descriptions:		Send a block of data to the UART 0 port based
-**				on the data length
-**
-** parameters:		buffer pointer, and data length
-** Returned value:	None
-**
-*****************************************************************************/
-void UARTSend(uint8_t *BufferPtr, uint32_t Length)
-{
-
-  while ( Length != 0 )
-  {
-	  /* THRE status, contain valid data */
-#if !TX_INTERRUPT
-	  while ( !(LPC_USART->LSR & LSR_THRE) );
-	  LPC_USART->THR = *BufferPtr;
-#else
-	  /* Below flag is set inside the interrupt handler when THRE occurs. */
-      while ( !(UARTTxEmpty & 0x01) );
-	  LPC_USART->THR = *BufferPtr;
-      UARTTxEmpty = 0;	/* not empty in the THR until it shifts out */
-#endif
-      BufferPtr++;
-      Length--;
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		print_string
-**
-** Descriptions:		print out string on the terminal
-**
-** parameters:			pointer to the string end with NULL char.
-** Returned value:		none.
-**
-*****************************************************************************/
-void print_string( uint8_t *str_ptr )
-{
-  while(*str_ptr != 0x00)
-  {
-    while((LPC_USART->LSR & 0x60) != 0x60);
-    LPC_USART->THR = *str_ptr;
-    str_ptr++;
-  }
-  return;
-}
-
-/*****************************************************************************
-** Function name:		get_key
-**
-** Descriptions:		Get a character from the terminal
-**
-** parameters:			None
-** Returned value:		character, zero is none.
-**
-*****************************************************************************/
-uint8_t get_key( void )
-{
-  uint8_t dummy;
-
-  while ( !(LPC_USART->LSR & 0x01) );
-  dummy = LPC_USART->RBR;
-  if ((dummy>=65) && (dummy<=90))
-  {
-	/* convert capital to non-capital character, A2a, B2b, C2c. */
-	dummy +=32;
-  }
-  /* echo */
-  LPC_USART->THR = dummy;
-  return(dummy);
-}
-
-/******************************************************************************
-**                            End Of File
-******************************************************************************/
+/****************************************************************************
+ *   $Id:: uart.c 7125 2011-04-15 00:22:12Z usb01267                        $
+ *   Project: NXP LPC13Uxx UART example
+ *
+ *   Description:
+ *     This file contains UART code example which include UART
+ *     initialization, UART interrupt handler, and related APIs for
+ *     UART access.
+ *
+ ****************************************************************************
+* 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.
+* Permission to use, copy, modify, and distribute this software and its
+* documentation is hereby granted, under NXP Semiconductors'
+* relevant copyright in the software, without fee, provided that it
+* is used in conjunction with NXP Semiconductors microcontrollers.  This
+* copyright, permission, and disclaimer notice must appear in all copies of
+* this code.
+****************************************************************************/
+#include "LPC13Uxx.h"
+#include "type.h"
+#include "uart.h"
+
+volatile uint32_t UARTStatus;
+volatile uint8_t  UARTTxEmpty = 1;
+volatile uint8_t  UARTBuffer[BUFSIZE];
+volatile uint32_t UARTCount = 0;
+
+#if AUTOBAUD_ENABLE
+volatile uint32_t UARTAutoBaud = 0, AutoBaudTimeout = 0;
+#endif
+
+/*****************************************************************************
+** Function name:		USART_IRQHandler
+**
+** Descriptions:		USART interrupt handler
+**
+** parameters:			None
+** Returned value:		None
+**
+*****************************************************************************/
+void USART_IRQHandler(void)
+{
+  uint8_t IIRValue, LSRValue;
+  uint8_t Dummy = Dummy;
+
+  IIRValue = LPC_USART->IIR;
+
+  IIRValue >>= 1;			/* skip pending bit in IIR */
+  IIRValue &= 0x07;			/* check bit 1~3, interrupt identification */
+  if (IIRValue == IIR_RLS)		/* Receive Line Status */
+  {
+    LSRValue = LPC_USART->LSR;
+    /* Receive Line Status */
+    if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))
+    {
+      /* There are errors or break interrupt */
+      /* Read LSR will clear the interrupt */
+      UARTStatus = LSRValue;
+      Dummy = LPC_USART->RBR;	/* Dummy read on RX to clear
+								interrupt, then bail out */
+      return;
+    }
+    if (LSRValue & LSR_RDR)	/* Receive Data Ready */
+    {
+      /* If no error on RLS, normal ready, save into the data buffer. */
+      /* Note: read RBR will clear the interrupt */
+      UARTBuffer[UARTCount++] = LPC_USART->RBR;
+      if (UARTCount == BUFSIZE)
+      {
+        UARTCount = 0;		/* buffer overflow */
+      }
+    }
+  }
+  else if (IIRValue == IIR_RDA)	/* Receive Data Available */
+  {
+    /* Receive Data Available */
+    UARTBuffer[UARTCount++] = LPC_USART->RBR;
+    if (UARTCount == BUFSIZE)
+    {
+      UARTCount = 0;		/* buffer overflow */
+    }
+  }
+  else if (IIRValue == IIR_CTI)	/* Character timeout indicator */
+  {
+    /* Character Time-out indicator */
+    UARTStatus |= 0x100;		/* Bit 9 as the CTI error */
+  }
+  else if (IIRValue == IIR_THRE)	/* THRE, transmit holding register empty */
+  {
+    /* THRE interrupt */
+    LSRValue = LPC_USART->LSR;		/* Check status in the LSR to see if
+								valid data in U0THR or not */
+    if (LSRValue & LSR_THRE)
+    {
+      UARTTxEmpty = 1;
+    }
+    else
+    {
+      UARTTxEmpty = 0;
+    }
+  }
+#if AUTOBAUD_ENABLE
+  if (LPC_USART->IIR & IIR_ABEO) /* End of Auto baud */
+  {
+	LPC_USART->IER &= ~IIR_ABEO;
+	/* clear bit ABEOInt in the IIR by set ABEOIntClr in the ACR register */
+	LPC_USART->ACR |= IIR_ABEO;
+	UARTAutoBaud = 1;
+  }
+  else if (LPC_USART->IIR & IIR_ABTO)/* Auto baud time out */
+  {
+	LPC_USART->IER &= ~IIR_ABTO;
+	AutoBaudTimeout = 1;
+	/* clear bit ABTOInt in the IIR by set ABTOIntClr in the ACR register */
+	LPC_USART->ACR |= IIR_ABTO;
+  }
+#endif
+  return;
+}
+
+#if MODEM_TEST
+/*****************************************************************************
+** Function name:		ModemInit
+**
+** Descriptions:		Initialize UART0 port as modem, setup pin select.
+**
+** parameters:			None
+** Returned value:		None
+**
+*****************************************************************************/
+void ModemInit( void )
+{
+
+  LPC_IOCON->PIO0_7 &= ~0x07;     /* UART I/O config */
+  LPC_IOCON->PIO0_7 |= 0x01;      /* UART CTS */
+  LPC_IOCON->PIO0_17 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO0_17 |= 0x01;     /* UART RTS */
+#if 1
+  LPC_IOCON->PIO1_13 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO1_13 |= 0x01;     /* UART DTR */
+  LPC_IOCON->PIO1_14 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO1_14 |= 0x01;     /* UART DSR */
+  LPC_IOCON->PIO1_15 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO1_15 |= 0x01;     /* UART DCD */
+  LPC_IOCON->PIO1_16 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO1_16 |= 0x01;     /* UART RI */
+
+#else
+  LPC_IOCON->PIO1_19 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO1_19 |= 0x01;     /* UART DTR */
+  LPC_IOCON->PIO1_20 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO1_20 |= 0x01;     /* UART DSR */
+  LPC_IOCON->PIO1_21 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO1_21 |= 0x01;     /* UART DCD */
+  LPC_IOCON->PIO1_22 &= ~0x07;    /* UART I/O config */
+  LPC_IOCON->PIO1_22 |= 0x01;     /* UART RI */
+#endif
+  LPC_USART->MCR = 0xC0;          /* Enable Auto RTS and Auto CTS. */
+  return;
+}
+#endif
+
+/***********************************************************************
+ *
+ * Function: uart_set_divisors
+ *
+ * Purpose: Determines best dividers to get a target clock rate
+ *
+ * Processing:
+ *     See function.
+ *
+ * Parameters:
+ *     UARTClk    : UART clock
+ *     baudrate   : Desired UART baud rate
+ *
+ * Outputs:
+ *	  baudrate : Sets the estimated buadrate value in DLL, DLM, and FDR.
+ *
+ * Returns: Error status.
+ *
+ * Notes: None
+ *
+ **********************************************************************/
+uint32_t uart_set_divisors(uint32_t UARTClk, uint32_t baudrate)
+{
+  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 */
+  uClk = UARTClk >> 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 / 30))
+  {
+    /* Set the `Divisor Latch Access Bit` and enable so the DLL/DLM access*/
+    /* Initialise the `Divisor latch LSB` and `Divisor latch MSB` registers */
+    LPC_USART->DLM = (diviserOptimal >> 8) & 0xFF;
+    LPC_USART->DLL = diviserOptimal & 0xFF;
+
+    /* Initialise the Fractional Divider Register */
+    LPC_USART->FDR = ((mulFracDivOptimal & 0xF) << 4) | (dividerAddOptimal & 0xF);
+    return( TRUE );
+  }
+  return ( FALSE );
+}
+
+/*****************************************************************************
+** Function name:		UARTInit
+**
+** Descriptions:		Initialize UART0 port, setup pin select,
+**				clock, parity, stop bits, FIFO, etc.
+**
+** parameters:			UART baudrate
+** Returned value:		None
+**
+*****************************************************************************/
+void UARTInit(uint32_t baudrate)
+{
+#if !AUTOBAUD_ENABLE
+  uint32_t Fdiv;
+#endif
+  volatile uint32_t regVal;
+
+  UARTTxEmpty = 1;
+  UARTCount = 0;
+
+  NVIC_DisableIRQ(USART_IRQn);
+  /* Select only one location from below. */
+#if 1
+  LPC_IOCON->PIO0_18 &= ~0x07;    /*  UART I/O config */
+  LPC_IOCON->PIO0_18 |= 0x01;     /* UART RXD */
+  LPC_IOCON->PIO0_19 &= ~0x07;
+  LPC_IOCON->PIO0_19 |= 0x01;     /* UART TXD */
+#endif
+#if 0
+  LPC_IOCON->PIO1_14 &= ~0x07;    /*  UART I/O config */
+  LPC_IOCON->PIO1_14 |= 0x03;     /* UART RXD */
+  LPC_IOCON->PIO1_13 &= ~0x07;
+  LPC_IOCON->PIO1_13 |= 0x03;     /* UART TXD */
+#endif
+#if 0
+  LPC_IOCON->PIO1_17 &= ~0x07;    /*  UART I/O config */
+  LPC_IOCON->PIO1_17 |= 0x02;     /* UART RXD */
+  LPC_IOCON->PIO1_18 &= ~0x07;
+  LPC_IOCON->PIO1_18 |= 0x02;     /* UART TXD */
+#endif
+#if 0
+  LPC_IOCON->PIO1_26 &= ~0x07;    /*  UART I/O config */
+  LPC_IOCON->PIO1_26 |= 0x02;     /* UART RXD */
+  LPC_IOCON->PIO1_27 &= ~0x07;
+  LPC_IOCON->PIO1_27 |= 0x02;     /* UART TXD */
+#endif
+
+  /* Enable UART clock */
+  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);
+  LPC_SYSCON->UARTCLKDIV = 0x1;     /* divided by 1 */
+
+  LPC_USART->LCR = 0x83;            /* 8 bits, no Parity, 1 Stop bit */
+#if !AUTOBAUD_ENABLE
+#if FDR_CALIBRATION
+	if ( uart_set_divisors(SystemCoreClock/LPC_SYSCON->UARTCLKDIV, baudrate) != TRUE )
+	{
+      Fdiv = ((SystemCoreClock/LPC_SYSCON->UARTCLKDIV)/16)/baudrate ;	/*baud rate */
+      LPC_USART->DLM = Fdiv / 256;
+      LPC_USART->DLL = Fdiv % 256;
+	  LPC_USART->FDR = 0x10;		/* Default */
+	}
+#else
+    Fdiv = ((SystemCoreClock/LPC_SYSCON->UARTCLKDIV)/16)/baudrate ;	/*baud rate */
+    LPC_USART->DLM = Fdiv / 256;
+    LPC_USART->DLL = Fdiv % 256;
+	LPC_USART->FDR = 0x10;		/* Default */
+#endif
+#endif
+  LPC_USART->LCR = 0x03;		/* DLAB = 0 */
+  LPC_USART->FCR = 0x07;		/* Enable and reset TX and RX FIFO. */
+
+  /* Read to clear the line status. */
+  regVal = LPC_USART->LSR;
+
+  /* Ensure a clean start, no data in either TX or RX FIFO. */
+  while (( LPC_USART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) );
+  while ( LPC_USART->LSR & LSR_RDR )
+  {
+	regVal = LPC_USART->RBR;	/* Dump data from RX FIFO */
+  }
+
+  /* Enable the UART Interrupt */
+  NVIC_EnableIRQ(USART_IRQn);
+
+#if TX_INTERRUPT
+  LPC_USART->IER = IER_RBR | IER_THRE | IER_RLS;	/* Enable UART interrupt */
+#else
+  LPC_USART->IER = IER_RBR | IER_RLS;	/* Enable UART interrupt */
+#endif
+#if AUTOBAUD_ENABLE
+    LPC_USART->IER |= IER_ABEO | IER_ABTO;
+#endif
+  return;
+}
+
+/*****************************************************************************
+** Function name:		UARTSend
+**
+** Descriptions:		Send a block of data to the UART 0 port based
+**				on the data length
+**
+** parameters:		buffer pointer, and data length
+** Returned value:	None
+**
+*****************************************************************************/
+void UARTSend(uint8_t *BufferPtr, uint32_t Length)
+{
+
+  while ( Length != 0 )
+  {
+	  /* THRE status, contain valid data */
+#if !TX_INTERRUPT
+	  while ( !(LPC_USART->LSR & LSR_THRE) );
+	  LPC_USART->THR = *BufferPtr;
+#else
+	  /* Below flag is set inside the interrupt handler when THRE occurs. */
+      while ( !(UARTTxEmpty & 0x01) );
+	  LPC_USART->THR = *BufferPtr;
+      UARTTxEmpty = 0;	/* not empty in the THR until it shifts out */
+#endif
+      BufferPtr++;
+      Length--;
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		print_string
+**
+** Descriptions:		print out string on the terminal
+**
+** parameters:			pointer to the string end with NULL char.
+** Returned value:		none.
+**
+*****************************************************************************/
+void print_string( uint8_t *str_ptr )
+{
+  while(*str_ptr != 0x00)
+  {
+    while((LPC_USART->LSR & 0x60) != 0x60);
+    LPC_USART->THR = *str_ptr;
+    str_ptr++;
+  }
+  return;
+}
+
+/*****************************************************************************
+** Function name:		get_key
+**
+** Descriptions:		Get a character from the terminal
+**
+** parameters:			None
+** Returned value:		character, zero is none.
+**
+*****************************************************************************/
+uint8_t get_key( void )
+{
+  uint8_t dummy;
+
+  while ( !(LPC_USART->LSR & 0x01) );
+  dummy = LPC_USART->RBR;
+  if ((dummy>=65) && (dummy<=90))
+  {
+	/* convert capital to non-capital character, A2a, B2b, C2c. */
+	dummy +=32;
+  }
+  /* echo */
+  LPC_USART->THR = dummy;
+  return(dummy);
+}
+
+/******************************************************************************
+**                            End Of File
+******************************************************************************/

+ 0 - 0
mcu/lpc13uxx/iar/startup_lpc13xx.s → hw/mcu/lpc13uxx/iar/startup_lpc13xx.s


+ 18 - 18
mcu/lpc13uxx/keil/lpc13uxx.sct → hw/mcu/lpc13uxx/keil/lpc13uxx.sct

@@ -1,18 +1,18 @@
-; *************************************************************
-; *** Scatter-Loading Description File generated by uVision ***
-; *************************************************************
-
-LR_IROM1 0x00000000 0x00010000  {    ; load region size_region
-  ER_IROM1 0x00000000 0x00010000  {  ; load address = execution address
-   *.o (RESET, +First)
-   *(InRoot$$Sections)
-   .ANY (+RO)
-  }
-  RW_IRAM1 0x10000000 0x00002000  {  ; RW data
-   .ANY (+RW +ZI)
-  }
-  RW_IRAM2 0x20004000 0x00000800  {
-   *(USBRAM_SECTION)
-  }
-}
-
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x00000000 0x00010000  {    ; load region size_region
+  ER_IROM1 0x00000000 0x00010000  {  ; load address = execution address
+   *.o (RESET, +First)
+   *(InRoot$$Sections)
+   .ANY (+RO)
+  }
+  RW_IRAM1 0x10000000 0x00002000  {  ; RW data
+   .ANY (+RW +ZI)
+  }
+  RW_IRAM2 0x20004000 0x00000800  {
+   *(USBRAM_SECTION)
+  }
+}
+

+ 0 - 0
mcu/lpc13uxx/keil/startup_LPC13Uxx.s → hw/mcu/lpc13uxx/keil/startup_LPC13Uxx.s


+ 0 - 0
mcu/lpc13uxx/lpcxpresso/cr_startup_lpc13u.c → hw/mcu/lpc13uxx/lpcxpresso/cr_startup_lpc13u.c


+ 0 - 0
mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/history.txt → hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/history.txt


+ 0 - 0
mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/LPC17xx.h → hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/LPC17xx.h


+ 0 - 0
mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/core_cm3.h → hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/core_cm3.h


+ 0 - 0
mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/core_cmFunc.h → hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/core_cmFunc.h


+ 0 - 0
mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/core_cmInstr.h → hw/mcu/lpc175x_6x/CMSIS_CORE_LPC17xx/inc/core_cmInstr.h


Некоторые файлы не были показаны из-за большого количества измененных файлов