Browse Source

Merge remote-tracking branch 'upstream/master'

BernardXiong 10 years ago
parent
commit
7d73fb8bdb
59 changed files with 17582 additions and 3797 deletions
  1. 90 21
      bsp/CME_M7/StdPeriph_Driver/inc/cmem7.h
  2. 8 1
      bsp/CME_M7/StdPeriph_Driver/inc/cmem7_conf.h
  3. 50 15
      bsp/CME_M7/StdPeriph_Driver/inc/cmem7_eth.h
  4. 8 0
      bsp/CME_M7/StdPeriph_Driver/inc/cmem7_flash.h
  5. 11 0
      bsp/CME_M7/StdPeriph_Driver/inc/cmem7_gpio.h
  6. 10 0
      bsp/CME_M7/StdPeriph_Driver/inc/cmem7_includes.h
  7. 41 1
      bsp/CME_M7/StdPeriph_Driver/inc/cmem7_misc.h
  8. 8 8
      bsp/CME_M7/StdPeriph_Driver/inc/cmem7_rtc.h
  9. 13 6
      bsp/CME_M7/StdPeriph_Driver/inc/cmem7_wdg.h
  10. 103 40
      bsp/CME_M7/StdPeriph_Driver/src/cmem7_eth.c
  11. 6 3
      bsp/CME_M7/StdPeriph_Driver/src/cmem7_flash.c
  12. 75 0
      bsp/CME_M7/StdPeriph_Driver/src/cmem7_gpio.c
  13. 45 1
      bsp/CME_M7/StdPeriph_Driver/src/cmem7_misc.c
  14. 5 5
      bsp/CME_M7/StdPeriph_Driver/src/cmem7_rtc.c
  15. 11 6
      bsp/CME_M7/StdPeriph_Driver/src/cmem7_wdg.c
  16. 17 17
      bsp/CME_M7/drivers/emac.c
  17. 332 306
      bsp/CME_M7/project.uvopt
  18. 167 174
      bsp/CME_M7/project.uvproj
  19. 1 1
      bsp/CME_M7/rtconfig.py
  20. 930 0
      bsp/asm9260t/project.uvproj
  21. 68 54
      bsp/frdm-k64f/project.uvproj
  22. 116 116
      bsp/lm4f232/project.uvproj
  23. 294 165
      bsp/lpc176x/project.uvproj
  24. 205 139
      bsp/lpc178x/project.uvproj
  25. 185 109
      bsp/lpc2478/project.uvproj
  26. 1031 0
      bsp/lpc408x/project.uvproj
  27. 206 130
      bsp/mb9bf506r/project.uvproj
  28. 682 0
      bsp/mb9bf568r/project.uvproj
  29. 431 0
      bsp/mini2440/project.Uv2
  30. 646 0
      bsp/nrf51822/project.uvproj
  31. 277 140
      bsp/sam7x/project.uvproj
  32. 387 121
      bsp/stm32f0x/project.uvproj
  33. 4 1624
      bsp/stm32f107/project.uvopt
  34. 439 253
      bsp/stm32f107/project.uvproj
  35. 145 0
      bsp/stm32f10x/applications/canapp.c
  36. 1412 0
      bsp/stm32f10x/drivers/bxcan.c
  37. 17 0
      bsp/stm32f10x/drivers/bxcan.h
  38. 72 73
      bsp/stm32f10x/project.Uv2
  39. 147 140
      bsp/stm32f20x/project.uvproj
  40. 1 1
      bsp/stm32f40x/applications/application.c
  41. 17 1
      bsp/stm32f40x/drivers/SConscript
  42. 4038 0
      bsp/stm32f40x/drivers/stm32f4xx_eth.c
  43. 1874 0
      bsp/stm32f40x/drivers/stm32f4xx_eth.h
  44. 77 70
      bsp/stm32f40x/project.uvproj
  45. 57 7
      bsp/stm32f40x/project.uvprojx
  46. 1210 0
      bsp/tm4c129x/project.uvproj
  47. 8 0
      components/drivers/can/SConscript
  48. 907 0
      components/drivers/can/can.c
  49. 132 0
      components/drivers/can/readme-zh.txt
  50. 293 0
      components/drivers/include/drivers/can.h
  51. 4 0
      components/drivers/include/rtdevice.h
  52. 5 2
      components/drivers/spi/spi_flash_w25qxx.c
  53. 229 35
      components/net/lwip/apps/ftpd.c
  54. 16 5
      components/net/lwip_dhcpd/dhcp_server.c
  55. 1 1
      libcpu/arm/am335x/mmu.c
  56. 2 2
      libcpu/arm/cortex-m0/context_rvds.S
  57. 3 3
      libcpu/arm/cortex-m3/context_rvds.S
  58. 2 1
      libcpu/arm/cortex-m4/context_rvds.S
  59. 11 0
      tools/buildbot.py

+ 90 - 21
bsp/CME_M7/StdPeriph_Driver/inc/cmem7.h

@@ -1,12 +1,12 @@
 
 /****************************************************************************************************//**
- * @file     CMEM7.h
+ * @file     cmem7.h
  *
  * @brief    CMSIS Cortex-M3 Peripheral Access Layer Header File for
- *           CMEM7 from <unknown Vendor>.
+ *           cmem7 from <unknown Vendor>.
  *
  * @version  V1.0
- * @date     5. June 2014
+ * @date     5. January 2015
  *
  * @note     Generated with SVDConv V2.75 
  *           from CMSIS SVD File 'SVDConv_CME_M7.svd' Version 1.0,
@@ -18,7 +18,7 @@
   * @{
   */
 
-/** @addtogroup CMEM7
+/** @addtogroup cmem7
   * @{
   */
 
@@ -46,7 +46,7 @@ typedef enum {
   DebugMonitor_IRQn             =  -4,              /*!<  12  Debug Monitor                                                    */
   PendSV_IRQn                   =  -2,              /*!<  14  Pendable request for system service                              */
   SysTick_IRQn                  =  -1,              /*!<  15  System Tick Timer                                                */
-/* ----------------------  CMEM7 Specific Interrupt Numbers  ---------------------- */
+/* ----------------------  cmem7 Specific Interrupt Numbers  ---------------------- */
   ETH_INT_IRQn                  =   0,              /*!<   0  ETH_INT                                                          */
   USB_INT_IRQn                  =   1,              /*!<   1  USB_INT                                                          */
   DMA_INT_IRQn                  =   2,              /*!<   2  DMA_INT                                                          */
@@ -105,7 +105,7 @@ typedef enum {
 /** @} */ /* End of group Configuration_of_CMSIS */
 
 #include <core_cm3.h>                               /*!< Cortex-M3 processor and core peripherals                              */
-#include "system_cmem7.h"                           /*!< CMEM7 System                                                          */
+#include "system_cmem7.h"                           /*!< cmem7 System                                                          */
 
 
 /* ================================================================================ */
@@ -789,17 +789,17 @@ typedef struct {                                    /*!< RTC Structure
     
     struct {
       __IO uint32_t  SECOND     :  1;               /*!< 1s interrupt, write 1 clear 0                                         */
-      __IO uint32_t  MICROSECOND:  1;               /*!< 1ms interrupt, write 1 clear 0                                        */
+      __IO uint32_t  MILLSECOND :  1;               /*!< 1ms interrupt, write 1 clear 0                                        */
     } INT_STATUS_b;                                 /*!< BitSize                                                               */
   };
   __IO uint32_t  SECOND;                            /*!< current seconds of system time                                        */
   
   union {
-    __IO uint16_t  MICROSECOND;                     /*!< current micro seconds of system time                                  */
+    __IO uint16_t  MILLSECOND;                      /*!< current millseconds of system time                                    */
     
     struct {
       __IO uint16_t  MS         : 10;               /*!< micro seconds                                                         */
-    } MICROSECOND_b;                                /*!< BitSize                                                               */
+    } MILLSECOND_b;                                 /*!< BitSize                                                               */
   };
 } RTC_Type;
 
@@ -2884,9 +2884,35 @@ typedef struct {                                    /*!< ETH Structure
                                                          are used to index the content                                         */
     } VLAN_TAG_b;                                   /*!< BitSize                                                               */
   };
-  __I  uint32_t  RESERVED0[8];
+  __I  uint32_t  RESERVED0[2];
+  __IO uint32_t  RWUFFR;                            /*!< Remote Wake-Up Frame Filter Register                                  */
+  
+  union {
+    __IO uint32_t  PMTCSR;                          /*!< PMT Control and Status Register                                       */
+    
+    struct {
+      __IO uint32_t  PWRDWN     :  1;               /*!< Power Down                                                            */
+      __IO uint32_t  MGKPKTEN   :  1;               /*!< Magic Packet Enable                                                   */
+      __IO uint32_t  RWKPKTEN   :  1;               /*!< Remote Wake-Up Frame Enable                                           */
+           uint32_t             :  2;
+      __IO uint32_t  MGKPRCVD   :  1;               /*!< the power management event is generated because of the reception
+                                                         of a magic packet                                                     */
+      __IO uint32_t  RWKPRCVD   :  1;               /*!< When set, this bit indicates the power management event is generated
+                                                         because of the reception of a remote wake-up frame                    */
+           uint32_t             :  2;
+      __IO uint32_t  GLBLUCAST  :  1;               /*!< When set, enables any unicast packet filtered by the MAC (DAF)address
+                                                         recognition to be a remote wake-up frame.                             */
+           uint32_t             : 14;
+      __IO uint32_t  RWKPTR     :  3;               /*!< Remote Wake-up FIFO Pointer                                           */
+           uint32_t             :  4;
+      __IO uint32_t  RWKFILTRST :  1;               /*!< Remote Wake-Up Frame Filter Register Pointer Reset.                   */
+    } PMTCSR_b;                                     /*!< BitSize                                                               */
+  };
+  __I  uint32_t  RESERVED1[2];
+  __IO uint32_t  MACISR;                            /*!< Interrupt Status Register                                             */
+  __IO uint32_t  MACIMR;                            /*!< Interrupt Mask Register                                               */
   __IO uint16_t  ADDR0_HIGH;                        /*!< MAC Address0 High Register                                            */
-  __I  uint16_t  RESERVED1;
+  __I  uint16_t  RESERVED2;
   __IO uint32_t  ADDR0_LOW;                         /*!< MAC Address0 LOW Register                                             */
   
   union {
@@ -2901,10 +2927,51 @@ typedef struct {                                    /*!< ETH Structure
     } ADDR1_HIGH_b;                                 /*!< BitSize                                                               */
   };
   __IO uint32_t  ADDR1_LOW;                         /*!< MAC Address1 LOW Register                                             */
-  __I  uint32_t  RESERVED2[47];
-  __IO uint32_t  MMC_RX_MASK;                       /*!< MMC Receive interrupt mask                                            */
-  __IO uint32_t  MMC_TX_MASK;                       /*!< MMC Transmit Interrupt Mask                                           */
-  __I  uint32_t  RESERVED3[955];
+  __I  uint32_t  RESERVED3[44];
+  
+  union {
+    __IO uint32_t  MMCCR;                           /*!< MMC Control Register                                                  */
+    
+    struct {
+      __IO uint32_t  CNTRST     :  1;               /*!< Counters Reset                                                        */
+      __IO uint32_t  CNTSTOPRO  :  1;               /*!< Counter Stop Rollover                                                 */
+      __IO uint32_t  RSTONRD    :  1;               /*!< Reset on Read                                                         */
+      __IO uint32_t  CNTFREEZ   :  1;               /*!< MMC Counter Freeze                                                    */
+      __IO uint32_t  CNTPRST    :  1;               /*!< Counters Preset                                                       */
+      __IO uint32_t  CNTPRSTLVL :  1;               /*!< Counters Preset                                                       */
+           uint32_t             :  2;
+      __IO uint32_t  UCDBC      :  1;               /*!< Update MMC Counters for Dropped Broadcast Frames                      */
+    } MMCCR_b;                                      /*!< BitSize                                                               */
+  };
+  __IO uint32_t  MMCRIR;                            /*!< MMC Receive Interrupt Register                                        */
+  __IO uint32_t  MMCTIR;                            /*!< MMC Transmit Interrupt Register                                       */
+  __IO uint32_t  MMCRIMR;                           /*!< MMC Receive interrupt mask                                            */
+  __IO uint32_t  MMCTIMR;                           /*!< MMC Transmit Interrupt Mask                                           */
+  __I  uint32_t  RESERVED4[59];
+  __IO uint32_t  MMCIRCOIM;                         /*!< MMC IPC Receive Checksum Offload Interrupt Mask                       */
+  __I  uint32_t  RESERVED5[319];
+  
+  union {
+    __IO uint32_t  PTPTSCR;                         /*!< Timestamp Control Register                                            */
+    
+    struct {
+      __IO uint32_t  TSENA      :  1;               /*!< Timestamp Enable                                                      */
+      __IO uint32_t  TSCFUPDT   :  1;               /*!< Timestamp Fine or Coarse Update                                       */
+      __IO uint32_t  TSINIT     :  1;               /*!< Timestamp Initialize                                                  */
+      __IO uint32_t  TSUPDT     :  1;               /*!< Timestamp Update                                                      */
+      __IO uint32_t  TSTRIG     :  1;               /*!< Timestamp Interrupt Trigger Enable                                    */
+      __IO uint32_t  TSADDREG   :  1;               /*!< Addend Reg Update                                                     */
+    } PTPTSCR_b;                                    /*!< BitSize                                                               */
+  };
+  __IO uint32_t  PTPSSIR;                           /*!< Sub-Second Increment Register                                         */
+  __IO uint32_t  PTPTSHR;                           /*!< System Time Seconds Register                                          */
+  __IO uint32_t  PTPTSLR;                           /*!< System Time Nanoseconds Register                                      */
+  __IO uint32_t  PTPTSHUR;                          /*!< System Time Seconds Update Register                                   */
+  __IO uint32_t  PTPTSLUR;                          /*!< System Time Nanoseconds Update Register                               */
+  __IO uint32_t  PTPTSAR;                           /*!< Timestamp Addend Register                                             */
+  __IO uint32_t  PTPTTHR;                           /*!< Target Time Seconds Register                                          */
+  __IO uint32_t  PTPTTLR;                           /*!< Target Time Nanoseconds Register                                      */
+  __I  uint32_t  RESERVED6[567];
   
   union {
     __IO uint32_t  BUS_MODE;                        /*!< Flow Control Register                                                 */
@@ -3019,7 +3086,7 @@ typedef struct {                                    /*!< ETH Structure
       __IO uint32_t  NIE        :  1;               /*!< Normal Interrupt Summary Enable                                       */
     } INT_EN_b;                                     /*!< BitSize                                                               */
   };
-  __I  uint32_t  RESERVED4[3];
+  __I  uint32_t  RESERVED7[3];
   
   union {
     __IO uint32_t  AHB_STATUS;                      /*!< AHB Status Register                                                   */
@@ -3029,7 +3096,7 @@ typedef struct {                                    /*!< ETH Structure
                                                          in the non-idle state                                                 */
     } AHB_STATUS_b;                                 /*!< BitSize                                                               */
   };
-  __I  uint32_t  RESERVED5[6];
+  __I  uint32_t  RESERVED8[6];
   __I  uint32_t  CURTDESAPTR;                       /*!< Current Host Transmit Descriptor Register                             */
   __I  uint32_t  CURRDESAPTR;                       /*!< Current Host Receive Descriptor Register                              */
   __I  uint32_t  CURTBUFAPTR;                       /*!< Current Host Transmit Buffer Address Register                         */
@@ -7227,7 +7294,7 @@ typedef struct {                                    /*!< GLOBAL_CTRL Structure
     
     struct {
       __IO uint32_t  SECOND     :  1;               /*!< 1s interrupt enable                                                   */
-      __IO uint32_t  MICROSECOND:  1;               /*!< 1ms interrupt enable                                                  */
+      __IO uint32_t  MILLSECOND :  1;               /*!< 1ms interrupt enable                                                  */
     } RTC_INT_EN_b;                                 /*!< BitSize                                                               */
   };
   __I  uint32_t  RESERVED1;
@@ -7315,7 +7382,9 @@ typedef struct {                                    /*!< DDRC Structure
       __IO uint32_t  MODE       :  6;               /*!< DDRC Mode                                                             */
            uint32_t             :  2;
       __IO uint32_t  LANE       :  1;               /*!< LANE synchronization logic bypass                                     */
-           uint32_t             :  7;
+           uint32_t             :  3;
+      __IO uint32_t  ADEC       :  1;               /*!< address decoder mapping                                               */
+           uint32_t             :  3;
       __IO uint32_t  B16        :  2;               /*!< Active 16 bit DQ position when the unmber of DQ IO is 16              */
            uint32_t             :  6;
       __IO uint32_t  CLKPOL     :  2;               /*!< DQS clkpol set by user on the PHY                                     */
@@ -7933,7 +8002,7 @@ typedef struct {                                    /*!< SOFT_RESET Structure
 
 
 /** @} */ /* End of group Device_Peripheral_Registers */
-/** @} */ /* End of group CMEM7 */
+/** @} */ /* End of group cmem7 */
 /** @} */ /* End of group (null) */
 
 #ifdef __cplusplus
@@ -7941,5 +8010,5 @@ typedef struct {                                    /*!< SOFT_RESET Structure
 #endif
 
 
-#endif  /* CMEM7_H */
+#endif  /* cmem7_H */
 

+ 8 - 1
bsp/CME_M7/StdPeriph_Driver/inc/cmem7_conf.h

@@ -45,6 +45,11 @@
 #define _USB
 #define _WDG
 
+//#define _MARVELL
+//#define _IP1826D
+#define _M7NORFLASH
+#define _ME_6095_F
+
 #define USE_FULL_ASSERT    1 
 
 #ifdef  USE_FULL_ASSERT
@@ -71,7 +76,9 @@ typedef enum _BOOL {FALSE = 0, TRUE = 1} BOOL;
 /**
   * System clock frequency, unit is Hz.
   */
-#define SYSTEM_CLOCK_FREQ         200000000
+#define SYSTEM_CLOCK_FREQ        300000000 
+//250000000
+//300000000
 
 /**
   * @brief  usecond delay 

+ 50 - 15
bsp/CME_M7/StdPeriph_Driver/inc/cmem7_eth.h

@@ -86,7 +86,6 @@
 /**
   * @}
   */
-
 /**
   * @brief  EFUSE receive filter structure
 	*/
@@ -105,15 +104,15 @@ typedef struct
 	*/ 
 typedef struct
 {
-  BOOL ETH_LinkUp;                   /*!< If ETH is linked up and it can be retrieved from PHY */																	  
+    BOOL ETH_LinkUp;                   /*!< If ETH is linked up and it can be retrieved from PHY */																	  
 	uint8_t ETH_Speed;                 /*!< speed of ETH, refer as @ref ETH_SPEED                */
-  uint8_t ETH_Duplex;                /*!< duplex mode of ETH, refer as @ref ETH_DUPLEX				 */
+    uint8_t ETH_Duplex;                /*!< duplex mode of ETH, refer as @ref ETH_DUPLEX				 */
 	BOOL ETH_RxEn;                     /*!< Rx enable                                            */
 	BOOL ETH_TxEn;                     /*!< Tx enable                                            */
 	BOOL ETH_ChecksumOffload;          /*!< Checksum offload enable                              */
 	BOOL ETH_JumboFrame;               /*!< Jumbo Frame Enable                                   */
 	uint8_t ETH_MacAddr[6];            /*!< MAC address                                          */ 
-  ETH_FrameFilter *ETH_Filter;       /*!< Received frame address filter, receive all if null   */
+    ETH_FrameFilter *ETH_Filter;       /*!< Received frame address filter, receive all if null   */
 } ETH_InitTypeDef;
 
 /**
@@ -173,14 +172,14 @@ typedef struct {
 			uint32_t CRC_ERR        :  1; 	 /*!< [OUT] CRC error while last segment                		*/
 			uint32_t 								:  5;
 			uint32_t TTSE           :  1; 	 /*!< timestamp available while last segment                */
-			uint32_t LS           	:  1; 	 /*!< last segment flag                                     */
-			uint32_t FS           	:  1; 	 /*!< first segment flag                                    */
+			uint32_t LS           	:  1; 	 /*!< [OUT] last segment flag                               */
+			uint32_t FS           	:  1; 	 /*!< [OUT] first segment flag                              */
 			uint32_t 								:  1;
 			uint32_t OVERFLOW_ERR   :  1; 	 /*!< [OUT] FIFO overflow while last segment                */
 			uint32_t LENGTH_ERR     :  1; 	 /*!< [OUT] length error while last segment                	*/
 			uint32_t 								:  2;
 			uint32_t ERR_SUM        :  1; 	 /*!< [OUT] Error summary while last segment              	*/
-			uint32_t FL           	: 14; 	 /*!< frame length while last segment                       */
+			uint32_t FL           	: 14; 	 /*!< [OUT] frame length while last segment                 */
 			uint32_t 		           	:  2;
 		} RX0_b;
 	} RX_0;
@@ -216,7 +215,13 @@ uint32_t ETH_PhyRead(uint32_t phyAddr, uint32_t phyReg);
   * @retval None
 	*/
 void ETH_PhyWrite(uint32_t phyAddr, uint32_t phyReg, uint32_t data);
-
+/**
+  * @brief  Fills each ETH_InitStruct member with its default value.
+  * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure
+  *   which will be initialized.
+  * @retval : None
+  */
+void ETH_StructInit(ETH_InitTypeDef* init);
 /**
   * @brief  Ethernet initialization
   * @note   This function should be called at first before any other interfaces.
@@ -231,21 +236,21 @@ BOOL ETH_Init(ETH_InitTypeDef *init);
 	* @param[in] Enable The bit indicates if specific interrupts are enable or not
   * @retval None
 	*/ 
-void ETH_EnableInt(uint32_t Int, BOOL enable);
+void ETH_ITConfig(uint32_t Int, BOOL enable);
 
 /**
   * @brief  Check specific interrupts are set or not 
 	* @param[in] Int interrupt mask bits, which can be the combination of @ref ETH_INT
   * @retval BOOL The bit indicates if specific interrupts are set or not
 	*/
-BOOL ETH_GetIntStatus(uint32_t Int);
+BOOL ETH_GetITStatus(uint32_t Int);
 
 /**
   * @brief  Clear specific interrupts
 	* @param[in] Int interrupt mask bits, which can be the combination of @ref ETH_INT
   * @retval None
 	*/
-void ETH_ClearInt(uint32_t Int);
+void ETH_ClearITPendingBit(uint32_t Int);
 
 /**
   * @brief  Get ethernte MAC address
@@ -299,7 +304,7 @@ ETH_TX_DESC *ETH_AcquireFreeTxDesc(void);
 
 /**
   * @brief  Check if a transmission descriptor is free or not
-	* @param	desc A pointer of a transmission descriptor
+	* @param[in] desc A pointer of a transmission descriptor
   * @retval BOOL True if the transmission descriptor is free, or flase.
 	*/
 BOOL ETH_IsFreeTxDesc(ETH_TX_DESC *desc);
@@ -309,11 +314,26 @@ BOOL ETH_IsFreeTxDesc(ETH_TX_DESC *desc);
 	*					After users prepared data in the buffer of a free descriptor,
 	*					They must call this function to change ownership of the 
 	*					descriptor to hardware.
-	* @param	desc A pointer of a transmission descriptor
+	* @param[in] desc A pointer of a transmission descriptor
   * @retval None
 	*/
 void ETH_ReleaseTxDesc(ETH_TX_DESC *desc);
 
+/**
+  * @brief  Set buffer address of the specific TX descriptor
+	* @param[in] desc A pointer of a transmission descriptor
+  * @param[in] bufAddr buffer address to be sent
+  * @retval None
+	*/
+void ETH_SetTxDescBufAddr(ETH_TX_DESC *desc, uint32_t bufAddr);
+
+/**
+  * @brief  Get buffer address of the specific TX descriptor
+	* @param[in] desc A pointer of a transmission descriptor
+  * @retval uint32_t buffer address to be gotten
+	*/
+uint32_t ETH_GetTxDescBufAddr(ETH_TX_DESC *desc);
+
 /**
   * @brief  Set ethernet receive descriptor ring
 	* @note		Make sure that memory occupied by descriptors should be in physical
@@ -359,7 +379,7 @@ ETH_RX_DESC *ETH_AcquireFreeRxDesc(void);
 
 /**
   * @brief  Check if a receive descriptor is free or not
-	* @param	desc A pointer of a receive descriptor
+	* @param[in] desc A pointer of a receive descriptor
   * @retval BOOL True if the receive descriptor is free, or flase.
 	*/
 BOOL ETH_IsFreeRxDesc(ETH_RX_DESC *desc);
@@ -369,11 +389,26 @@ BOOL ETH_IsFreeRxDesc(ETH_RX_DESC *desc);
 	*					After users handled data in the buffer of a free descriptor,
 	*					They must call this function to change ownership of the 
 	*					descriptor to hardware.
-	* @param	desc A pointer of a transmission descriptor
+	* @param[in] desc A pointer of a transmission descriptor
   * @retval None
 	*/
 void ETH_ReleaseRxDesc(ETH_RX_DESC *desc);
 
+/**
+  * @brief  Set buffer address of the specific RX descriptor
+	* @param[in] desc A pointer of a receive descriptor
+  * @param[in] bufAddr buffer address to be received
+  * @retval None
+	*/
+void ETH_SetRxDescBufAddr(ETH_RX_DESC *desc, uint32_t bufAddr);
+
+/**
+  * @brief  Get buffer address of the specific RX descriptor
+	* @param[in] desc A pointer of a receive descriptor
+  * @retval uint32_t buffer address to be gotten
+	*/
+uint32_t ETH_GetRxDescBufAddr(ETH_RX_DESC *desc);
+
 #ifdef __cplusplus
 }
 #endif

+ 8 - 0
bsp/CME_M7/StdPeriph_Driver/inc/cmem7_flash.h

@@ -202,6 +202,14 @@ void FLASH_Read(uint8_t ReadMode, uint32_t addr, uint16_t size, uint8_t* data);
 	*/
 void FLASH_Write(uint32_t addr, uint16_t size, uint8_t* data);
 
+
+void flash_WaitInWritting(void) ;
+
+void flash_WaitReadFifoNotEmpty(void);
+
+uint16_t flash_ReadFifo(uint16_t size, uint8_t* data) ;
+
+
 #ifdef __cplusplus
 }
 #endif

+ 11 - 0
bsp/CME_M7/StdPeriph_Driver/inc/cmem7_gpio.h

@@ -140,6 +140,17 @@ void GPIO_InitPwm(uint8_t Channel, uint32_t HighLevelNanoSecond, uint32_t LowLev
 	*/ 
 void GPIO_EnablePwm(uint8_t Channel, BOOL Enable);
 
+
+
+/**
+  xjf 20150324
+  
+**/
+void GPIO_SetBits(uint32_t mask);
+void GPIO_clrBits(uint32_t mask);
+uint32_t GPIO_getBits(uint32_t mask); 
+
+
 #ifdef __cplusplus
 }
 #endif

+ 10 - 0
bsp/CME_M7/StdPeriph_Driver/inc/cmem7_includes.h

@@ -102,6 +102,16 @@
 	#include "cmem7_wdg.h"
 #endif
 
+
+#ifdef _MARVELL
+  #include <marvel_98dx242.h>
+	#include <s24g_i2c.h>
+#endif	
+	
+#ifdef _IP1826D
+  #include <ip1826d_v00.h>
+#endif	
+
 #ifdef __cplusplus
 }
 #endif

+ 41 - 1
bsp/CME_M7/StdPeriph_Driver/inc/cmem7_misc.h

@@ -87,9 +87,11 @@ typedef struct
   * @{
   */
 
+#define NVIC_VectTab_CME_CODE        ((uint32_t)0x00000000)
 #define NVIC_VectTab_RAM             ((uint32_t)0x20000000)
 #define NVIC_VectTab_FLASH           ((uint32_t)0x08000000)
-#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \
+#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_CME_CODE) || \
+                                  ((VECTTAB) == NVIC_VectTab_RAM) || \
                                   ((VECTTAB) == NVIC_VectTab_FLASH))
 /**
   * @}
@@ -197,6 +199,20 @@ void NVIC_SystemLPConfig(uint8_t LowPowerMode, BOOL NewState);
 	*/
 void GLB_MMAP(uint32_t from, uint32_t to, BOOL isIcacheOn);
 
+/**
+  * @brief  Convert the mapping destination address to source address
+	* @param[in] to address to be mapped to
+  * @retval uint32_t address to be mapped from
+	*/
+uint32_t GLB_ConvertToMappingFromAddr(uint32_t to);
+
+/**
+  * @brief  Convert the mapping source address to destination address
+	* @param[in] from address to be mapped from
+  * @retval uint32_t address to be mapped to
+	*/
+uint32_t GLB_ConvertToMappingToAddr(uint32_t from);
+
 /**
   * @brief  Set NMI irq number, it should be one of @ref IRQn_Type.
 	* @Note		You can assign any valid IRQn_Type to NMI. After that, you will enter NMI 
@@ -228,6 +244,30 @@ void GLB_SetNmiIrqNum(uint32_t irq);
 	*/
 void GLB_SelectSysClkSource(uint8_t source);
 
+/**
+  * @brief  Simulate instruction 'STRB' or 'STRH' with 'BFI'
+	* @Note		In M7, you have to write a register in 32-bit alignment,
+	*				  not in 8-bit or 16-bit. 
+	* @param[in] addr register address to be written 
+  * @param[in] value value to be written
+  * @param[in] lsb LSB in register to be written
+  * @param[in] len bit length to be written
+  * @retval None
+	*/
+	
+	
+//#define aaaa(len) __asm("LDR len, 11")
+
+#define CMEM7_BFI(addr, value, lsb, len)        \
+  do {                                          \
+    unsigned long tmp;                          \
+    unsigned long tmp1 = (unsigned long)addr;   \
+                                                \
+    __asm("LDR tmp, [tmp1]\n"                   \
+      "BFI tmp, "#value", "#lsb", "#len" \n"    \
+      "STR tmp, [tmp1]\n");                     \
+		} while (0)
+
 #ifdef __cplusplus
 }
 #endif

+ 8 - 8
bsp/CME_M7/StdPeriph_Driver/inc/cmem7_rtc.h

@@ -38,34 +38,34 @@
   * @{
   */
 #define RTC_Int_Second                     ((uint32_t)0x00000001)
-#define RTC_Int_Microsecond                ((uint32_t)0x00000002)
+#define RTC_Int_Millsecond                 ((uint32_t)0x00000002)
 #define RTC_Int_All                        ((uint32_t)0x00000003)
 #define IS_RTC_INT(INT)                    (((INT) != 0) && (((INT) & ~RTC_Int_All) == 0))
 /**
   * @}
   */
-
+   
 /**
   * @brief  Enable or disable RTC interrupt. 
 	* @param[in] Int interrupt mask bits, which can be the combination of @ref RTC_Int
 	* @param[in] Enable The bit indicates if specific interrupts are enable or not
   * @retval None
 	*/ 
-void RTC_EnableInt(uint32_t Int, BOOL Enable);
+void RTC_ITConfig(uint32_t Int, BOOL Enable);
 
 /**
   * @brief  Check specific interrupts are set or not 
 	* @param[in] Int interrupt mask bits, which can be the combination of @ref RTC_Int
   * @retval BOOL The bit indicates if specific interrupts are set or not
 	*/
-BOOL RTC_GetIntStatus(uint32_t Int);
+BOOL RTC_GetITStatus(uint32_t Int);
 
 /**
   * @brief  Clear specific interrupts
 	* @param[in] Int interrupt mask bits, which can be the combination of @ref RTC_Int
   * @retval None
 	*/
-void RTC_ClearInt(uint32_t Int);
+void RTC_ClearITPendingBit(uint32_t Int);
 
 /**
   * @brief  Get seconds since power up
@@ -75,11 +75,11 @@ void RTC_ClearInt(uint32_t Int);
 uint32_t RTC_GetSecond(void);
 
 /**
-  * @brief  Get current micro-seconds
+  * @brief  Get current millseconds
 	* @param	None
-  * @retval uint32_t Current micro-seconds
+  * @retval uint32_t Current millseconds
 	*/
-uint16_t RTC_GetMicroSecond(void);
+uint16_t RTC_GetMillSecond(void);
 
 #ifdef __cplusplus
 }

+ 13 - 6
bsp/CME_M7/StdPeriph_Driver/inc/cmem7_wdg.h

@@ -56,14 +56,21 @@
   * @}
   */
 
+/**
+  * @brief  Deinitializes the Watchdog peripheral registers to their default reset values.
+	* @param[in] None
+  * @retval None
+	*/ 
+void WDG_DeInit(void);
+
 /**
   * @brief  Watchdog initialization
   * @note   This function should be called at first before any other interfaces.
 	* @param[in] trigger Watchdog interrupt trigger mode, which is a value of @ref WDG_TRIGGER_MODE
-	* @param[in] ResetMicroSecond MicroSeconds lasts before global reset
+	* @param[in] ResetMillSecond MillSeconds lasts before global reset
   * @retval None
 	*/ 
-void WDG_Init(uint8_t trigger, uint16_t ResetMicroSecond);
+void WDG_Init(uint8_t trigger, uint16_t ResetMillSecond);
 
 /**
   * @brief  Enable or disable watchdog interrupt. 
@@ -71,28 +78,28 @@ void WDG_Init(uint8_t trigger, uint16_t ResetMicroSecond);
 	* @param[in] Enable The bit indicates if the specific interrupt are enable or not
   * @retval None
 	*/ 
-void WDG_EnableInt(uint8_t Int, BOOL Enable);
+void WDG_ITConfig(uint8_t Int, BOOL Enable);
 
 /**
   * @brief  Check the specific interrupt are set or not 
 	* @param	None
   * @retval BOOL The bit indicates if the specific interrupt are set or not
 	*/
-BOOL WDG_GetIntStatus(void);
+BOOL WDG_GetITStatus(void);
 
 /**
   * @brief  Clear the specific interrupt
 	* @param	None
   * @retval None
 	*/
-void WDG_ClearInt(void);
+void WDG_ClearITPendingBit(void);
 
 /**
   * @brief  Enable or disable watchdog. 
 	* @param[in] Enable The bit indicates if watchdog is enable or not
   * @retval None
 	*/ 
-void WDG_Enable(BOOL Enable);
+void WDG_Cmd(BOOL Enable);
 
 
 #ifdef __cplusplus

+ 103 - 40
bsp/CME_M7/StdPeriph_Driver/src/cmem7_eth.c

@@ -5,8 +5,8 @@
 	* @brief    CMEM7 ethernet source file
 	*
 	*
-	* @version  V1.0
-	* @date     3. September 2013
+	* @version  V2.0
+	* @date     3. September 2014
 	*
 	* @note               
 	*           
@@ -25,7 +25,7 @@
 	*/
 	
 #include "cmem7_eth.h"
-
+#include "cmem7_misc.h"
 
 typedef struct { 
 	union {
@@ -49,7 +49,7 @@ typedef struct {
 			uint32_t TCH						:  1;		 /*!< Second Address Chained                                */
 			uint32_t 								:  4;
 			uint32_t TTSE           :  1; 	 /*!< enables IEEE1588 hardware timestamping in first segment */
-			uint32_t 								:  2;
+			uint32_t 							  :  2;  
 			uint32_t FS           	:  1; 	 /*!< first segment flag                                    */
 			uint32_t LS           	:  1; 	 /*!< last segment flag                                     */
 			uint32_t IC	           	:  1; 	 /*!< Interrupt on Completion                               */
@@ -190,8 +190,9 @@ static void mac_SetConfig(ETH_InitTypeDef *init) {
 	ETH->CONFIG_b.IPC = init->ETH_ChecksumOffload;
 	ETH->CONFIG_b.DM = init->ETH_Duplex;
 	ETH->CONFIG_b.LM = FALSE;
-	ETH->MMC_RX_MASK = 0xFFFFFFFF;
-	ETH->MMC_TX_MASK = 0xFFFFFFFF;
+	ETH->MMCRIMR = 0xFFFFFFFF;
+	ETH->MMCTIMR = 0xFFFFFFFF;
+	ETH->MMCIRCOIM = 0xFFFFFFFF;
 	
 	if (init->ETH_Speed == ETH_SPEED_10M) {
 		ETH->CONFIG_b.FES = ETH_EXACT_SPEED_10M_BPS;
@@ -209,7 +210,7 @@ static void mac_SetConfig(ETH_InitTypeDef *init) {
 	ETH->CONFIG_b.JD = TRUE;
 	ETH->CONFIG_b.WD = TRUE;
 	ETH->CONFIG_b.TC = FALSE;
-	ETH->CONFIG_b.CST = FALSE;
+	ETH->CONFIG_b.CST = TRUE;
 	ETH->CONFIG_b.TWOKPE = FALSE;
 	ETH->CONFIG_b.SARC = ETH_SOURCE_ADDR_REPLACE;
 }
@@ -318,7 +319,7 @@ static void mac_SetFrameFilter(ETH_FrameFilter *filter) {
 	ETH->FF_b.VTFE = FALSE;
 	ETH->FF_b.IPFE = FALSE;
 	ETH->FF_b.DNTU = FALSE;
-	ETH->FF_b.RA = TRUE;
+	ETH->FF_b.RA = FALSE;//TRUE
 	
 	// receive all
 	if (!filter) {
@@ -339,14 +340,20 @@ static void mac_SetFrameFilter(ETH_FrameFilter *filter) {
 	
 	// SA
 	if (filter->ETH_SourceFilterEnable) {
-		ETH->FF_b.RA = FALSE;
+		uint32_t value;
+    
+    ETH->FF_b.RA = FALSE;
 		ETH->FF_b.SAF = TRUE;
 		ETH->FF_b.SAIF = filter->ETH_SourceDrop;
 		ETH->ADDR1_HIGH_b.AE = TRUE;
-		ETH->ADDR1_HIGH_b.SA = TRUE;
-		ETH->ADDR1_HIGH_b.ADDR = 
+		ETH->ADDR1_HIGH_b.SA = TRUE; 
+    ETH->ADDR1_HIGH_b.ADDR = 
 			(filter->ETH_SourceMacAddr[5] << 8) | filter->ETH_SourceMacAddr[4];
-		ETH->ADDR1_LOW = (filter->ETH_SourceMacAddr[3] << 24) | 
+		
+		
+// 		value = (filter->ETH_SourceMacAddr[5] << 8) | filter->ETH_SourceMacAddr[4];
+//     CMEM7_BFI(&(ETH->ADDR1_HIGH), value, 0, 16);
+    ETH->ADDR1_LOW = (filter->ETH_SourceMacAddr[3] << 24) | 
 			(filter->ETH_SourceMacAddr[2] << 16) | 
 		  (filter->ETH_SourceMacAddr[1] << 8) | 
 			filter->ETH_SourceMacAddr[0];
@@ -355,9 +362,9 @@ static void mac_SetFrameFilter(ETH_FrameFilter *filter) {
 
 static void mac_setFlowControl(void) {
   ETH->FC_b.FCB = FALSE;
-	ETH->FC_b.TFE = TRUE;
-	ETH->FC_b.RFE = TRUE;
-	ETH->FC_b.UP = TRUE;
+	ETH->FC_b.TFE = FALSE;//TRUE
+	ETH->FC_b.RFE = FALSE;//TRUE
+	ETH->FC_b.UP = FALSE;//TRUE
 }
 
 uint32_t ETH_PhyRead(uint32_t phyAddr, uint32_t phyReg) {
@@ -381,27 +388,44 @@ void ETH_PhyWrite(uint32_t phyAddr, uint32_t phyReg, uint32_t data) {
 	while (ETH->GMII_ADDR_b.BUSY) ;
 }
 
-
+void ETH_StructInit(ETH_InitTypeDef* init)
+{
+    init->ETH_Speed = ETH_SPEED_10M;
+    init->ETH_Duplex = ETH_DUPLEX_FULL;
+    init->ETH_JumboFrame = FALSE;
+    init->ETH_LinkUp = FALSE;
+    init->ETH_RxEn = TRUE;
+    init->ETH_TxEn = TRUE;
+    init->ETH_ChecksumOffload = FALSE;
+    init->ETH_Filter = 0;
+    init->ETH_MacAddr[0] = 0;
+    init->ETH_MacAddr[1] = 0;
+    init->ETH_MacAddr[2] = 0;
+    init->ETH_MacAddr[3] = 0;
+    init->ETH_MacAddr[4] = 0;
+    init->ETH_MacAddr[5] = 0;
+    
+}
 BOOL ETH_Init(ETH_InitTypeDef *init) {
-  assert_param(init);
-	assert_param(IS_ETH_SPEED(init->ETH_Speed));
-	assert_param(IS_ETH_DUPLEX(init->ETH_Duplex));
-	
-	mac_SwReset();
-	mac_SetConfig(init);
-	mac_SetMacAddr(init->ETH_MacAddr);
-	
-	mac_SetBurst(ETH_BURST_MODE_MIXED, 3, 4);
-	mac_SetPriority(TRUE, 0);
-	mac_SetDescMode(TRUE, 0);
-	mac_SetOpertionMode();
-  mac_SetFrameFilter(init->ETH_Filter);
-	mac_setFlowControl();
-	
-	return TRUE;
+    assert_param(init);
+    assert_param(IS_ETH_SPEED(init->ETH_Speed));
+    assert_param(IS_ETH_DUPLEX(init->ETH_Duplex));
+	
+    mac_SwReset();
+    mac_SetConfig(init);
+    mac_SetMacAddr(init->ETH_MacAddr);
+	
+    mac_SetBurst(ETH_BURST_MODE_MIXED, 3, 4);
+    mac_SetPriority(TRUE, 0);
+    mac_SetDescMode(TRUE, 0);
+    mac_SetOpertionMode();
+    mac_SetFrameFilter(init->ETH_Filter);
+    mac_setFlowControl();
+	
+    return TRUE;
 }
 
-void ETH_EnableInt(uint32_t Int, BOOL enable) {
+void ETH_ITConfig(uint32_t Int, BOOL enable) {
 	assert_param(IS_ETH_INT(Int));
 	
 	if (enable) {
@@ -426,7 +450,7 @@ void ETH_EnableInt(uint32_t Int, BOOL enable) {
 		}
 	}
 }
-BOOL ETH_GetIntStatus(uint32_t Int) {
+BOOL ETH_GetITStatus(uint32_t Int) {
 	assert_param(IS_ETH_INT(Int));
 	
 	Int &= ETH->INT_EN;
@@ -436,8 +460,7 @@ BOOL ETH_GetIntStatus(uint32_t Int) {
 	
 	return FALSE;
 }
-
-void ETH_ClearInt(uint32_t Int) {
+void ETH_ClearITPendingBit(uint32_t Int) {
 	uint32_t sta;
 	assert_param(IS_ETH_INT(Int));
 		
@@ -450,15 +473,15 @@ void ETH_ClearInt(uint32_t Int) {
 	
 	if (IS_ETH_INT_NORMAL(Int)) {
 		if (!IS_ETH_INT_NORMAL(sta)) {
-			// write 1 clear
-			ETH->STATUS_b.NIS = 1;
+			// write 1 clear NIS
+			ETH->STATUS = ETH_INT_NORMAL_SUMMARY;
 		}
 	}
 	
 	if (IS_ETH_INT_ABNORMAL(Int)) {
 		if (!IS_ETH_INT_ABNORMAL(sta)) {
-			// write 1 clear
-			ETH->STATUS_b.AIS = 1;
+			// write 1 clear AIS
+			ETH->STATUS = ETH_INT_ABNORMAL_SUMMARY;
 		}
 	}
 }
@@ -491,12 +514,25 @@ BOOL ETH_SetTxDescRing(ETH_TX_DESC *ring) {
 		return FALSE;
 	}
 
+  /* If code mapping */
+  ring = (ETH_TX_DESC *)GLB_ConvertToMappingFromAddr((uint32_t)ring);
+  buf = ring;
+  
 	do {
 		INNER_ETH_TX_DESC *desc = (INNER_ETH_TX_DESC *)buf;
+    uint8_t first = desc->TX_0.TX0_b.FS;
+    uint8_t last = desc->TX_0.TX0_b.LS;
+    
+    // clear all bits
+    desc->TX_0.TX0 = 0;
+    desc->TX_0.TX0_b.FS = first;
+    desc->TX_0.TX0_b.LS = last;
 		desc->TX_0.TX0_b.TCH = TRUE;
 		desc->TX_0.TX0_b.IC = TRUE;
 		desc->TX_0.TX0_b.OWN = ETH_DESC_OWN_BY_SELF;
 		
+    buf->bufAddr = GLB_ConvertToMappingFromAddr(buf->bufAddr);
+    buf->nextDescAddr = GLB_ConvertToMappingFromAddr(buf->nextDescAddr);
 		buf = (ETH_TX_DESC *)buf->nextDescAddr;
 	} while (buf != ring);
 	
@@ -553,6 +589,16 @@ void ETH_ReleaseTxDesc(ETH_TX_DESC *desc) {
 	inner->TX_0.TX0_b.OWN = ETH_DESC_OWN_BY_HW;
 }
 
+void ETH_SetTxDescBufAddr(ETH_TX_DESC *desc, uint32_t bufAddr) {
+	if (desc) {
+		desc->bufAddr = GLB_ConvertToMappingFromAddr(bufAddr);;
+	}
+}
+
+uint32_t ETH_GetTxDescBufAddr(ETH_TX_DESC *desc) {
+  return (desc ? GLB_ConvertToMappingToAddr(desc->bufAddr) : 0);
+}
+
 BOOL ETH_SetRxDescRing(ETH_RX_DESC *ring) {
 	ETH_RX_DESC *buf = ring;
 	
@@ -564,12 +610,17 @@ BOOL ETH_SetRxDescRing(ETH_RX_DESC *ring) {
 		return FALSE;
 	}
 
+  /* If code mapping */
+  ring = (ETH_RX_DESC *)GLB_ConvertToMappingFromAddr((uint32_t)ring);
+  buf = ring;
 	do {
 		INNER_ETH_RX_DESC *desc = (INNER_ETH_RX_DESC *)buf;
 		desc->RX_1.RX1_b.RCH = TRUE;
 		desc->RX_1.RX1_b.DIC = FALSE;
 		desc->RX_0.RX0_b.OWN = ETH_DESC_OWN_BY_HW;
 
+    buf->bufAddr = GLB_ConvertToMappingFromAddr(buf->bufAddr);
+    buf->nextDescAddr = GLB_ConvertToMappingFromAddr(buf->nextDescAddr);
 		buf = (ETH_RX_DESC *)buf->nextDescAddr;
 	} while (buf != ring);
 	
@@ -627,3 +678,15 @@ void ETH_ReleaseRxDesc(ETH_RX_DESC *desc) {
 }
 
 
+void ETH_SetRxDescBufAddr(ETH_RX_DESC *desc, uint32_t bufAddr) {
+	if (desc) {
+		desc->bufAddr = GLB_ConvertToMappingFromAddr(bufAddr);;
+	}
+}
+
+uint32_t ETH_GetRxDescBufAddr(ETH_RX_DESC *desc) {
+  return (desc ? GLB_ConvertToMappingToAddr(desc->bufAddr) : 0);
+}
+
+
+

+ 6 - 3
bsp/CME_M7/StdPeriph_Driver/src/cmem7_flash.c

@@ -108,7 +108,8 @@ static uint8_t flash_ReadInnerStatusHigh() {
 	return (uint8_t)NOR_FLASH->DATA;	
 }
 
-static void flash_WaitInWritting() {
+//static void flash_WaitInWritting() {
+void flash_WaitInWritting(void) {
 	FLASH_INNER_STATUS s;
 	
 	while (NOR_FLASH->STATUS_b.BUSY);
@@ -173,7 +174,8 @@ static void flash_RwReq(uint8_t cmd, uint32_t addr, uint16_t size) {
 	NOR_FLASH->TRIGGER_b.OP_START = TRUE;
 }
 
-static void flash_WaitReadFifoNotEmpty() {
+//static void flash_WaitReadFifoNotEmpty() {
+void flash_WaitReadFifoNotEmpty(void) {
 	while (NOR_FLASH->STATUS_b.RD_FIFO_EMPTY) {
 		if (wait) {
 			(*wait)();
@@ -181,7 +183,8 @@ static void flash_WaitReadFifoNotEmpty() {
 	}
 }
 
-static uint16_t flash_ReadFifo(uint16_t size, uint8_t* data) {
+//static uint16_t flash_ReadFifo(uint16_t size, uint8_t* data) {
+uint16_t flash_ReadFifo(uint16_t size, uint8_t* data) {
 	uint16_t count = 0;
 	
 	while (!NOR_FLASH->STATUS_b.RD_FIFO_EMPTY && size != 0) {

+ 75 - 0
bsp/CME_M7/StdPeriph_Driver/src/cmem7_gpio.c

@@ -179,3 +179,78 @@ void GPIO_EnablePwm(uint8_t Channel, BOOL Enable) {
 	}
 }
 
+/**
+   xjf 20150324
+   
+**/
+void GPIO_SetBits(uint32_t mask)
+{
+  static uint32_t g_GPIO_OUT_UNMASK;
+  static uint32_t g_GPIO_OUT_DATA;
+  static uint32_t g_GPIO_OE;
+	
+	g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
+  g_GPIO_OUT_DATA   = GPIO->GPIO_OUT_DATA   ;
+	g_GPIO_OE         = GPIO->GPIO_OE ;
+  g_GPIO_OUT_UNMASK |=mask;  
+  g_GPIO_OE         |=mask;
+	g_GPIO_OUT_DATA   |=mask;
+	
+	GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
+  GPIO->GPIO_OUT_DATA   =g_GPIO_OUT_DATA ;
+	GPIO->GPIO_OE         =g_GPIO_OE       ;
+}
+
+void GPIO_clrBits(uint32_t mask)
+{
+  static uint32_t g_GPIO_OUT_UNMASK;
+  static uint32_t g_GPIO_OUT_DATA;
+  static uint32_t g_GPIO_OE;
+	
+	g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
+  g_GPIO_OUT_DATA   = GPIO->GPIO_OUT_DATA   ;
+	g_GPIO_OE         = GPIO->GPIO_OE ;
+  g_GPIO_OUT_UNMASK |=mask;  
+  g_GPIO_OE         |=mask;
+	g_GPIO_OUT_DATA   &=(~ mask);
+	
+	GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
+  GPIO->GPIO_OUT_DATA   =g_GPIO_OUT_DATA ;
+	GPIO->GPIO_OE         =g_GPIO_OE       ;
+}
+
+uint32_t GPIO_getBits(uint32_t mask)
+{
+  static uint32_t g_GPIO_OUT_UNMASK;
+  //static uint32_t g_GPIO_OUT_DATA;
+  static uint32_t g_GPIO_OE;
+	
+	uint32_t  get_delay = 0;
+	uint32_t  saved_mask;
+	
+	saved_mask=mask;
+	
+	g_GPIO_OUT_UNMASK      = GPIO->GPIO_OUT_UNMASK ;
+	g_GPIO_OE              = GPIO->GPIO_OE ;
+  g_GPIO_OUT_UNMASK     &=(~mask);  
+  g_GPIO_OE             &=(~mask);
+	GPIO->GPIO_OUT_UNMASK  =g_GPIO_OUT_UNMASK ;
+	GPIO->GPIO_OE          =g_GPIO_OE       ;
+	for(get_delay=0;get_delay<100;get_delay++)
+	  {
+    }
+	//get_delay=(GPIO->GPIO_IN)&saved_mask;
+  if(((GPIO->GPIO_IN)&saved_mask)==saved_mask)	
+	   {
+			 return(1);
+	    }		
+	else
+   	{
+			return(0);
+    }
+	
+}
+/**
+   xjf 20150324
+   
+**/

+ 45 - 1
bsp/CME_M7/StdPeriph_Driver/src/cmem7_misc.c

@@ -92,8 +92,20 @@ void NVIC_SystemLPConfig(uint8_t LowPowerMode, BOOL NewState)
 	}
 }
 
+#define DEF_IBUS_OFFSET     0x1FFE0000
+#define DEF_EXT_ADDR        0x08020000
+static BOOL isMappingOn() {
+  /* If default values aren't changed */
+  if ((GLOBAL_CTRL->IBUSOFF == DEF_IBUS_OFFSET) && 
+    (GLOBAL_CTRL->EXTADDR == DEF_EXT_ADDR)) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
 void GLB_MMAP(uint32_t from, uint32_t to, BOOL isIcacheOn) {
-	int n;
+	volatile int n;
 	
 	GLOBAL_CTRL->IBUSOFF = GLOBAL_CTRL->DBUSOFF = (from - to);
 	GLOBAL_CTRL->EXTADDR = to;
@@ -104,6 +116,38 @@ void GLB_MMAP(uint32_t from, uint32_t to, BOOL isIcacheOn) {
 	for (n = 0; n < 100; n++);
 }
 
+/*
+ * ------------------------------------------------------------------
+ * | 0 - 0x20000 | --> 0x20000000 | -> 0x40000000 | -> 0xFFFFFFFF   |
+ * |  code SRAM  | map to region  | data SRAM     | map from region |
+ * ------------------------------------------------------------------
+ */
+#define MAPPING_FROM_REGION_START   0x40000000
+#define MAPPING_TO_REGION_END       0x20000000
+uint32_t GLB_ConvertToMappingFromAddr(uint32_t to) {
+  if (!isMappingOn()) {
+    return to;
+  }
+  
+  if ((to > MAPPING_TO_REGION_END) || (to < GLOBAL_CTRL->EXTADDR)) {
+    return to;
+  }
+  
+  return (to + GLOBAL_CTRL->IBUSOFF);
+}
+
+uint32_t GLB_ConvertToMappingToAddr(uint32_t from) {
+  if (!isMappingOn()) {
+    return from;
+  }
+  
+  if (from < MAPPING_FROM_REGION_START) {
+    return from;
+  }
+  
+  return (from - GLOBAL_CTRL->IBUSOFF);
+}
+
 void GLB_SetNmiIrqNum(uint32_t irq) {
 	GLOBAL_CTRL->NMI_SEL_b.NMI = irq;
 }

+ 5 - 5
bsp/CME_M7/StdPeriph_Driver/src/cmem7_rtc.c

@@ -28,7 +28,7 @@
 
 #define SECONDS_IN_A_DAY                (86400)
 
-void RTC_EnableInt(uint32_t Int, BOOL Enable) {
+void RTC_ITConfig(uint32_t Int, BOOL Enable) {
 	assert_param(IS_RTC_INT(Int));  
 	
 	if (Enable) {
@@ -38,7 +38,7 @@ void RTC_EnableInt(uint32_t Int, BOOL Enable) {
 	}
 }
 
-BOOL RTC_GetIntStatus(uint32_t Int) {
+BOOL RTC_GetITStatus(uint32_t Int) {
 	assert_param(IS_RTC_INT(Int)); 
 	
 	if (0 != (RTC->INT_STATUS & Int)) {
@@ -48,7 +48,7 @@ BOOL RTC_GetIntStatus(uint32_t Int) {
 	return FALSE;
 }
 
-void RTC_ClearInt(uint32_t Int) {
+void RTC_ClearITPendingBit(uint32_t Int) {
   assert_param(IS_RTC_INT(Int));  
 	
 	RTC->INT_STATUS = Int;
@@ -58,6 +58,6 @@ uint32_t RTC_GetSecond() {
 	return RTC->SECOND;
 }
 
-uint16_t RTC_GetMicroSecond() {
-	return RTC->MICROSECOND_b.MS;
+uint16_t RTC_GetMillSecond() {
+	return RTC->MILLSECOND_b.MS;
 }

+ 11 - 6
bsp/CME_M7/StdPeriph_Driver/src/cmem7_wdg.c

@@ -30,29 +30,34 @@ static uint32_t wdg_GetClock() {
 	return SYSTEM_CLOCK_FREQ / (1 << (GLOBAL_CTRL->CLK_SEL_0_b.WDG_CLK + 1));
 }
 
-void WDG_Init(uint8_t trigger, uint16_t ResetMicroSecond) {
+void WDG_DeInit(void){
+  SOFT_RESET->SOFTRST_b.WDT_n = 0;
+	SOFT_RESET->SOFTRST_b.WDT_n = 1;
+}
+
+void WDG_Init(uint8_t trigger, uint16_t ResetMillSecond) {
 	assert_param(IS_WDG_TRIGGER_MODE(trigger));
 	
 	WDG->INT_CTRL_b.TRIGGER_MODE = trigger;
-	WDG->LEN = ((uint64_t)wdg_GetClock()) * ResetMicroSecond / 1000;
+	WDG->LEN = ((uint64_t)wdg_GetClock()) * ResetMillSecond / 1000;
 }
 
-void WDG_EnableInt(uint8_t Int, BOOL Enable) {
+void WDG_ITConfig(uint8_t Int, BOOL Enable) {
 	assert_param(IS_WDG_INT(Int));
 	
 	WDG->CTRL_b.INT_LEN = Int;
 	WDG->INT_CTRL_b.MASK = !Enable;
 }
 
-BOOL WDG_GetIntStatus() {
+BOOL WDG_GetITStatus() {
 	return (WDG->INT_STA_b.STA == 1) ? TRUE : FALSE;
 }
 
-void WDG_ClearInt() {
+void WDG_ClearITPendingBit() {
 	WDG->INT_STA_b.STA = 1;
 }
 
-void WDG_Enable(BOOL Enable) {
+void WDG_Cmd(BOOL Enable) {
 	WDG->CTRL_b.EN = Enable;
 }
 

+ 17 - 17
bsp/CME_M7/drivers/emac.c

@@ -205,14 +205,14 @@ static rt_err_t rt_cme_eth_init(rt_device_t dev)
     RxDescChainInit();
     TxDescChainInit();
 
-    ETH_EnableInt(ETH_INT_BUS_FATAL_ERROR, TRUE);
+    ETH_ITConfig(ETH_INT_BUS_FATAL_ERROR, TRUE);
 
-    ETH_EnableInt(ETH_INT_RX_COMPLETE_FRAME, TRUE);
-    ETH_EnableInt(ETH_INT_RX_BUF_UNAVAI, TRUE);
-    ETH_EnableInt(ETH_INT_RX_STOP, TRUE);
+    ETH_ITConfig(ETH_INT_RX_COMPLETE_FRAME, TRUE);
+    ETH_ITConfig(ETH_INT_RX_BUF_UNAVAI, TRUE);
+    ETH_ITConfig(ETH_INT_RX_STOP, TRUE);
     ETH_StartRx();
 
-    ETH_EnableInt(ETH_INT_TX_COMPLETE_FRAME, TRUE);
+    ETH_ITConfig(ETH_INT_TX_COMPLETE_FRAME, TRUE);
     ETH_StartTx();
 
     return RT_EOK;
@@ -318,8 +318,8 @@ struct pbuf *rt_cme_eth_rx(rt_device_t dev)
     desc = ETH_AcquireFreeRxDesc();
     if(desc == RT_NULL)
     {
-        ETH_EnableInt(ETH_INT_RX_COMPLETE_FRAME, TRUE);
-        ETH_EnableInt(ETH_INT_RX_BUF_UNAVAI, TRUE);
+        ETH_ITConfig(ETH_INT_RX_COMPLETE_FRAME, TRUE);
+        ETH_ITConfig(ETH_INT_RX_BUF_UNAVAI, TRUE);
         ETH_ResumeRx();
         goto _exit;
     }
@@ -414,28 +414,28 @@ void ETH_IRQHandler(void)
     /* enter interrupt */
     rt_interrupt_enter();
 
-    if (ETH_GetIntStatus(ETH_INT_TX_COMPLETE_FRAME))
+    if (ETH_GetITStatus(ETH_INT_TX_COMPLETE_FRAME))
     {
         rt_sem_release(&cme_eth_device.tx_buf_free);
-        ETH_ClearInt(ETH_INT_TX_COMPLETE_FRAME);
+        ETH_ClearITPendingBit(ETH_INT_TX_COMPLETE_FRAME);
     }
 
-    if (ETH_GetIntStatus(ETH_INT_RX_STOP))
+    if (ETH_GetITStatus(ETH_INT_RX_STOP))
     {
         CME_ETH_PRINTF("ETH_INT_RX_STOP\n");
-        ETH_ClearInt(ETH_INT_RX_STOP);
+        ETH_ClearITPendingBit(ETH_INT_RX_STOP);
     }
 
-    if ((ETH_GetIntStatus(ETH_INT_RX_BUF_UNAVAI)) ||
-            (ETH_GetIntStatus(ETH_INT_RX_COMPLETE_FRAME)))
+    if ((ETH_GetITStatus(ETH_INT_RX_BUF_UNAVAI)) ||
+            (ETH_GetITStatus(ETH_INT_RX_COMPLETE_FRAME)))
     {
         /* a frame has been received */
         eth_device_ready(&(cme_eth_device.parent));
 
-        ETH_EnableInt(ETH_INT_RX_COMPLETE_FRAME, FALSE);
-        ETH_EnableInt(ETH_INT_RX_BUF_UNAVAI, FALSE);
-        ETH_ClearInt(ETH_INT_RX_BUF_UNAVAI);
-        ETH_ClearInt(ETH_INT_RX_COMPLETE_FRAME);
+        ETH_ITConfig(ETH_INT_RX_COMPLETE_FRAME, FALSE);
+        ETH_ITConfig(ETH_INT_RX_BUF_UNAVAI, FALSE);
+        ETH_ClearITPendingBit(ETH_INT_RX_BUF_UNAVAI);
+        ETH_ClearITPendingBit(ETH_INT_RX_COMPLETE_FRAME);
     }
 
     /* leave interrupt */

File diff suppressed because it is too large
+ 332 - 306
bsp/CME_M7/project.uvopt


+ 167 - 174
bsp/CME_M7/project.uvproj

@@ -136,10 +136,9 @@
             <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
             <RestoreFunctions>0</RestoreFunctions>
             <RestoreToolbox>1</RestoreToolbox>
-            <RestoreTracepoints>1</RestoreTracepoints>
           </Target>
           <RunDebugAfterBuild>0</RunDebugAfterBuild>
-          <TargetSelection>-1</TargetSelection>
+          <TargetSelection>15</TargetSelection>
           <SimDlls>
             <CpuDll></CpuDll>
             <CpuDllArguments></CpuDllArguments>
@@ -165,7 +164,6 @@
             <Capability>1</Capability>
             <DriverSelection>4097</DriverSelection>
           </Flash1>
-          <bUseTDR>0</bUseTDR>
           <Flash2>BIN\UL2CM3.DLL</Flash2>
           <Flash3>"" ()</Flash3>
           <Flash4></Flash4>
@@ -351,7 +349,7 @@
               <MiscControls></MiscControls>
               <Define>RT_USING_ARM_LIBC</Define>
               <Undefine></Undefine>
-              <IncludePath>applications;.;CMSIS\CME_M7;..\..\components\CMSIS\Include;drivers;StdPeriph_Driver\inc;..\..\include;..\..\libcpu\arm\cortex-m3;..\..\libcpu\arm\common;..\..\components\drivers\include;..\..\components\drivers\include;..\..\components\finsh;..\..\components\init;..\..\components\libc\armlibc;..\..\components\net\lwip-1.4.1\src;..\..\components\net\lwip-1.4.1\src\include;..\..\components\net\lwip-1.4.1\src\include\ipv4;..\..\components\net\lwip-1.4.1\src\arch\include;..\..\components\net\lwip-1.4.1\src\include\netif</IncludePath>
+              <IncludePath>StdPeriph_Driver/inc;applications;.;drivers;CMSIS/CME_M7;../../components/CMSIS/Include;../../include;../../libcpu/arm/cortex-m3;../../libcpu/arm/common;../../components/libc/armlibc;../../components/drivers/include;../../components/drivers/include;../../components/finsh;../../components/net/lwip-1.4.1/src;../../components/net/lwip-1.4.1/src/include;../../components/net/lwip-1.4.1/src/include/ipv4;../../components/net/lwip-1.4.1/src/arch/include;../../components/net/lwip-1.4.1/src/include/netif</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -382,7 +380,7 @@
             <ScatterFile>CME_M7.sct</ScatterFile>
             <IncludeLibs></IncludeLibs>
             <IncludeLibsPath></IncludeLibsPath>
-            <Misc> --keep __fsym_* --keep __vsym_*   --keep __rt_init* </Misc>
+            <Misc> --keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
             <LinkerInputFile></LinkerInputFile>
             <DisabledWarnings></DisabledWarnings>
           </LDads>
@@ -390,152 +388,152 @@
       </TargetOption>
       <Groups>
         <Group>
-          <GroupName>Applications</GroupName>
+          <GroupName>StdPeriph_Driver</GroupName>
           <Files>
             <File>
-              <FileName>application.c</FileName>
+              <FileName>cmem7_adc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_adc.c</FilePath>
             </File>
             <File>
-              <FileName>led.c</FileName>
+              <FileName>cmem7_aes.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\led.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_aes.c</FilePath>
             </File>
             <File>
-              <FileName>startup.c</FileName>
+              <FileName>cmem7_can.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_can.c</FilePath>
             </File>
-          </Files>
-        </Group>
-        <Group>
-          <GroupName>CMSIS</GroupName>
-          <Files>
             <File>
-              <FileName>system_cmem7.c</FileName>
+              <FileName>cmem7_ddr.c</FileName>
               <FileType>1</FileType>
-              <FilePath>CMSIS\CME_M7\system_cmem7.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_ddr.c</FilePath>
             </File>
             <File>
-              <FileName>startup_cmem7.s</FileName>
-              <FileType>2</FileType>
-              <FilePath>CMSIS\CME_M7\startup\arm\startup_cmem7.s</FilePath>
+              <FileName>cmem7_dma.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>StdPeriph_Driver/src/cmem7_dma.c</FilePath>
             </File>
-          </Files>
-        </Group>
-        <Group>
-          <GroupName>Drivers</GroupName>
-          <Files>
             <File>
-              <FileName>board.c</FileName>
+              <FileName>cmem7_efuse.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\board.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_efuse.c</FilePath>
             </File>
             <File>
-              <FileName>uart.c</FileName>
+              <FileName>cmem7_eth.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\uart.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_eth.c</FilePath>
             </File>
             <File>
-              <FileName>emac.c</FileName>
+              <FileName>cmem7_flash.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\emac.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_flash.c</FilePath>
             </File>
             <File>
-              <FileName>app_phy.c</FileName>
+              <FileName>cmem7_gpio.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\app_phy.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_gpio.c</FilePath>
             </File>
-          </Files>
-        </Group>
-        <Group>
-          <GroupName>StdPeriph_Driver</GroupName>
-          <Files>
             <File>
-              <FileName>cmem7_adc.c</FileName>
+              <FileName>cmem7_i2c.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_adc.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_i2c.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_aes.c</FileName>
+              <FileName>cmem7_misc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_aes.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_misc.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_can.c</FileName>
+              <FileName>cmem7_rtc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_can.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_rtc.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_ddr.c</FileName>
+              <FileName>cmem7_spi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_ddr.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_spi.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_dma.c</FileName>
+              <FileName>cmem7_tim.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_dma.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_tim.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_efuse.c</FileName>
+              <FileName>cmem7_uart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_efuse.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_uart.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_eth.c</FileName>
+              <FileName>cmem7_usb.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_eth.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_usb.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_flash.c</FileName>
+              <FileName>cmem7_wdg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_flash.c</FilePath>
+              <FilePath>StdPeriph_Driver/src/cmem7_wdg.c</FilePath>
             </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
             <File>
-              <FileName>cmem7_gpio.c</FileName>
+              <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_gpio.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_i2c.c</FileName>
+              <FileName>led.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_i2c.c</FilePath>
+              <FilePath>applications/led.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_misc.c</FileName>
+              <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_misc.c</FilePath>
+              <FilePath>applications/startup.c</FilePath>
             </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
             <File>
-              <FileName>cmem7_rtc.c</FileName>
+              <FileName>board.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_rtc.c</FilePath>
+              <FilePath>drivers/board.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_spi.c</FileName>
+              <FileName>uart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_spi.c</FilePath>
+              <FilePath>drivers/uart.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_tim.c</FileName>
+              <FileName>emac.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_tim.c</FilePath>
+              <FilePath>drivers/emac.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_uart.c</FileName>
+              <FileName>app_phy.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_uart.c</FilePath>
+              <FilePath>drivers/app_phy.c</FilePath>
             </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>CMSIS</GroupName>
+          <Files>
             <File>
-              <FileName>cmem7_usb.c</FileName>
+              <FileName>system_cmem7.c</FileName>
               <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_usb.c</FilePath>
+              <FilePath>CMSIS/CME_M7/system_cmem7.c</FilePath>
             </File>
             <File>
-              <FileName>cmem7_wdg.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>StdPeriph_Driver\src\cmem7_wdg.c</FilePath>
+              <FileName>startup_cmem7.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>CMSIS/CME_M7/startup/arm/startup_cmem7.s</FilePath>
             </File>
           </Files>
         </Group>
@@ -545,62 +543,67 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
             </File>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -610,27 +613,42 @@
             <File>
               <FileName>cpuport.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\cpuport.c</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/cpuport.c</FilePath>
             </File>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/context_rvds.S</FilePath>
             </File>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>libc</GroupName>
+          <Files>
+            <File>
+              <FileName>mem_std.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/libc/armlibc/mem_std.c</FilePath>
+            </File>
+            <File>
+              <FileName>stubs.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/libc/armlibc/stubs.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -640,37 +658,37 @@
             <File>
               <FileName>serial.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\serial\serial.c</FilePath>
+              <FilePath>../../components/drivers/serial/serial.c</FilePath>
             </File>
             <File>
               <FileName>completion.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\completion.c</FilePath>
+              <FilePath>../../components/drivers/src/completion.c</FilePath>
             </File>
             <File>
               <FileName>dataqueue.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\dataqueue.c</FilePath>
+              <FilePath>../../components/drivers/src/dataqueue.c</FilePath>
             </File>
             <File>
               <FileName>pipe.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\pipe.c</FilePath>
+              <FilePath>../../components/drivers/src/pipe.c</FilePath>
             </File>
             <File>
               <FileName>portal.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\portal.c</FilePath>
+              <FilePath>../../components/drivers/src/portal.c</FilePath>
             </File>
             <File>
               <FileName>ringbuffer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\ringbuffer.c</FilePath>
+              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
             </File>
             <File>
               <FileName>workqueue.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\workqueue.c</FilePath>
+              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -680,102 +698,77 @@
             <File>
               <FileName>shell.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
+              <FilePath>../../components/finsh/shell.c</FilePath>
             </File>
             <File>
               <FileName>symbol.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
             </File>
             <File>
               <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
             <File>
               <FileName>msh_cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\msh_cmd.c</FilePath>
+              <FilePath>../../components/finsh/msh_cmd.c</FilePath>
             </File>
             <File>
               <FileName>msh.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\msh.c</FilePath>
+              <FilePath>../../components/finsh/msh.c</FilePath>
             </File>
             <File>
               <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
             <File>
               <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
             <File>
               <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
             <File>
               <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
             <File>
               <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
             <File>
               <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
             <File>
               <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
             <File>
               <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
             <File>
               <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
             <File>
               <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
-            </File>
-          </Files>
-        </Group>
-        <Group>
-          <GroupName>Components</GroupName>
-          <Files>
-            <File>
-              <FileName>components.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\init\components.c</FilePath>
-            </File>
-          </Files>
-        </Group>
-        <Group>
-          <GroupName>libc</GroupName>
-          <Files>
-            <File>
-              <FileName>mem_std.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\libc\armlibc\mem_std.c</FilePath>
-            </File>
-            <File>
-              <FileName>stubs.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\libc\armlibc\stubs.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -785,177 +778,177 @@
             <File>
               <FileName>api_lib.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\api\api_lib.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_lib.c</FilePath>
             </File>
             <File>
               <FileName>api_msg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\api\api_msg.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_msg.c</FilePath>
             </File>
             <File>
               <FileName>err.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\api\err.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/err.c</FilePath>
             </File>
             <File>
               <FileName>netbuf.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\api\netbuf.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netbuf.c</FilePath>
             </File>
             <File>
               <FileName>netdb.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\api\netdb.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netdb.c</FilePath>
             </File>
             <File>
               <FileName>netifapi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\api\netifapi.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netifapi.c</FilePath>
             </File>
             <File>
               <FileName>sockets.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\api\sockets.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/sockets.c</FilePath>
             </File>
             <File>
               <FileName>tcpip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\api\tcpip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/tcpip.c</FilePath>
             </File>
             <File>
               <FileName>sys_arch.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\arch\sys_arch.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/arch/sys_arch.c</FilePath>
             </File>
             <File>
               <FileName>def.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\def.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/def.c</FilePath>
             </File>
             <File>
               <FileName>dhcp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\dhcp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dhcp.c</FilePath>
             </File>
             <File>
               <FileName>dns.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\dns.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dns.c</FilePath>
             </File>
             <File>
               <FileName>init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\init.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/init.c</FilePath>
             </File>
             <File>
               <FileName>memp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\memp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/memp.c</FilePath>
             </File>
             <File>
               <FileName>netif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\netif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/netif.c</FilePath>
             </File>
             <File>
               <FileName>pbuf.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\pbuf.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/pbuf.c</FilePath>
             </File>
             <File>
               <FileName>raw.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\raw.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/raw.c</FilePath>
             </File>
             <File>
               <FileName>stats.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\stats.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/stats.c</FilePath>
             </File>
             <File>
               <FileName>sys.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\sys.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/sys.c</FilePath>
             </File>
             <File>
               <FileName>tcp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\tcp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp.c</FilePath>
             </File>
             <File>
               <FileName>tcp_in.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\tcp_in.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_in.c</FilePath>
             </File>
             <File>
               <FileName>tcp_out.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\tcp_out.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_out.c</FilePath>
             </File>
             <File>
               <FileName>timers.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\timers.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/timers.c</FilePath>
             </File>
             <File>
               <FileName>udp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\udp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/udp.c</FilePath>
             </File>
             <File>
               <FileName>autoip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\ipv4\autoip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/autoip.c</FilePath>
             </File>
             <File>
               <FileName>icmp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\ipv4\icmp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/icmp.c</FilePath>
             </File>
             <File>
               <FileName>igmp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\ipv4\igmp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/igmp.c</FilePath>
             </File>
             <File>
               <FileName>inet.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\ipv4\inet.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet.c</FilePath>
             </File>
             <File>
               <FileName>inet_chksum.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\ipv4\inet_chksum.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet_chksum.c</FilePath>
             </File>
             <File>
               <FileName>ip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\ipv4\ip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip.c</FilePath>
             </File>
             <File>
               <FileName>ip_addr.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\ipv4\ip_addr.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_addr.c</FilePath>
             </File>
             <File>
               <FileName>ip_frag.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\core\ipv4\ip_frag.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_frag.c</FilePath>
             </File>
             <File>
               <FileName>etharp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\netif\etharp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/etharp.c</FilePath>
             </File>
             <File>
               <FileName>ethernetif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\netif\ethernetif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/ethernetif.c</FilePath>
             </File>
             <File>
               <FileName>slipif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip-1.4.1\src\netif\slipif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/slipif.c</FilePath>
             </File>
           </Files>
         </Group>

+ 1 - 1
bsp/CME_M7/rtconfig.py

@@ -24,7 +24,7 @@ if os.getenv('RTT_EXEC_PATH'):
 if os.getenv('RTT_ROOT'):
     RTT_ROOT = os.getenv('RTT_ROOT')
 else:
-    RTT_ROOT = os.path.normpath(os.getcwd())
+    RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')
 
 BUILD = 'debug'
 

+ 930 - 0
bsp/asm9260t/project.uvproj

@@ -0,0 +1,930 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+  <SchemaVersion>1.1</SchemaVersion>
+  <Header>### uVision Project, (C) Keil Software</Header>
+  <Targets>
+    <Target>
+      <TargetName>rtthread</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>AT91SAM9260</Device>
+          <Vendor>Atmel</Vendor>
+          <Cpu>IRAM(0x200000-0x200FFF) IRAM2(0x300000-0x300FFF) IROM(0x100000-0x107FFF) CLOCK(18432000) CPUTYPE(ARM926EJ-S)</Cpu>
+          <FlashUtilSpec />
+          <StartupFile>"STARTUP\Atmel\SAM9260.s" ("Atmel AT91SAM9260 Startup Code")</StartupFile>
+          <FlashDriverDll>UL2ARM(-UV2077N9E -O47 -S0 -C0 -N00("ARM926EJ-S Core") -D00(0792603F) -L00(4) -FO7 -FD300000 -FC1000 -FN1 -FF0AT91SAM9_DF_P1056_CS1 -FS020000000 -FL083BE00)</FlashDriverDll>
+          <DeviceId>4210</DeviceId>
+          <RegisterFile>AT91SAM9260.H</RegisterFile>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile />
+          <bCustSvd>0</bCustSvd>
+          <UseEnv>0</UseEnv>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
+          <RegisterFilePath>Atmel\SAM9260\</RegisterFilePath>
+          <DBRegisterFilePath>Atmel\SAM9260\</DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\Objects\</OutputDirectory>
+          <OutputName>template</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\Listings\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopB1X>0</nStopB1X>
+            <nStopB2X>0</nStopB2X>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString />
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument />
+          <IncludeLibraryModules />
+          <ComprImg>1</ComprImg>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARM.DLL</SimDllName>
+          <SimDllArguments>-cAT91SAM9260</SimDllArguments>
+          <SimDlgDll>DARMATS9.DLL</SimDlgDll>
+          <SimDlgDllArguments>-p91SAM9260</SimDlgDllArguments>
+          <TargetDllName>SARM.DLL</TargetDllName>
+          <TargetDllArguments />
+          <TargetDlgDll>TARMATS9.DLL</TargetDlgDll>
+          <TargetDlgDllArguments>-p91SAM9260</TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>0</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+            <RestoreSysVw>1</RestoreSysVw>
+          </Simulator>
+          <Target>
+            <UseTarget>1</UseTarget>
+            <LoadApplicationAtStartup>0</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>1</RestoreTracepoints>
+            <RestoreSysVw>1</RestoreSysVw>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>5</TargetSelection>
+          <SimDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile>.\jlink\at91sam9260.ini</InitializationFile>
+            <Driver>Segger\JLTAgdi.dll</Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4096</DriverSelection>
+          </Flash1>
+          <bUseTDR>1</bUseTDR>
+          <Flash2>BIN\UL2ARM.DLL</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4>.\jlink\at91sam9260.ini</Flash4>
+          <pFcarmOut />
+          <pFcarmGrp />
+          <pFcArmRoot />
+          <FcArmLst>0</FcArmLst>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>ARM926EJ-S</AdsCpuType>
+            <RvctDeviceName />
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>1</hadIROM>
+            <hadIRAM>1</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>1</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>8</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>0</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>3</RoSelD>
+            <RwSelD>3</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x200000</StartAddress>
+                <Size>0x1000</Size>
+              </IRAM>
+              <IROM>
+                <Type>1</Type>
+                <StartAddress>0x100000</StartAddress>
+                <Size>0x8000</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x800000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x100000</StartAddress>
+                <Size>0x8000</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20800000</StartAddress>
+                <Size>0x1800000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x200000</StartAddress>
+                <Size>0x1000</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x300000</StartAddress>
+                <Size>0x1000</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector />
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>1</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>2</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <uC99>0</uC99>
+            <useXO>0</useXO>
+            <VariousControls>
+              <MiscControls />
+              <Define>RT_USING_ARM_LIBC</Define>
+              <Undefine />
+              <IncludePath>applications;.;drivers;platform;../../include;../../libcpu/arm/arm926;../../libcpu/arm/common;../../components/pthreads;../../components/libc/armlibc;../../components/drivers/include;../../components/drivers/include;../../components/drivers/include;../../components/finsh</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <useXO>0</useXO>
+            <VariousControls>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>0</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x20000000</TextAddressRange>
+            <DataAddressRange>0x20800000</DataAddressRange>
+            <pXoBase />
+            <ScatterFile>.\at91sam9260_ram.scat</ScatterFile>
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
+            <File>
+              <FileName>application.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/application.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/startup.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/board.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>usart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/usart.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>led.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/led.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>platform</GroupName>
+          <Files>
+            <File>
+              <FileName>gpio.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>platform/gpio.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>interrupt.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>platform/interrupt.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>reset.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>platform/reset.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>rt_low_level_init.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>platform/rt_low_level_init.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>system_clock.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>platform/system_clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>timer0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>platform/timer0.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>platform/uart.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Kernel</GroupName>
+          <Files>
+            <File>
+              <FileName>clock.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>device.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/device.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>idle.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/idle.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ipc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/ipc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>irq.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/irq.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>kservice.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/kservice.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mempool.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/mempool.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>object.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/object.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>scheduler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/scheduler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>slab.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/slab.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>thread.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/thread.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/timer.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>ARM926</GroupName>
+          <Files>
+            <File>
+              <FileName>cpuport.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/arm926/cpuport.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mmu.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/arm926/mmu.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>stack.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/arm926/stack.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>trap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/arm926/trap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>context_rvds.S</FileName>
+              <FileType>2</FileType>
+              <FilePath>../../libcpu/arm/arm926/context_rvds.S</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>start_rvds.S</FileName>
+              <FileType>2</FileType>
+              <FilePath>../../libcpu/arm/arm926/start_rvds.S</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>backtrace.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>div0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>showmem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>pthreads</GroupName>
+          <Files>
+            <File>
+              <FileName>clock_time.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/clock_time.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/mqueue.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_attr.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_attr.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_barrier.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_barrier.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_cond.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_cond.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_mutex.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_mutex.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_rwlock.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_rwlock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_spin.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_spin.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_tls.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_tls.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>sched.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/sched.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>semaphore.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/semaphore.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>libc</GroupName>
+          <Files>
+            <File>
+              <FileName>mem_std.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/libc/armlibc/mem_std.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>stubs.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/libc/armlibc/stubs.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>DeviceDrivers</GroupName>
+          <Files>
+            <File>
+              <FileName>serial.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/serial/serial.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>i2c_core.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/i2c/i2c_core.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>i2c_dev.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/i2c/i2c_dev.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>i2c-bit-ops.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/i2c/i2c-bit-ops.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>completion.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/completion.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dataqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/dataqueue.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pipe.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/pipe.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>portal.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/portal.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ringbuffer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>workqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>cmd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_compiler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_error.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_heap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_init.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_node.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_ops.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_parser.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_var.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_vm.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_token.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+</Project>

+ 68 - 54
bsp/frdm-k64f/project.uvproj

@@ -354,7 +354,7 @@
               <MiscControls />
               <Define />
               <Undefine />
-              <IncludePath>.;..\..\components\drivers\include;..\..\components\finsh;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m4;applications;board;device;device\MK64F12</IncludePath>
+              <IncludePath>board;applications;.;device;device/MK64F12;../../include;../../libcpu/arm/cortex-m4;../../libcpu/arm/common;../../components/drivers/include;../../components/drivers/include;../../components/finsh</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -385,7 +385,7 @@
             <ScatterFile />
             <IncludeLibs />
             <IncludeLibsPath />
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
             <LinkerInputFile />
             <DisabledWarnings />
           </LDads>
@@ -393,43 +393,43 @@
       </TargetOption>
       <Groups>
         <Group>
-          <GroupName>Applications</GroupName>
+          <GroupName>Board</GroupName>
           <Files>
             <File>
-              <FileName>application.c</FileName>
+              <FileName>board.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
+              <FilePath>board/board.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>startup.c</FileName>
+              <FileName>drv_uart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>board/drv_uart.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>Board</GroupName>
           <Files>
             <File>
-              <FileName>board.c</FileName>
+              <FileName>led.c</FileName>
               <FileType>1</FileType>
-              <FilePath>board\board.c</FilePath>
+              <FilePath>board/led.c</FilePath>
             </File>
           </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
           <Files>
             <File>
-              <FileName>drv_uart.c</FileName>
+              <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>board\drv_uart.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>led.c</FileName>
+              <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>board\led.c</FilePath>
+              <FilePath>applications/startup.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -439,14 +439,14 @@
             <File>
               <FileName>system_MK64F12.c</FileName>
               <FileType>1</FileType>
-              <FilePath>device\MK64F12\system_MK64F12.c</FilePath>
+              <FilePath>device/MK64F12/system_MK64F12.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>startup_MK64F12.s</FileName>
               <FileType>2</FileType>
-              <FilePath>device\TOOLCHAIN_ARM_STD\startup_MK64F12.s</FilePath>
+              <FilePath>device/TOOLCHAIN_ARM_STD/startup_MK64F12.s</FilePath>
             </File>
           </Files>
         </Group>
@@ -456,84 +456,91 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -543,35 +550,35 @@
             <File>
               <FileName>cpuport.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m4\cpuport.c</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m4/cpuport.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m4\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m4/context_rvds.S</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -581,42 +588,49 @@
             <File>
               <FileName>serial.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\serial\serial.c</FilePath>
+              <FilePath>../../components/drivers/serial/serial.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>completion.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\completion.c</FilePath>
+              <FilePath>../../components/drivers/src/completion.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>dataqueue.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\dataqueue.c</FilePath>
+              <FilePath>../../components/drivers/src/dataqueue.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>pipe.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\pipe.c</FilePath>
+              <FilePath>../../components/drivers/src/pipe.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>portal.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\portal.c</FilePath>
+              <FilePath>../../components/drivers/src/portal.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>ringbuffer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\ringbuffer.c</FilePath>
+              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>workqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -626,91 +640,91 @@
             <File>
               <FileName>shell.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
+              <FilePath>../../components/finsh/shell.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>symbol.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>

+ 116 - 116
bsp/lm4f232/project.uvproj

@@ -343,7 +343,7 @@
               <MiscControls />
               <Define>PART_LM4F232H5QD</Define>
               <Undefine />
-              <IncludePath>.;..\..\components\finsh;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m4;Libraries;applications;drivers</IncludePath>
+              <IncludePath>Libraries;applications;.;drivers;../../include;../../libcpu/arm/cortex-m4;../../libcpu/arm/common;../../components/finsh</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -373,257 +373,257 @@
             <ScatterFile />
             <IncludeLibs />
             <IncludeLibsPath />
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
             <LinkerInputFile />
             <DisabledWarnings />
           </LDads>
         </TargetArmAds>
       </TargetOption>
       <Groups>
-        <Group>
-          <GroupName>Applications</GroupName>
-          <Files>
-            <File>
-              <FileName>application.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
-            </File>
-          </Files>
-          <Files>
-            <File>
-              <FileName>startup.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
-            </File>
-          </Files>
-        </Group>
-        <Group>
-          <GroupName>Drivers</GroupName>
-          <Files>
-            <File>
-              <FileName>board.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>drivers\board.c</FilePath>
-            </File>
-          </Files>
-          <Files>
-            <File>
-              <FileName>serial.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>drivers\serial.c</FilePath>
-            </File>
-          </Files>
-        </Group>
         <Group>
           <GroupName>Libraries</GroupName>
           <Files>
             <File>
               <FileName>adc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\adc.c</FilePath>
+              <FilePath>Libraries/driverlib/adc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>can.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\can.c</FilePath>
+              <FilePath>Libraries/driverlib/can.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>comp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\comp.c</FilePath>
+              <FilePath>Libraries/driverlib/comp.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>cpu.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\cpu.c</FilePath>
+              <FilePath>Libraries/driverlib/cpu.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>eeprom.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\eeprom.c</FilePath>
+              <FilePath>Libraries/driverlib/eeprom.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>epi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\epi.c</FilePath>
+              <FilePath>Libraries/driverlib/epi.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>ethernet.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\ethernet.c</FilePath>
+              <FilePath>Libraries/driverlib/ethernet.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>fan.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\fan.c</FilePath>
+              <FilePath>Libraries/driverlib/fan.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>flash.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\flash.c</FilePath>
+              <FilePath>Libraries/driverlib/flash.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>fpu.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\fpu.c</FilePath>
+              <FilePath>Libraries/driverlib/fpu.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>gpio.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\gpio.c</FilePath>
+              <FilePath>Libraries/driverlib/gpio.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>hibernate.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\hibernate.c</FilePath>
+              <FilePath>Libraries/driverlib/hibernate.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>i2c.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\i2c.c</FilePath>
+              <FilePath>Libraries/driverlib/i2c.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>i2s.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\i2s.c</FilePath>
+              <FilePath>Libraries/driverlib/i2s.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>interrupt.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\interrupt.c</FilePath>
+              <FilePath>Libraries/driverlib/interrupt.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>lpc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\lpc.c</FilePath>
+              <FilePath>Libraries/driverlib/lpc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>mpu.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\mpu.c</FilePath>
+              <FilePath>Libraries/driverlib/mpu.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>peci.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\peci.c</FilePath>
+              <FilePath>Libraries/driverlib/peci.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>pwm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\pwm.c</FilePath>
+              <FilePath>Libraries/driverlib/pwm.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>qei.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\qei.c</FilePath>
+              <FilePath>Libraries/driverlib/qei.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>ssi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\ssi.c</FilePath>
+              <FilePath>Libraries/driverlib/ssi.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>sysctl.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\sysctl.c</FilePath>
+              <FilePath>Libraries/driverlib/sysctl.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>sysexc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\sysexc.c</FilePath>
+              <FilePath>Libraries/driverlib/sysexc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>systick.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\systick.c</FilePath>
+              <FilePath>Libraries/driverlib/systick.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\timer.c</FilePath>
+              <FilePath>Libraries/driverlib/timer.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>uart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\uart.c</FilePath>
+              <FilePath>Libraries/driverlib/uart.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>udma.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\udma.c</FilePath>
+              <FilePath>Libraries/driverlib/udma.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>usb.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\usb.c</FilePath>
+              <FilePath>Libraries/driverlib/usb.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>watchdog.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\driverlib\watchdog.c</FilePath>
+              <FilePath>Libraries/driverlib/watchdog.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>start_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>Libraries\startup\arm\start_rvds.S</FilePath>
+              <FilePath>Libraries/startup/arm/start_rvds.S</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
+            <File>
+              <FileName>application.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/application.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/startup.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/board.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>serial.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/serial.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -633,91 +633,91 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
-            </File>
-          </Files>
-          <Files>
-            <File>
-              <FileName>memheap.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\src\memheap.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>src_timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -727,35 +727,35 @@
             <File>
               <FileName>cpuport.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m4\cpuport.c</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m4/cpuport.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m4\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m4/context_rvds.S</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -763,93 +763,93 @@
           <GroupName>finsh</GroupName>
           <Files>
             <File>
-              <FileName>cmd.c</FileName>
+              <FileName>shell.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/shell.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_compiler.c</FileName>
+              <FileName>symbol.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_error.c</FileName>
+              <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_heap.c</FileName>
+              <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_init.c</FileName>
+              <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_node.c</FileName>
+              <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_ops.c</FileName>
+              <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_parser.c</FileName>
+              <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_token.c</FileName>
+              <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_var.c</FileName>
+              <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_vm.c</FileName>
+              <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>shell.c</FileName>
+              <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>symbol.c</FileName>
+              <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>

+ 294 - 165
bsp/lpc176x/project.uvproj

@@ -1,10 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
 <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
-
   <SchemaVersion>1.1</SchemaVersion>
-
   <Header>### uVision Project, (C) Keil Software</Header>
-
   <Targets>
     <Target>
       <TargetName>RT-Thread LPC17xx</TargetName>
@@ -15,25 +12,25 @@
           <Device>LPC1768</Device>
           <Vendor>NXP (founded by Philips)</Vendor>
           <Cpu>IRAM(0x10000000-0x10007FFF) IRAM2(0x20000000-0x20007FFF) IROM(0-0x7FFFF) CLOCK(12000000) CPUTYPE("Cortex-M3")</Cpu>
-          <FlashUtilSpec></FlashUtilSpec>
+          <FlashUtilSpec />
           <StartupFile>"STARTUP\NXP\startup_LPC17xx.s" ("NXP LPC17xx Startup Code")</StartupFile>
           <FlashDriverDll>UL2CM3(-O463 -S0 -C0 -FO7 -FD10000000 -FC800 -FN1 -FF0LPC_IAP_256 -FS00 -FL040000)</FlashDriverDll>
           <DeviceId>4868</DeviceId>
           <RegisterFile>LPC17xx.H</RegisterFile>
-          <MemoryEnv></MemoryEnv>
-          <Cmp></Cmp>
-          <Asm></Asm>
-          <Linker></Linker>
-          <OHString></OHString>
-          <InfinionOptionDll></InfinionOptionDll>
-          <SLE66CMisc></SLE66CMisc>
-          <SLE66AMisc></SLE66AMisc>
-          <SLE66LinkerMisc></SLE66LinkerMisc>
-          <SFDFile></SFDFile>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile />
           <UseEnv>0</UseEnv>
-          <BinPath></BinPath>
-          <IncludePath></IncludePath>
-          <LibPath></LibPath>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
           <RegisterFilePath>NXP\</RegisterFilePath>
           <DBRegisterFilePath>NXP\</DBRegisterFilePath>
           <TargetStatus>
@@ -57,31 +54,29 @@
           <BeforeCompile>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
-            <nStopU1X>0</nStopU1X>
-            <nStopU2X>0</nStopU2X>
           </BeforeCompile>
           <BeforeMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </BeforeMake>
           <AfterMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </AfterMake>
           <SelectedForBatchBuild>0</SelectedForBatchBuild>
-          <SVCSIdString></SVCSIdString>
+          <SVCSIdString />
         </TargetCommonOption>
         <CommonProperty>
           <UseCPPCompiler>0</UseCPPCompiler>
@@ -95,8 +90,8 @@
           <AssembleAssemblyFile>0</AssembleAssemblyFile>
           <PublicsOnly>0</PublicsOnly>
           <StopOnExitCode>3</StopOnExitCode>
-          <CustomArgument></CustomArgument>
-          <IncludeLibraryModules></IncludeLibraryModules>
+          <CustomArgument />
+          <IncludeLibraryModules />
         </CommonProperty>
         <DllOption>
           <SimDllName>SARMCM3.DLL</SimDllName>
@@ -117,7 +112,7 @@
             <Oh166RecLen>16</Oh166RecLen>
           </OPTHX>
           <Simulator>
-            <UseSimulator>0</UseSimulator>
+            <UseSimulator>1</UseSimulator>
             <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
             <RunToMain>1</RunToMain>
             <RestoreBreakpoints>1</RestoreBreakpoints>
@@ -128,9 +123,9 @@
             <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
           </Simulator>
           <Target>
-            <UseTarget>1</UseTarget>
+            <UseTarget>0</UseTarget>
             <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
-            <RunToMain>1</RunToMain>
+            <RunToMain>0</RunToMain>
             <RestoreBreakpoints>1</RestoreBreakpoints>
             <RestoreWatchpoints>1</RestoreWatchpoints>
             <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
@@ -138,20 +133,20 @@
             <RestoreToolbox>1</RestoreToolbox>
           </Target>
           <RunDebugAfterBuild>0</RunDebugAfterBuild>
-          <TargetSelection>7</TargetSelection>
+          <TargetSelection>5</TargetSelection>
           <SimDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
           </SimDlls>
           <TargetDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
             <Driver>Segger\JL2CM3.dll</Driver>
           </TargetDlls>
         </DebugOption>
@@ -166,7 +161,7 @@
           </Flash1>
           <Flash2>Segger\JL2CM3.dll</Flash2>
           <Flash3>"" ()</Flash3>
-          <Flash4></Flash4>
+          <Flash4 />
         </Utilities>
         <TargetArmAds>
           <ArmAdsMisc>
@@ -198,7 +193,7 @@
             <RvctClst>0</RvctClst>
             <GenPPlst>0</GenPPlst>
             <AdsCpuType>"Cortex-M3"</AdsCpuType>
-            <RvctDeviceName></RvctDeviceName>
+            <RvctDeviceName />
             <mOS>0</mOS>
             <uocRom>0</uocRom>
             <uocRam>0</uocRam>
@@ -329,7 +324,7 @@
                 <Size>0x8000</Size>
               </OCR_RVCT10>
             </OnChipMemories>
-            <RvctStartVector></RvctStartVector>
+            <RvctStartVector />
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
@@ -345,10 +340,10 @@
             <wLevel>0</wLevel>
             <uThumb>0</uThumb>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath>.;..\..\components\CMSIS\Include;..\..\components\finsh;..\..\components\init;..\..\components\net\lwip\src;..\..\components\net\lwip\src\arch\include;..\..\components\net\lwip\src\include;..\..\components\net\lwip\src\include\ipv4;..\..\components\net\lwip\src\include\netif;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m3;CMSIS\CM3\DeviceSupport\NXP\LPC17xx;applications;drivers</IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath>applications;.;drivers;CMSIS/CM3/DeviceSupport/NXP/LPC17xx;../../components/CMSIS/Include;../../include;../../libcpu/arm/cortex-m3;../../libcpu/arm/common;../../components/finsh;../../components/net/lwip-1.4.1/src;../../components/net/lwip-1.4.1/src/include;../../components/net/lwip-1.4.1/src/include/ipv4;../../components/net/lwip-1.4.1/src/arch/include;../../components/net/lwip-1.4.1/src/include/netif</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -360,10 +355,10 @@
             <SwStkChk>0</SwStkChk>
             <NoWarn>0</NoWarn>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath></IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
             </VariousControls>
           </Aads>
           <LDads>
@@ -375,12 +370,12 @@
             <useFile>0</useFile>
             <TextAddressRange>0x00000000</TextAddressRange>
             <DataAddressRange>0x10000000</DataAddressRange>
-            <ScatterFile></ScatterFile>
-            <IncludeLibs></IncludeLibs>
-            <IncludeLibsPath></IncludeLibsPath>
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
-            <LinkerInputFile></LinkerInputFile>
-            <DisabledWarnings></DisabledWarnings>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
           </LDads>
         </TargetArmAds>
       </TargetOption>
@@ -391,32 +386,21 @@
             <File>
               <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>platform.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\platform.c</FilePath>
-            </File>
-            <File>
-              <FileName>startup.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>applications/platform.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>CMSIS</GroupName>
           <Files>
             <File>
-              <FileName>system_LPC17xx.c</FileName>
+              <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>CMSIS\CM3\DeviceSupport\NXP\LPC17xx\system_LPC17xx.c</FilePath>
-            </File>
-            <File>
-              <FileName>startup_LPC17xx.s</FileName>
-              <FileType>2</FileType>
-              <FilePath>CMSIS\CM3\DeviceSupport\NXP\LPC17xx\startup\arm\startup_LPC17xx.s</FilePath>
+              <FilePath>applications/startup.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -426,27 +410,52 @@
             <File>
               <FileName>board.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\board.c</FilePath>
+              <FilePath>drivers/board.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>emac.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\emac.c</FilePath>
+              <FilePath>drivers/emac.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>led.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\led.c</FilePath>
+              <FilePath>drivers/led.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>spi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\spi.c</FilePath>
+              <FilePath>drivers/spi.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>uart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\uart.c</FilePath>
+              <FilePath>drivers/uart.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>CMSIS</GroupName>
+          <Files>
+            <File>
+              <FileName>system_LPC17xx.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>CMSIS/CM3/DeviceSupport/NXP/LPC17xx/system_LPC17xx.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup_LPC17xx.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>CMSIS/CM3/DeviceSupport/NXP/LPC17xx/startup/arm/startup_LPC17xx.s</FilePath>
             </File>
           </Files>
         </Group>
@@ -456,67 +465,98 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>memheap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\memheap.c</FilePath>
+              <FilePath>../../src/memheap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -526,107 +566,129 @@
             <File>
               <FileName>cpuport.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\cpuport.c</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/cpuport.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/context_rvds.S</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
             </File>
           </Files>
         </Group>
         <Group>
           <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
           <Files>
             <File>
               <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
-            </File>
-            <File>
-              <FileName>finsh_token.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
-            </File>
-            <File>
-              <FileName>shell.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
-            </File>
-            <File>
-              <FileName>symbol.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>Components</GroupName>
           <Files>
             <File>
-              <FileName>components.c</FileName>
+              <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\init\components.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -636,182 +698,249 @@
             <File>
               <FileName>api_lib.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\api_lib.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_lib.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>api_msg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\api_msg.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_msg.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>err.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\err.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/err.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netbuf.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\netbuf.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netbuf.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netdb.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\netdb.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netdb.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netifapi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\netifapi.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netifapi.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sockets.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\sockets.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/sockets.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcpip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\tcpip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/tcpip.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sys_arch.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\arch\sys_arch.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/arch/sys_arch.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>def.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\def.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/def.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>dhcp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\dhcp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dhcp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>dns.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\dns.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dns.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\init.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/init.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>memp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\memp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/memp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\netif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/netif.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>pbuf.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\pbuf.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/pbuf.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>raw.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\raw.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/raw.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stats.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\stats.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/stats.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sys.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\sys.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/sys.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\tcp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcp_in.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\tcp_in.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_in.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcp_out.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\tcp_out.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_out.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timers.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\timers.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/timers.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>udp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\udp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/udp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>autoip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\autoip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/autoip.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>icmp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\icmp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/icmp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>igmp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\igmp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/igmp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>inet.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\inet.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>inet_chksum.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\inet_chksum.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet_chksum.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\ip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ip_addr.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\ip_addr.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_addr.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ip_frag.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\ip_frag.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_frag.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>etharp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\netif\etharp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/etharp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ethernetif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\netif\ethernetif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/ethernetif.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>slipif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\netif\slipif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/slipif.c</FilePath>
             </File>
           </Files>
         </Group>
       </Groups>
     </Target>
   </Targets>
-
 </Project>

+ 205 - 139
bsp/lpc178x/project.uvproj

@@ -1,10 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
 <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
-
   <SchemaVersion>1.1</SchemaVersion>
-
   <Header>### uVision Project, (C) Keil Software</Header>
-
   <Targets>
     <Target>
       <TargetName>RT-Thread LPC17xx</TargetName>
@@ -15,25 +12,25 @@
           <Device>LPC1788</Device>
           <Vendor>NXP (founded by Philips)</Vendor>
           <Cpu>IRAM(0x10000000-0x1000FFFF) IRAM2(0x20000000-0x20007FFF) IROM(0-0x7FFFF) CLOCK(12000000) CPUTYPE("Cortex-M3")</Cpu>
-          <FlashUtilSpec></FlashUtilSpec>
+          <FlashUtilSpec />
           <StartupFile>"STARTUP\NXP\LPC177x_8x\startup_LPC177x_8x.s" ("NXP LPC177x_8x Startup Code")</StartupFile>
           <FlashDriverDll>UL2CM3(-O463 -S0 -C0 -FO7 -FD10000000 -FC800 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000)</FlashDriverDll>
           <DeviceId>5325</DeviceId>
           <RegisterFile>LPC177x_8x.H</RegisterFile>
-          <MemoryEnv></MemoryEnv>
-          <Cmp></Cmp>
-          <Asm></Asm>
-          <Linker></Linker>
-          <OHString></OHString>
-          <InfinionOptionDll></InfinionOptionDll>
-          <SLE66CMisc></SLE66CMisc>
-          <SLE66AMisc></SLE66AMisc>
-          <SLE66LinkerMisc></SLE66LinkerMisc>
-          <SFDFile></SFDFile>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile />
           <UseEnv>0</UseEnv>
-          <BinPath></BinPath>
-          <IncludePath></IncludePath>
-          <LibPath></LibPath>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
           <RegisterFilePath>NXP\LPC177x_8x\</RegisterFilePath>
           <DBRegisterFilePath>NXP\LPC177x_8x\</DBRegisterFilePath>
           <TargetStatus>
@@ -57,31 +54,29 @@
           <BeforeCompile>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
-            <nStopU1X>0</nStopU1X>
-            <nStopU2X>0</nStopU2X>
           </BeforeCompile>
           <BeforeMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </BeforeMake>
           <AfterMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </AfterMake>
           <SelectedForBatchBuild>0</SelectedForBatchBuild>
-          <SVCSIdString></SVCSIdString>
+          <SVCSIdString />
         </TargetCommonOption>
         <CommonProperty>
           <UseCPPCompiler>0</UseCPPCompiler>
@@ -95,8 +90,8 @@
           <AssembleAssemblyFile>0</AssembleAssemblyFile>
           <PublicsOnly>0</PublicsOnly>
           <StopOnExitCode>3</StopOnExitCode>
-          <CustomArgument></CustomArgument>
-          <IncludeLibraryModules></IncludeLibraryModules>
+          <CustomArgument />
+          <IncludeLibraryModules />
         </CommonProperty>
         <DllOption>
           <SimDllName>SARMCM3.DLL</SimDllName>
@@ -136,23 +131,22 @@
             <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
             <RestoreFunctions>0</RestoreFunctions>
             <RestoreToolbox>1</RestoreToolbox>
-            <RestoreTracepoints>0</RestoreTracepoints>
           </Target>
           <RunDebugAfterBuild>0</RunDebugAfterBuild>
           <TargetSelection>7</TargetSelection>
           <SimDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
           </SimDlls>
           <TargetDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
             <Driver>Segger\JL2CM3.dll</Driver>
           </TargetDlls>
         </DebugOption>
@@ -167,7 +161,7 @@
           </Flash1>
           <Flash2>Segger\JL2CM3.dll</Flash2>
           <Flash3>"" ()</Flash3>
-          <Flash4></Flash4>
+          <Flash4 />
         </Utilities>
         <TargetArmAds>
           <ArmAdsMisc>
@@ -199,7 +193,7 @@
             <RvctClst>0</RvctClst>
             <GenPPlst>0</GenPPlst>
             <AdsCpuType>"Cortex-M3"</AdsCpuType>
-            <RvctDeviceName></RvctDeviceName>
+            <RvctDeviceName />
             <mOS>0</mOS>
             <uocRom>0</uocRom>
             <uocRam>0</uocRam>
@@ -330,7 +324,7 @@
                 <Size>0x8000</Size>
               </OCR_RVCT10>
             </OnChipMemories>
-            <RvctStartVector></RvctStartVector>
+            <RvctStartVector />
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
@@ -345,12 +339,11 @@
             <Rwpi>0</Rwpi>
             <wLevel>0</wLevel>
             <uThumb>0</uThumb>
-            <uSurpInc>0</uSurpInc>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath>.;..\..\components\finsh;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m3;CMSIS\CM3\CoreSupport;CMSIS\CM3\DeviceSupport\NXP\LPC177x_8x;applications;drivers</IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath>applications;.;drivers;CMSIS/CM3/CoreSupport;CMSIS/CM3/DeviceSupport/NXP/LPC177x_8x;../../include;../../libcpu/arm/cortex-m3;../../libcpu/arm/common;../../components/finsh</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -361,12 +354,11 @@
             <SplitLS>0</SplitLS>
             <SwStkChk>0</SwStkChk>
             <NoWarn>0</NoWarn>
-            <uSurpInc>0</uSurpInc>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath></IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
             </VariousControls>
           </Aads>
           <LDads>
@@ -378,12 +370,12 @@
             <useFile>0</useFile>
             <TextAddressRange>0x00000000</TextAddressRange>
             <DataAddressRange>0x10000000</DataAddressRange>
-            <ScatterFile></ScatterFile>
-            <IncludeLibs></IncludeLibs>
-            <IncludeLibsPath></IncludeLibsPath>
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
-            <LinkerInputFile></LinkerInputFile>
-            <DisabledWarnings></DisabledWarnings>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
           </LDads>
         </TargetArmAds>
       </TargetOption>
@@ -394,32 +386,14 @@
             <File>
               <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
-            </File>
-            <File>
-              <FileName>startup.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>CMSIS</GroupName>
           <Files>
             <File>
-              <FileName>core_cm3.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>CMSIS\CM3\CoreSupport\core_cm3.c</FilePath>
-            </File>
-            <File>
-              <FileName>system_LPC177x_8x.c</FileName>
+              <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>CMSIS\CM3\DeviceSupport\NXP\LPC177x_8x\system_LPC177x_8x.c</FilePath>
-            </File>
-            <File>
-              <FileName>startup_LPC177x_8x.s</FileName>
-              <FileType>2</FileType>
-              <FilePath>CMSIS\CM3\DeviceSupport\NXP\LPC177x_8x\startup\arm\startup_LPC177x_8x.s</FilePath>
+              <FilePath>applications/startup.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -429,47 +403,87 @@
             <File>
               <FileName>board.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\board.c</FilePath>
+              <FilePath>drivers/board.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>drv_glcd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\drv_glcd.c</FilePath>
+              <FilePath>drivers/drv_glcd.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>lpc177x_8x_clkpwr.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\lpc177x_8x_clkpwr.c</FilePath>
+              <FilePath>drivers/lpc177x_8x_clkpwr.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>lpc177x_8x_emc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\lpc177x_8x_emc.c</FilePath>
+              <FilePath>drivers/lpc177x_8x_emc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>lpc177x_8x_pinsel.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\lpc177x_8x_pinsel.c</FilePath>
+              <FilePath>drivers/lpc177x_8x_pinsel.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>lpc177x_8x_uart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\lpc177x_8x_uart.c</FilePath>
+              <FilePath>drivers/lpc177x_8x_uart.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>lpc17xx_lcd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\lpc17xx_lcd.c</FilePath>
+              <FilePath>drivers/lpc17xx_lcd.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sdram.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\sdram.c</FilePath>
+              <FilePath>drivers/sdram.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>uart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\uart.c</FilePath>
+              <FilePath>drivers/uart.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>CMSIS</GroupName>
+          <Files>
+            <File>
+              <FileName>core_cm3.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>CMSIS/CM3/CoreSupport/core_cm3.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>system_LPC177x_8x.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>CMSIS/CM3/DeviceSupport/NXP/LPC177x_8x/system_LPC177x_8x.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup_LPC177x_8x.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>CMSIS/CM3/DeviceSupport/NXP/LPC177x_8x/startup/arm/startup_LPC177x_8x.s</FilePath>
             </File>
           </Files>
         </Group>
@@ -479,67 +493,98 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
             </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
+            </File>
+          </Files>
+          <Files>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>memheap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\memheap.c</FilePath>
+              <FilePath>../../src/memheap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -549,112 +594,133 @@
             <File>
               <FileName>cpuport.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\cpuport.c</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/cpuport.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/context_rvds.S</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
             </File>
           </Files>
         </Group>
         <Group>
           <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
           <Files>
             <File>
               <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
-            </File>
-            <File>
-              <FileName>finsh_token.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
-            </File>
-            <File>
-              <FileName>msh.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\msh.c</FilePath>
-            </File>
-            <File>
-              <FileName>msh_cmd.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\msh_cmd.c</FilePath>
-            </File>
-            <File>
-              <FileName>shell.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>symbol.c</FileName>
+              <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>
       </Groups>
     </Target>
   </Targets>
-
 </Project>

+ 185 - 109
bsp/lpc2478/project.uvproj

@@ -1,10 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
 <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
-
   <SchemaVersion>1.1</SchemaVersion>
-
   <Header>### uVision Project, (C) Keil Software</Header>
-
   <Targets>
     <Target>
       <TargetName>RT-Thread LPC2478</TargetName>
@@ -20,20 +17,21 @@
           <FlashDriverDll>UL2ARM(-U268761108 -O7 -S0 -C0 -FO15 -FD40000000 -FC800 -FN1 -FF0LPC_IAP2_512 -FS00 -FL07E000)</FlashDriverDll>
           <DeviceId>4307</DeviceId>
           <RegisterFile>LPC23xx.H</RegisterFile>
-          <MemoryEnv></MemoryEnv>
-          <Cmp></Cmp>
-          <Asm></Asm>
-          <Linker></Linker>
-          <OHString></OHString>
-          <InfinionOptionDll></InfinionOptionDll>
-          <SLE66CMisc></SLE66CMisc>
-          <SLE66AMisc></SLE66AMisc>
-          <SLE66LinkerMisc></SLE66LinkerMisc>
-          <SFDFile></SFDFile>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile />
+          <bCustSvd>0</bCustSvd>
           <UseEnv>0</UseEnv>
-          <BinPath></BinPath>
-          <IncludePath></IncludePath>
-          <LibPath></LibPath>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
           <RegisterFilePath>Philips\</RegisterFilePath>
           <DBRegisterFilePath>Philips\</DBRegisterFilePath>
           <TargetStatus>
@@ -43,43 +41,45 @@
             <NotGenerated>0</NotGenerated>
             <InvalidFlash>1</InvalidFlash>
           </TargetStatus>
-          <OutputDirectory>.\obj\</OutputDirectory>
+          <OutputDirectory>.\build\</OutputDirectory>
           <OutputName>rtthread-lpc</OutputName>
           <CreateExecutable>1</CreateExecutable>
           <CreateLib>0</CreateLib>
           <CreateHexFile>0</CreateHexFile>
           <DebugInformation>1</DebugInformation>
           <BrowseInformation>1</BrowseInformation>
-          <ListingPath>.\obj\</ListingPath>
+          <ListingPath>.\build\</ListingPath>
           <HexFormatSelection>1</HexFormatSelection>
           <Merge32K>0</Merge32K>
           <CreateBatchFile>0</CreateBatchFile>
           <BeforeCompile>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
           </BeforeCompile>
           <BeforeMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </BeforeMake>
           <AfterMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </AfterMake>
           <SelectedForBatchBuild>0</SelectedForBatchBuild>
-          <SVCSIdString></SVCSIdString>
+          <SVCSIdString />
         </TargetCommonOption>
         <CommonProperty>
           <UseCPPCompiler>0</UseCPPCompiler>
@@ -93,8 +93,9 @@
           <AssembleAssemblyFile>0</AssembleAssemblyFile>
           <PublicsOnly>0</PublicsOnly>
           <StopOnExitCode>3</StopOnExitCode>
-          <CustomArgument></CustomArgument>
-          <IncludeLibraryModules></IncludeLibraryModules>
+          <CustomArgument />
+          <IncludeLibraryModules />
+          <ComprImg>1</ComprImg>
         </CommonProperty>
         <DllOption>
           <SimDllName>SARM.DLL</SimDllName>
@@ -102,7 +103,7 @@
           <SimDlgDll>DARMP.DLL</SimDlgDll>
           <SimDlgDllArguments>-pLPC2478</SimDlgDllArguments>
           <TargetDllName>SARM.DLL</TargetDllName>
-          <TargetDllArguments></TargetDllArguments>
+          <TargetDllArguments />
           <TargetDlgDll>TARMP.DLL</TargetDlgDll>
           <TargetDlgDllArguments>-pLPC2478</TargetDlgDllArguments>
         </DllOption>
@@ -128,28 +129,29 @@
           <Target>
             <UseTarget>1</UseTarget>
             <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
-            <RunToMain>0</RunToMain>
+            <RunToMain>1</RunToMain>
             <RestoreBreakpoints>1</RestoreBreakpoints>
             <RestoreWatchpoints>1</RestoreWatchpoints>
             <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
             <RestoreFunctions>0</RestoreFunctions>
             <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
           </Target>
           <RunDebugAfterBuild>0</RunDebugAfterBuild>
           <TargetSelection>7</TargetSelection>
           <SimDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
           </SimDlls>
           <TargetDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
             <Driver>Segger\JL2CM3.dll</Driver>
           </TargetDlls>
         </DebugOption>
@@ -162,9 +164,14 @@
             <Capability>1</Capability>
             <DriverSelection>4096</DriverSelection>
           </Flash1>
+          <bUseTDR>1</bUseTDR>
           <Flash2>BIN\UL2ARM.DLL</Flash2>
           <Flash3>"LPC210x_ISP.EXE" ("#H" ^X $D COM1: 38400 1)</Flash3>
-          <Flash4></Flash4>
+          <Flash4 />
+          <pFcarmOut />
+          <pFcarmGrp />
+          <pFcArmRoot />
+          <FcArmLst>0</FcArmLst>
         </Utilities>
         <TargetArmAds>
           <ArmAdsMisc>
@@ -196,7 +203,7 @@
             <RvctClst>0</RvctClst>
             <GenPPlst>0</GenPPlst>
             <AdsCpuType>ARM7TDMI</AdsCpuType>
-            <RvctDeviceName></RvctDeviceName>
+            <RvctDeviceName />
             <mOS>0</mOS>
             <uocRom>0</uocRom>
             <uocRam>0</uocRam>
@@ -327,7 +334,7 @@
                 <Size>0x4000</Size>
               </OCR_RVCT10>
             </OnChipMemories>
-            <RvctStartVector></RvctStartVector>
+            <RvctStartVector />
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
@@ -342,11 +349,12 @@
             <Rwpi>0</Rwpi>
             <wLevel>0</wLevel>
             <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath>.;..\..\components\finsh;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\lpc24xx;applications;drivers</IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath>applications;.;drivers;../../include;../../libcpu/arm/lpc24xx;../../libcpu/arm/common;../../components/finsh</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -357,11 +365,12 @@
             <SplitLS>0</SplitLS>
             <SwStkChk>0</SwStkChk>
             <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath></IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
             </VariousControls>
           </Aads>
           <LDads>
@@ -373,12 +382,12 @@
             <useFile>0</useFile>
             <TextAddressRange>0x00000000</TextAddressRange>
             <DataAddressRange>0x10000000</DataAddressRange>
-            <ScatterFile></ScatterFile>
-            <IncludeLibs></IncludeLibs>
-            <IncludeLibsPath></IncludeLibsPath>
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
-            <LinkerInputFile></LinkerInputFile>
-            <DisabledWarnings></DisabledWarnings>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
           </LDads>
         </TargetArmAds>
       </TargetOption>
@@ -389,12 +398,14 @@
             <File>
               <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>applications/startup.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -404,12 +415,14 @@
             <File>
               <FileName>board.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\board.c</FilePath>
+              <FilePath>drivers/board.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>serial.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\serial.c</FilePath>
+              <FilePath>drivers/serial.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -419,67 +432,91 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
-            </File>
-            <File>
-              <FileName>memheap.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\src\memheap.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -489,122 +526,161 @@
             <File>
               <FileName>cpu.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\lpc24xx\cpu.c</FilePath>
+              <FilePath>../../libcpu/arm/lpc24xx/cpu.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>interrupt.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\lpc24xx\interrupt.c</FilePath>
+              <FilePath>../../libcpu/arm/lpc24xx/interrupt.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stack.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\lpc24xx\stack.c</FilePath>
+              <FilePath>../../libcpu/arm/lpc24xx/stack.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>trap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\lpc24xx\trap.c</FilePath>
+              <FilePath>../../libcpu/arm/lpc24xx/trap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\lpc24xx\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/lpc24xx/context_rvds.S</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>start_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\lpc24xx\start_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/lpc24xx/start_rvds.S</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
             </File>
           </Files>
         </Group>
         <Group>
           <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
           <Files>
             <File>
               <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
-            </File>
-            <File>
-              <FileName>finsh_token.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
-            </File>
-            <File>
-              <FileName>shell.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>symbol.c</FileName>
+              <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>
       </Groups>
     </Target>
   </Targets>
-
 </Project>

+ 1031 - 0
bsp/lpc408x/project.uvproj

@@ -0,0 +1,1031 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+  <SchemaVersion>1.1</SchemaVersion>
+  <Header>### uVision Project, (C) Keil Software</Header>
+  <Targets>
+    <Target>
+      <TargetName>RT-Thread LPC408x</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>LPC4088</Device>
+          <Vendor>NXP (founded by Philips)</Vendor>
+          <Cpu>IRAM(0x10000000-0x1000FFFF) IRAM2(0x20000000-0x20007FFF) IROM(0-0x7FFFF) CLOCK(12000000) CPUTYPE("Cortex-M4") FPU2</Cpu>
+          <FlashUtilSpec />
+          <StartupFile>"STARTUP\NXP\LPC407x_8x_177x_8x\startup_LPC407x_8x_177x_8x.s" ("NXP LPC407x_8x_177x_8x Startup Code")</StartupFile>
+          <FlashDriverDll>UL2CM3(-O4303 -S0 -C0 -FO7 -FD10000000 -FC800 -FN1 -FF0LPC_IAP_512 -FS00 -FL080000)</FlashDriverDll>
+          <DeviceId>6493</DeviceId>
+          <RegisterFile>LPC407x_8x_177x_8x.h</RegisterFile>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile>SFD\NXP\LPC407x_8x_177x_8x\LPC408x_7x.SFR</SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
+          <RegisterFilePath>NXP\LPC407x_8x_177x_8x\</RegisterFilePath>
+          <DBRegisterFilePath>NXP\LPC407x_8x_177x_8x\</DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\build\</OutputDirectory>
+          <OutputName>rtthread-lpc</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\build\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString />
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument />
+          <IncludeLibraryModules />
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments>-MPU</SimDllArguments>
+          <SimDlgDll>DCM.DLL</SimDlgDll>
+          <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments>-MPU</TargetDllArguments>
+          <TargetDlgDll>TCM.DLL</TargetDlgDll>
+          <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>0</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>1</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>7</TargetSelection>
+          <SimDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+            <Driver>Segger\JL2CM3.dll</Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4099</DriverSelection>
+          </Flash1>
+          <bUseTDR>0</bUseTDR>
+          <Flash2>Segger\JL2CM3.dll</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4 />
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M4"</AdsCpuType>
+            <RvctDeviceName />
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>1</hadIROM>
+            <hadIRAM>1</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>2</RvdsVP>
+            <hadIRAM2>1</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>8</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>0</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>3</RoSelD>
+            <RwSelD>3</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>0</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>1</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>0</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>1</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x10000000</StartAddress>
+                <Size>0x10000</Size>
+              </IRAM>
+              <IROM>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x80000</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x80000</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x10000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x8000</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector />
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>1</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls />
+              <Define>CORE_M4, RT_USING_ARM_LIBC</Define>
+              <Undefine />
+              <IncludePath>Libraries/Device/NXP/LPC407x_8x_177x_8x/Include;Libraries/CMSIS/Include;Libraries/Drivers/include;applications;.;drivers;../../include;../../libcpu/arm/cortex-m4;../../libcpu/arm/common;../../components/pthreads;../../components/libc/armlibc;../../components/drivers/include;../../components/drivers/include;../../components/finsh</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x10000000</DataAddressRange>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>CMSIS</GroupName>
+          <Files>
+            <File>
+              <FileName>system_LPC407x_8x_177x_8x.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Device/NXP/LPC407x_8x_177x_8x/Source/Templates/system_LPC407x_8x_177x_8x.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup_LPC407x_8x_177x_8x.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>Libraries/Device/NXP/LPC407x_8x_177x_8x/Source/Templates/ARM/startup_LPC407x_8x_177x_8x.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Libraries</GroupName>
+          <Files>
+            <File>
+              <FileName>lpc_adc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_adc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_bod.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_bod.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_can.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_can.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_clkpwr.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_clkpwr.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_crc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_crc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_dac.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_dac.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_eeprom.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_eeprom.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_emc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_emc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_exti.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_exti.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_gpdma.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_gpdma.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_gpio.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_gpio.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_i2c.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_i2c.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_i2s.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_i2s.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_iap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_iap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_lcd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_lcd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_mcpwm.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_mcpwm.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_nvic.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_nvic.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_pinsel.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_pinsel.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_pwm.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_pwm.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_qei.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_qei.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_rtc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_rtc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_ssp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_ssp.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_systick.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_systick.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_timer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_uart.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lpc_wwdt.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/Drivers/source/lpc_wwdt.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
+            <File>
+              <FileName>application.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/application.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/board.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>sram.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/sram.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/startup.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
+            <File>
+              <FileName>drv_led.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/drv_led.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>drv_uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/drv_uart.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Kernel</GroupName>
+          <Files>
+            <File>
+              <FileName>clock.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>device.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/device.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>idle.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/idle.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ipc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/ipc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>irq.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/irq.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>kservice.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/kservice.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/mem.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>memheap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/memheap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mempool.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/mempool.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>object.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/object.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>scheduler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/scheduler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>thread.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/thread.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/timer.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>CORTEX-M4</GroupName>
+          <Files>
+            <File>
+              <FileName>cpuport.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/cortex-m4/cpuport.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>context_rvds.S</FileName>
+              <FileType>2</FileType>
+              <FilePath>../../libcpu/arm/cortex-m4/context_rvds.S</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>backtrace.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>div0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>showmem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>pthreads</GroupName>
+          <Files>
+            <File>
+              <FileName>clock_time.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/clock_time.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/mqueue.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_attr.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_attr.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_barrier.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_barrier.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_cond.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_cond.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_mutex.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_mutex.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_rwlock.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_rwlock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_spin.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_spin.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pthread_tls.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/pthread_tls.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>sched.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/sched.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>semaphore.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/pthreads/semaphore.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>libc</GroupName>
+          <Files>
+            <File>
+              <FileName>mem_std.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/libc/armlibc/mem_std.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>stubs.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/libc/armlibc/stubs.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>DeviceDrivers</GroupName>
+          <Files>
+            <File>
+              <FileName>serial.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/serial/serial.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>completion.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/completion.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dataqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/dataqueue.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pipe.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/pipe.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>portal.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/portal.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ringbuffer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>workqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>cmd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_compiler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_error.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_heap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_init.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_node.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_ops.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_parser.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_var.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_vm.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_token.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+</Project>

+ 206 - 130
bsp/mb9bf506r/project.uvproj

@@ -1,10 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
 <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
-
   <SchemaVersion>1.1</SchemaVersion>
-
   <Header>### uVision Project, (C) Keil Software</Header>
-
   <Targets>
     <Target>
       <TargetName>rtthread-fm3</TargetName>
@@ -15,25 +12,25 @@
           <Device>MB9BF506R</Device>
           <Vendor>Fujitsu Semiconductors</Vendor>
           <Cpu>IRAM(0x20000000-0x20007FFF) IRAM2(0x1FFF8000-0x1FFFFFFF) IROM(0x00000000-0x0007FFFF) CLOCK(4000000) CPUTYPE("Cortex-M3")</Cpu>
-          <FlashUtilSpec></FlashUtilSpec>
+          <FlashUtilSpec />
           <StartupFile>"Startup\Fujitsu\MB9B500\startup_MB9BF50x.s" ("Fujitsu MB9BF50x Startup Code")</StartupFile>
           <FlashDriverDll>UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0MB9BFx06_512 -FS00 -FL080000)</FlashDriverDll>
           <DeviceId>5216</DeviceId>
           <RegisterFile>MB9BF506R.h</RegisterFile>
-          <MemoryEnv></MemoryEnv>
-          <Cmp></Cmp>
-          <Asm></Asm>
-          <Linker></Linker>
-          <OHString></OHString>
-          <InfinionOptionDll></InfinionOptionDll>
-          <SLE66CMisc></SLE66CMisc>
-          <SLE66AMisc></SLE66AMisc>
-          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
           <SFDFile>SFD\Fujitsu\MB9B500\MB9BF506R.SFR</SFDFile>
           <UseEnv>0</UseEnv>
-          <BinPath></BinPath>
-          <IncludePath></IncludePath>
-          <LibPath></LibPath>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
           <RegisterFilePath>Fujitsu\MB9B500\</RegisterFilePath>
           <DBRegisterFilePath>Fujitsu\MB9B500\</DBRegisterFilePath>
           <TargetStatus>
@@ -57,31 +54,29 @@
           <BeforeCompile>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
-            <nStopU1X>0</nStopU1X>
-            <nStopU2X>0</nStopU2X>
           </BeforeCompile>
           <BeforeMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </BeforeMake>
           <AfterMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </AfterMake>
           <SelectedForBatchBuild>0</SelectedForBatchBuild>
-          <SVCSIdString></SVCSIdString>
+          <SVCSIdString />
         </TargetCommonOption>
         <CommonProperty>
           <UseCPPCompiler>0</UseCPPCompiler>
@@ -95,8 +90,8 @@
           <AssembleAssemblyFile>0</AssembleAssemblyFile>
           <PublicsOnly>0</PublicsOnly>
           <StopOnExitCode>3</StopOnExitCode>
-          <CustomArgument></CustomArgument>
-          <IncludeLibraryModules></IncludeLibraryModules>
+          <CustomArgument />
+          <IncludeLibraryModules />
         </CommonProperty>
         <DllOption>
           <SimDllName>SARMCM3.DLL</SimDllName>
@@ -130,29 +125,28 @@
           <Target>
             <UseTarget>1</UseTarget>
             <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
-            <RunToMain>1</RunToMain>
+            <RunToMain>0</RunToMain>
             <RestoreBreakpoints>1</RestoreBreakpoints>
             <RestoreWatchpoints>1</RestoreWatchpoints>
             <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
             <RestoreFunctions>0</RestoreFunctions>
             <RestoreToolbox>1</RestoreToolbox>
-            <RestoreTracepoints>0</RestoreTracepoints>
           </Target>
           <RunDebugAfterBuild>0</RunDebugAfterBuild>
           <TargetSelection>7</TargetSelection>
           <SimDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
           </SimDlls>
           <TargetDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
             <Driver>Segger\JL2CM3.dll</Driver>
           </TargetDlls>
         </DebugOption>
@@ -167,7 +161,7 @@
           </Flash1>
           <Flash2>Segger\JL2CM3.dll</Flash2>
           <Flash3>"" ()</Flash3>
-          <Flash4></Flash4>
+          <Flash4 />
         </Utilities>
         <TargetArmAds>
           <ArmAdsMisc>
@@ -199,7 +193,7 @@
             <RvctClst>0</RvctClst>
             <GenPPlst>0</GenPPlst>
             <AdsCpuType>"Cortex-M3"</AdsCpuType>
-            <RvctDeviceName></RvctDeviceName>
+            <RvctDeviceName />
             <mOS>0</mOS>
             <uocRom>0</uocRom>
             <uocRam>0</uocRam>
@@ -330,7 +324,7 @@
                 <Size>0x8000</Size>
               </OCR_RVCT10>
             </OnChipMemories>
-            <RvctStartVector></RvctStartVector>
+            <RvctStartVector />
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
@@ -345,12 +339,11 @@
             <Rwpi>0</Rwpi>
             <wLevel>0</wLevel>
             <uThumb>0</uThumb>
-            <uSurpInc>0</uSurpInc>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath>.;..\..\components\CMSIS\Include;..\..\components\drivers\include;..\..\components\finsh;..\..\components\init;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m3;applications;drivers;libraries\Device\FUJISTU\MB9BF50x\Include</IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath>libraries/Device/FUJISTU/MB9BF50x/Include;../../components/CMSIS/Include;applications;.;drivers;../../include;../../libcpu/arm/cortex-m3;../../libcpu/arm/common;../../components/drivers/include;../../components/drivers/include;../../components/finsh</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -361,12 +354,11 @@
             <SplitLS>0</SplitLS>
             <SwStkChk>0</SwStkChk>
             <NoWarn>0</NoWarn>
-            <uSurpInc>0</uSurpInc>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath></IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
             </VariousControls>
           </Aads>
           <LDads>
@@ -378,28 +370,47 @@
             <useFile>0</useFile>
             <TextAddressRange>0x08000000</TextAddressRange>
             <DataAddressRange>0x20000000</DataAddressRange>
-            <ScatterFile></ScatterFile>
-            <IncludeLibs></IncludeLibs>
-            <IncludeLibsPath></IncludeLibsPath>
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
-            <LinkerInputFile></LinkerInputFile>
-            <DisabledWarnings></DisabledWarnings>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
           </LDads>
         </TargetArmAds>
       </TargetOption>
       <Groups>
+        <Group>
+          <GroupName>CMSIS</GroupName>
+          <Files>
+            <File>
+              <FileName>system_mb9bf50x.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/Device/FUJISTU/MB9BF50x/Source/system_mb9bf50x.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup_mb9bf50x.S</FileName>
+              <FileType>2</FileType>
+              <FilePath>libraries/Device/FUJISTU/MB9BF50x/Source/ARM/startup_mb9bf50x.S</FilePath>
+            </File>
+          </Files>
+        </Group>
         <Group>
           <GroupName>Applications</GroupName>
           <Files>
             <File>
               <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>applications/startup.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -409,107 +420,129 @@
             <File>
               <FileName>board.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\board.c</FilePath>
+              <FilePath>drivers/board.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>fm3_uart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\fm3_uart.c</FilePath>
+              <FilePath>drivers/fm3_uart.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>led.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\led.c</FilePath>
+              <FilePath>drivers/led.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>nand.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\nand.c</FilePath>
+              <FilePath>drivers/nand.c</FilePath>
             </File>
           </Files>
         </Group>
         <Group>
-          <GroupName>CMSIS</GroupName>
+          <GroupName>Kernel</GroupName>
           <Files>
             <File>
-              <FileName>system_mb9bf50x.c</FileName>
+              <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>libraries\Device\FUJISTU\MB9BF50x\Source\system_mb9bf50x.c</FilePath>
-            </File>
-            <File>
-              <FileName>startup_mb9bf50x.S</FileName>
-              <FileType>2</FileType>
-              <FilePath>libraries\Device\FUJISTU\MB9BF50x\Source\ARM\startup_mb9bf50x.S</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>Kernel</GroupName>
           <Files>
             <File>
-              <FileName>clock.c</FileName>
+              <FileName>components.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/components.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>memheap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\memheap.c</FilePath>
+              <FilePath>../../src/memheap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -519,27 +552,35 @@
             <File>
               <FileName>cpuport.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\cpuport.c</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/cpuport.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/context_rvds.S</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -549,112 +590,147 @@
             <File>
               <FileName>serial.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\serial\serial.c</FilePath>
+              <FilePath>../../components/drivers/serial/serial.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>completion.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\completion.c</FilePath>
+              <FilePath>../../components/drivers/src/completion.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>dataqueue.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\dataqueue.c</FilePath>
+              <FilePath>../../components/drivers/src/dataqueue.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>pipe.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\pipe.c</FilePath>
+              <FilePath>../../components/drivers/src/pipe.c</FilePath>
             </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>portal.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/portal.c</FilePath>
+            </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ringbuffer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\src\ringbuffer.c</FilePath>
+              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>workqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
             </File>
           </Files>
         </Group>
         <Group>
           <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
           <Files>
             <File>
               <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
-            </File>
-            <File>
-              <FileName>finsh_token.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
-            </File>
-            <File>
-              <FileName>shell.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
-            </File>
-            <File>
-              <FileName>symbol.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>Components</GroupName>
           <Files>
             <File>
-              <FileName>components.c</FileName>
+              <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\init\components.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>
       </Groups>
     </Target>
   </Targets>
-
 </Project>

+ 682 - 0
bsp/mb9bf568r/project.uvproj

@@ -0,0 +1,682 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+  <SchemaVersion>1.1</SchemaVersion>
+  <Header>### uVision Project, (C) Keil Software</Header>
+  <Targets>
+    <Target>
+      <TargetName>rtthread-fm4</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M4 FPU</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M4") ESEL ELITTLE FPU2</Cpu>
+          <FlashUtilSpec />
+          <StartupFile />
+          <FlashDriverDll />
+          <DeviceId>5237</DeviceId>
+          <RegisterFile />
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile />
+          <UseEnv>0</UseEnv>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
+          <RegisterFilePath />
+          <DBRegisterFilePath />
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\build\</OutputDirectory>
+          <OutputName>template_mb9b56xx</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\build\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString />
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument />
+          <IncludeLibraryModules />
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments />
+          <SimDlgDll>DCM.DLL</SimDlgDll>
+          <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments />
+          <TargetDlgDll>TCM.DLL</TargetDlgDll>
+          <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>0</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>1</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>1</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>14</TargetSelection>
+          <SimDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+            <Driver>BIN\CMSIS_AGDI.dll</Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4105</DriverSelection>
+          </Flash1>
+          <Flash2>BIN\CMSIS_AGDI.dll</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4 />
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>0</AdsALst>
+            <AdsACrf>0</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>0</AdsLcgr>
+            <AdsLsym>0</AdsLsym>
+            <AdsLszi>0</AdsLszi>
+            <AdsLtoi>0</AdsLtoi>
+            <AdsLsun>0</AdsLsun>
+            <AdsLven>0</AdsLven>
+            <AdsLsxf>0</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M4"</AdsCpuType>
+            <RvctDeviceName />
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>2</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>8</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>0</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>1</Ir1Chk>
+            <Ir2Chk>1</Ir2Chk>
+            <Ra1Chk>0</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>1</Im1Chk>
+            <Im2Chk>1</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x100000</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x200c0000</StartAddress>
+                <Size>0x8000</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x1fff0000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x20038000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector />
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>1</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath>applications;.;drivers;CMSIS/Include;CMSIS/DeviceSupport;../../include;../../libcpu/arm/cortex-m4;../../libcpu/arm/common;../../components/finsh</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
+            <File>
+              <FileName>application.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/application.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/demo.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/startup.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/board.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>led.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/led.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>serial.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/serial.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>CMSIS</GroupName>
+          <Files>
+            <File>
+              <FileName>system_mb9abxxx.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>CMSIS/DeviceSupport/system_mb9abxxx.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup_mb9bf56xr.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>CMSIS/DeviceSupport/arm/startup_mb9bf56xr.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Kernel</GroupName>
+          <Files>
+            <File>
+              <FileName>clock.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>device.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/device.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>idle.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/idle.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ipc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/ipc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>irq.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/irq.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>kservice.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/kservice.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/mem.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mempool.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/mempool.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>object.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/object.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>scheduler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/scheduler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>thread.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/thread.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/timer.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>CORTEX-M4</GroupName>
+          <Files>
+            <File>
+              <FileName>cpuport.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/cortex-m4/cpuport.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>context_rvds.S</FileName>
+              <FileType>2</FileType>
+              <FilePath>../../libcpu/arm/cortex-m4/context_rvds.S</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>backtrace.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>div0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>showmem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>cmd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_compiler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_error.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_heap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_init.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_node.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_ops.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_parser.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_var.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_vm.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_token.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+</Project>

+ 431 - 0
bsp/mini2440/project.Uv2

@@ -0,0 +1,431 @@
+### uVision2 Project, (C) Keil Software
+### Do not modify !
+
+Target (RT-Thread Mini2440), 0x0004 // Tools: 'ARM-ADS'
+
+Group (Startup)
+Group (Kernel)
+Group (S3C24X0)
+Group (pthreads)
+Group (libc)
+Group (libz)
+Group (jpeg)
+Group (libpng)
+Group (libdl)
+Group (finsh)
+Group (LwIP)
+Group (Filesystem)
+
+File 1,1,<./application.c><application.c>
+File 1,1,<./startup.c><startup.c>
+File 1,1,<./board.c><board.c>
+File 1,1,<./console.c><console.c>
+File 1,1,<./led.c><led.c>
+File 1,1,<./sdcard.c><sdcard.c>
+File 1,1,<./dm9000.c><dm9000.c>
+File 1,1,<../../src/clock.c><clock.c>
+File 1,1,<../../src/components.c><components.c>
+File 1,1,<../../src/device.c><device.c>
+File 1,1,<../../src/idle.c><idle.c>
+File 1,1,<../../src/ipc.c><ipc.c>
+File 1,1,<../../src/irq.c><irq.c>
+File 1,1,<../../src/kservice.c><kservice.c>
+File 1,1,<../../src/mem.c><mem.c>
+File 1,1,<../../src/mempool.c><mempool.c>
+File 1,1,<../../src/module.c><module.c>
+File 1,1,<../../src/object.c><object.c>
+File 1,1,<../../src/scheduler.c><scheduler.c>
+File 1,1,<../../src/thread.c><thread.c>
+File 1,1,<../../src/timer.c><timer.c>
+File 1,1,<../../libcpu/arm/s3c24x0/cpu.c><cpu.c>
+File 1,1,<../../libcpu/arm/s3c24x0/interrupt.c><interrupt.c>
+File 1,1,<../../libcpu/arm/s3c24x0/mmu.c><mmu.c>
+File 1,1,<../../libcpu/arm/s3c24x0/rtc.c><rtc.c>
+File 1,1,<../../libcpu/arm/s3c24x0/serial.c><serial.c>
+File 1,1,<../../libcpu/arm/s3c24x0/stack.c><stack.c>
+File 1,1,<../../libcpu/arm/s3c24x0/system_clock.c><system_clock.c>
+File 1,1,<../../libcpu/arm/s3c24x0/trap.c><trap.c>
+File 1,2,<../../libcpu/arm/s3c24x0/context_rvds.S><context_rvds.S>
+File 1,2,<../../libcpu/arm/s3c24x0/start_rvds.S><start_rvds.S>
+File 1,1,<../../libcpu/arm/common/backtrace.c><backtrace.c>
+File 1,1,<../../libcpu/arm/common/div0.c><div0.c>
+File 1,1,<../../libcpu/arm/common/showmem.c><showmem.c>
+File 1,1,<../../components/pthreads/clock_time.c><clock_time.c>
+File 1,1,<../../components/pthreads/mqueue.c><mqueue.c>
+File 1,1,<../../components/pthreads/pthread.c><pthread.c>
+File 1,1,<../../components/pthreads/pthread_attr.c><pthread_attr.c>
+File 1,1,<../../components/pthreads/pthread_barrier.c><pthread_barrier.c>
+File 1,1,<../../components/pthreads/pthread_cond.c><pthread_cond.c>
+File 1,1,<../../components/pthreads/pthread_mutex.c><pthread_mutex.c>
+File 1,1,<../../components/pthreads/pthread_rwlock.c><pthread_rwlock.c>
+File 1,1,<../../components/pthreads/pthread_spin.c><pthread_spin.c>
+File 1,1,<../../components/pthreads/pthread_tls.c><pthread_tls.c>
+File 1,1,<../../components/pthreads/sched.c><sched.c>
+File 1,1,<../../components/pthreads/semaphore.c><semaphore.c>
+File 1,1,<../../components/libc/armlibc/mem_std.c><mem_std.c>
+File 1,1,<../../components/libc/armlibc/stubs.c><stubs.c>
+File 1,1,<../../components/external/libz/adler32.c><adler32.c>
+File 1,1,<../../components/external/libz/compress.c><compress.c>
+File 1,1,<../../components/external/libz/crc32.c><crc32.c>
+File 1,1,<../../components/external/libz/deflate.c><deflate.c>
+File 1,1,<../../components/external/libz/infback.c><infback.c>
+File 1,1,<../../components/external/libz/inffast.c><inffast.c>
+File 1,1,<../../components/external/libz/inflate.c><inflate.c>
+File 1,1,<../../components/external/libz/inftrees.c><inftrees.c>
+File 1,1,<../../components/external/libz/trees.c><trees.c>
+File 1,1,<../../components/external/libz/uncompr.c><uncompr.c>
+File 1,1,<../../components/external/libz/zutil.c><zutil.c>
+File 1,1,<../../components/external/jpeg/jaricom.c><jaricom.c>
+File 1,1,<../../components/external/jpeg/jcomapi.c><jcomapi.c>
+File 1,1,<../../components/external/jpeg/jutils.c><jutils.c>
+File 1,1,<../../components/external/jpeg/jerror.c><jerror.c>
+File 1,1,<../../components/external/jpeg/jmemmgr.c><jmemmgr.c>
+File 1,1,<../../components/external/jpeg/jdapimin.c><jdapimin.c>
+File 1,1,<../../components/external/jpeg/jdapistd.c><jdapistd.c>
+File 1,1,<../../components/external/jpeg/jdarith.c><jdarith.c>
+File 1,1,<../../components/external/jpeg/jdtrans.c><jdtrans.c>
+File 1,1,<../../components/external/jpeg/jdmaster.c><jdmaster.c>
+File 1,1,<../../components/external/jpeg/jdinput.c><jdinput.c>
+File 1,1,<../../components/external/jpeg/jdmarker.c><jdmarker.c>
+File 1,1,<../../components/external/jpeg/jdhuff.c><jdhuff.c>
+File 1,1,<../../components/external/jpeg/jdmainct.c><jdmainct.c>
+File 1,1,<../../components/external/jpeg/jdcoefct.c><jdcoefct.c>
+File 1,1,<../../components/external/jpeg/jdpostct.c><jdpostct.c>
+File 1,1,<../../components/external/jpeg/jddctmgr.c><jddctmgr.c>
+File 1,1,<../../components/external/jpeg/jidctfst.c><jidctfst.c>
+File 1,1,<../../components/external/jpeg/jidctflt.c><jidctflt.c>
+File 1,1,<../../components/external/jpeg/jidctint.c><jidctint.c>
+File 1,1,<../../components/external/jpeg/jdsample.c><jdsample.c>
+File 1,1,<../../components/external/jpeg/jdcolor.c><jdcolor.c>
+File 1,1,<../../components/external/jpeg/jquant1.c><jquant1.c>
+File 1,1,<../../components/external/jpeg/jquant2.c><jquant2.c>
+File 1,1,<../../components/external/jpeg/jdmerge.c><jdmerge.c>
+File 1,1,<../../components/external/jpeg/jmemnobs.c><jmemnobs.c>
+File 1,1,<../../components/external/libpng/png.c><png.c>
+File 1,1,<../../components/external/libpng/pngerror.c><pngerror.c>
+File 1,1,<../../components/external/libpng/pnggccrd.c><pnggccrd.c>
+File 1,1,<../../components/external/libpng/pngget.c><pngget.c>
+File 1,1,<../../components/external/libpng/pngmem.c><pngmem.c>
+File 1,1,<../../components/external/libpng/pngpread.c><pngpread.c>
+File 1,1,<../../components/external/libpng/pngread.c><pngread.c>
+File 1,1,<../../components/external/libpng/pngrio.c><pngrio.c>
+File 1,1,<../../components/external/libpng/pngrtran.c><pngrtran.c>
+File 1,1,<../../components/external/libpng/pngrutil.c><pngrutil.c>
+File 1,1,<../../components/external/libpng/pngset.c><pngset.c>
+File 1,1,<../../components/external/libpng/pngtrans.c><pngtrans.c>
+File 1,1,<../../components/external/libpng/pngvcrd.c><pngvcrd.c>
+File 1,1,<../../components/external/libpng/pngwio.c><pngwio.c>
+File 1,1,<../../components/external/libpng/pngwrite.c><pngwrite.c>
+File 1,1,<../../components/external/libpng/pngwtran.c><pngwtran.c>
+File 1,1,<../../components/external/libpng/pngwutil.c><pngwutil.c>
+File 1,1,<../../components/libdl/dlclose.c><dlclose.c>
+File 1,1,<../../components/libdl/dlerror.c><dlerror.c>
+File 1,1,<../../components/libdl/dlopen.c><dlopen.c>
+File 1,1,<../../components/libdl/dlsym.c><dlsym.c>
+File 1,1,<../../components/finsh/shell.c><shell.c>
+File 1,1,<../../components/finsh/symbol.c><symbol.c>
+File 1,1,<../../components/finsh/cmd.c><cmd.c>
+File 1,1,<../../components/finsh/finsh_compiler.c><finsh_compiler.c>
+File 1,1,<../../components/finsh/finsh_error.c><finsh_error.c>
+File 1,1,<../../components/finsh/finsh_heap.c><finsh_heap.c>
+File 1,1,<../../components/finsh/finsh_init.c><finsh_init.c>
+File 1,1,<../../components/finsh/finsh_node.c><finsh_node.c>
+File 1,1,<../../components/finsh/finsh_ops.c><finsh_ops.c>
+File 1,1,<../../components/finsh/finsh_parser.c><finsh_parser.c>
+File 1,1,<../../components/finsh/finsh_var.c><finsh_var.c>
+File 1,1,<../../components/finsh/finsh_vm.c><finsh_vm.c>
+File 1,1,<../../components/finsh/finsh_token.c><finsh_token.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/api/api_lib.c><api_lib.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/api/api_msg.c><api_msg.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/api/err.c><err.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/api/netbuf.c><netbuf.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/api/netdb.c><netdb.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/api/netifapi.c><netifapi.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/api/sockets.c><sockets.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/api/tcpip.c><tcpip.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/arch/sys_arch.c><sys_arch.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/def.c><def.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/dhcp.c><dhcp.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/dns.c><dns.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/init.c><init.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/memp.c><memp.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/netif.c><netif.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/pbuf.c><pbuf.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/raw.c><raw.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/stats.c><stats.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/sys.c><sys.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/tcp.c><tcp.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/tcp_in.c><tcp_in.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/tcp_out.c><tcp_out.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/timers.c><timers.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/udp.c><udp.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/ipv4/autoip.c><autoip.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/ipv4/icmp.c><icmp.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/ipv4/igmp.c><igmp.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/ipv4/inet.c><inet.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/ipv4/inet_chksum.c><inet_chksum.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/ipv4/ip.c><ip.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/ipv4/ip_addr.c><ip_addr.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/core/ipv4/ip_frag.c><ip_frag.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/netif/etharp.c><etharp.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/netif/ethernetif.c><ethernetif.c>
+File 1,1,<../../components/net/lwip-1.4.1/src/netif/slipif.c><slipif.c>
+File 1,1,<../../components/dfs/src/dfs.c><dfs.c>
+File 1,1,<../../components/dfs/src/dfs_file.c><dfs_file.c>
+File 1,1,<../../components/dfs/src/dfs_fs.c><dfs_fs.c>
+File 1,1,<../../components/dfs/src/dfs_posix.c><dfs_posix.c>
+File 1,1,<../../components/dfs/filesystems/elmfat/dfs_elm.c><dfs_elm.c>
+File 1,1,<../../components/dfs/filesystems/elmfat/ff.c><ff.c>
+File 1,1,<../../components/dfs/filesystems/elmfat/option/cc936.c><cc936.c>
+File 1,1,<../../components/dfs/filesystems/devfs/console.c><devfs_console.c>
+File 1,1,<../../components/dfs/filesystems/devfs/devfs.c><devfs.c>
+File 2,1,<../../src/clock.c><src_clock.c>
+File 2,1,<../../src/components.c><src_components.c>
+File 2,1,<../../src/device.c><src_device.c>
+File 2,1,<../../src/idle.c><src_idle.c>
+File 2,1,<../../src/ipc.c><src_ipc.c>
+File 2,1,<../../src/irq.c><src_irq.c>
+File 2,1,<../../src/kservice.c><src_kservice.c>
+File 2,1,<../../src/mem.c><src_mem.c>
+File 2,1,<../../src/mempool.c><src_mempool.c>
+File 2,1,<../../src/module.c><src_module.c>
+File 2,1,<../../src/object.c><src_object.c>
+File 2,1,<../../src/scheduler.c><src_scheduler.c>
+File 2,1,<../../src/thread.c><src_thread.c>
+File 2,1,<../../src/timer.c><src_timer.c>
+File 3,1,<../../libcpu/arm/s3c24x0/cpu.c><s3c24x0_cpu.c>
+File 3,1,<../../libcpu/arm/s3c24x0/interrupt.c><s3c24x0_interrupt.c>
+File 3,1,<../../libcpu/arm/s3c24x0/mmu.c><s3c24x0_mmu.c>
+File 3,1,<../../libcpu/arm/s3c24x0/rtc.c><s3c24x0_rtc.c>
+File 3,1,<../../libcpu/arm/s3c24x0/serial.c><s3c24x0_serial.c>
+File 3,1,<../../libcpu/arm/s3c24x0/stack.c><s3c24x0_stack.c>
+File 3,1,<../../libcpu/arm/s3c24x0/system_clock.c><s3c24x0_system_clock.c>
+File 3,1,<../../libcpu/arm/s3c24x0/trap.c><s3c24x0_trap.c>
+File 3,2,<../../libcpu/arm/s3c24x0/context_rvds.S><s3c24x0_context_rvds.S>
+File 3,2,<../../libcpu/arm/s3c24x0/start_rvds.S><s3c24x0_start_rvds.S>
+File 3,1,<../../libcpu/arm/common/backtrace.c><common_backtrace.c>
+File 3,1,<../../libcpu/arm/common/div0.c><common_div0.c>
+File 3,1,<../../libcpu/arm/common/showmem.c><common_showmem.c>
+File 4,1,<../../components/pthreads/clock_time.c><pthreads_clock_time.c>
+File 4,1,<../../components/pthreads/mqueue.c><pthreads_mqueue.c>
+File 4,1,<../../components/pthreads/pthread.c><pthreads_pthread.c>
+File 4,1,<../../components/pthreads/pthread_attr.c><pthreads_pthread_attr.c>
+File 4,1,<../../components/pthreads/pthread_barrier.c><pthreads_pthread_barrier.c>
+File 4,1,<../../components/pthreads/pthread_cond.c><pthreads_pthread_cond.c>
+File 4,1,<../../components/pthreads/pthread_mutex.c><pthreads_pthread_mutex.c>
+File 4,1,<../../components/pthreads/pthread_rwlock.c><pthreads_pthread_rwlock.c>
+File 4,1,<../../components/pthreads/pthread_spin.c><pthreads_pthread_spin.c>
+File 4,1,<../../components/pthreads/pthread_tls.c><pthreads_pthread_tls.c>
+File 4,1,<../../components/pthreads/sched.c><pthreads_sched.c>
+File 4,1,<../../components/pthreads/semaphore.c><pthreads_semaphore.c>
+File 5,1,<../../components/libc/armlibc/mem_std.c><armlibc_mem_std.c>
+File 5,1,<../../components/libc/armlibc/stubs.c><armlibc_stubs.c>
+File 6,1,<../../components/external/libz/adler32.c><libz_adler32.c>
+File 6,1,<../../components/external/libz/compress.c><libz_compress.c>
+File 6,1,<../../components/external/libz/crc32.c><libz_crc32.c>
+File 6,1,<../../components/external/libz/deflate.c><libz_deflate.c>
+File 6,1,<../../components/external/libz/infback.c><libz_infback.c>
+File 6,1,<../../components/external/libz/inffast.c><libz_inffast.c>
+File 6,1,<../../components/external/libz/inflate.c><libz_inflate.c>
+File 6,1,<../../components/external/libz/inftrees.c><libz_inftrees.c>
+File 6,1,<../../components/external/libz/trees.c><libz_trees.c>
+File 6,1,<../../components/external/libz/uncompr.c><libz_uncompr.c>
+File 6,1,<../../components/external/libz/zutil.c><libz_zutil.c>
+File 7,1,<../../components/external/jpeg/jaricom.c><jpeg_jaricom.c>
+File 7,1,<../../components/external/jpeg/jcomapi.c><jpeg_jcomapi.c>
+File 7,1,<../../components/external/jpeg/jutils.c><jpeg_jutils.c>
+File 7,1,<../../components/external/jpeg/jerror.c><jpeg_jerror.c>
+File 7,1,<../../components/external/jpeg/jmemmgr.c><jpeg_jmemmgr.c>
+File 7,1,<../../components/external/jpeg/jdapimin.c><jpeg_jdapimin.c>
+File 7,1,<../../components/external/jpeg/jdapistd.c><jpeg_jdapistd.c>
+File 7,1,<../../components/external/jpeg/jdarith.c><jpeg_jdarith.c>
+File 7,1,<../../components/external/jpeg/jdtrans.c><jpeg_jdtrans.c>
+File 7,1,<../../components/external/jpeg/jdmaster.c><jpeg_jdmaster.c>
+File 7,1,<../../components/external/jpeg/jdinput.c><jpeg_jdinput.c>
+File 7,1,<../../components/external/jpeg/jdmarker.c><jpeg_jdmarker.c>
+File 7,1,<../../components/external/jpeg/jdhuff.c><jpeg_jdhuff.c>
+File 7,1,<../../components/external/jpeg/jdmainct.c><jpeg_jdmainct.c>
+File 7,1,<../../components/external/jpeg/jdcoefct.c><jpeg_jdcoefct.c>
+File 7,1,<../../components/external/jpeg/jdpostct.c><jpeg_jdpostct.c>
+File 7,1,<../../components/external/jpeg/jddctmgr.c><jpeg_jddctmgr.c>
+File 7,1,<../../components/external/jpeg/jidctfst.c><jpeg_jidctfst.c>
+File 7,1,<../../components/external/jpeg/jidctflt.c><jpeg_jidctflt.c>
+File 7,1,<../../components/external/jpeg/jidctint.c><jpeg_jidctint.c>
+File 7,1,<../../components/external/jpeg/jdsample.c><jpeg_jdsample.c>
+File 7,1,<../../components/external/jpeg/jdcolor.c><jpeg_jdcolor.c>
+File 7,1,<../../components/external/jpeg/jquant1.c><jpeg_jquant1.c>
+File 7,1,<../../components/external/jpeg/jquant2.c><jpeg_jquant2.c>
+File 7,1,<../../components/external/jpeg/jdmerge.c><jpeg_jdmerge.c>
+File 7,1,<../../components/external/jpeg/jmemnobs.c><jpeg_jmemnobs.c>
+File 8,1,<../../components/external/libpng/png.c><libpng_png.c>
+File 8,1,<../../components/external/libpng/pngerror.c><libpng_pngerror.c>
+File 8,1,<../../components/external/libpng/pnggccrd.c><libpng_pnggccrd.c>
+File 8,1,<../../components/external/libpng/pngget.c><libpng_pngget.c>
+File 8,1,<../../components/external/libpng/pngmem.c><libpng_pngmem.c>
+File 8,1,<../../components/external/libpng/pngpread.c><libpng_pngpread.c>
+File 8,1,<../../components/external/libpng/pngread.c><libpng_pngread.c>
+File 8,1,<../../components/external/libpng/pngrio.c><libpng_pngrio.c>
+File 8,1,<../../components/external/libpng/pngrtran.c><libpng_pngrtran.c>
+File 8,1,<../../components/external/libpng/pngrutil.c><libpng_pngrutil.c>
+File 8,1,<../../components/external/libpng/pngset.c><libpng_pngset.c>
+File 8,1,<../../components/external/libpng/pngtrans.c><libpng_pngtrans.c>
+File 8,1,<../../components/external/libpng/pngvcrd.c><libpng_pngvcrd.c>
+File 8,1,<../../components/external/libpng/pngwio.c><libpng_pngwio.c>
+File 8,1,<../../components/external/libpng/pngwrite.c><libpng_pngwrite.c>
+File 8,1,<../../components/external/libpng/pngwtran.c><libpng_pngwtran.c>
+File 8,1,<../../components/external/libpng/pngwutil.c><libpng_pngwutil.c>
+File 9,1,<../../components/libdl/dlclose.c><libdl_dlclose.c>
+File 9,1,<../../components/libdl/dlerror.c><libdl_dlerror.c>
+File 9,1,<../../components/libdl/dlopen.c><libdl_dlopen.c>
+File 9,1,<../../components/libdl/dlsym.c><libdl_dlsym.c>
+File 10,1,<../../components/finsh/shell.c><finsh_shell.c>
+File 10,1,<../../components/finsh/symbol.c><finsh_symbol.c>
+File 10,1,<../../components/finsh/cmd.c><finsh_cmd.c>
+File 10,1,<../../components/finsh/finsh_compiler.c><finsh_finsh_compiler.c>
+File 10,1,<../../components/finsh/finsh_error.c><finsh_finsh_error.c>
+File 10,1,<../../components/finsh/finsh_heap.c><finsh_finsh_heap.c>
+File 10,1,<../../components/finsh/finsh_init.c><finsh_finsh_init.c>
+File 10,1,<../../components/finsh/finsh_node.c><finsh_finsh_node.c>
+File 10,1,<../../components/finsh/finsh_ops.c><finsh_finsh_ops.c>
+File 10,1,<../../components/finsh/finsh_parser.c><finsh_finsh_parser.c>
+File 10,1,<../../components/finsh/finsh_var.c><finsh_finsh_var.c>
+File 10,1,<../../components/finsh/finsh_vm.c><finsh_finsh_vm.c>
+File 10,1,<../../components/finsh/finsh_token.c><finsh_finsh_token.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/api/api_lib.c><api_api_lib.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/api/api_msg.c><api_api_msg.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/api/err.c><api_err.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/api/netbuf.c><api_netbuf.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/api/netdb.c><api_netdb.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/api/netifapi.c><api_netifapi.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/api/sockets.c><api_sockets.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/api/tcpip.c><api_tcpip.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/arch/sys_arch.c><arch_sys_arch.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/def.c><core_def.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/dhcp.c><core_dhcp.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/dns.c><core_dns.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/init.c><core_init.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/memp.c><core_memp.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/netif.c><core_netif.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/pbuf.c><core_pbuf.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/raw.c><core_raw.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/stats.c><core_stats.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/sys.c><core_sys.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/tcp.c><core_tcp.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/tcp_in.c><core_tcp_in.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/tcp_out.c><core_tcp_out.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/timers.c><core_timers.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/udp.c><core_udp.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/ipv4/autoip.c><ipv4_autoip.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/ipv4/icmp.c><ipv4_icmp.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/ipv4/igmp.c><ipv4_igmp.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/ipv4/inet.c><ipv4_inet.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/ipv4/inet_chksum.c><ipv4_inet_chksum.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/ipv4/ip.c><ipv4_ip.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/ipv4/ip_addr.c><ipv4_ip_addr.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/core/ipv4/ip_frag.c><ipv4_ip_frag.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/netif/etharp.c><netif_etharp.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/netif/ethernetif.c><netif_ethernetif.c>
+File 11,1,<../../components/net/lwip-1.4.1/src/netif/slipif.c><netif_slipif.c>
+File 12,1,<../../components/dfs/src/dfs.c><src_dfs.c>
+File 12,1,<../../components/dfs/src/dfs_file.c><src_dfs_file.c>
+File 12,1,<../../components/dfs/src/dfs_fs.c><src_dfs_fs.c>
+File 12,1,<../../components/dfs/src/dfs_posix.c><src_dfs_posix.c>
+File 12,1,<../../components/dfs/filesystems/elmfat/dfs_elm.c><elmfat_dfs_elm.c>
+File 12,1,<../../components/dfs/filesystems/elmfat/ff.c><elmfat_ff.c>
+File 12,1,<../../components/dfs/filesystems/elmfat/option/cc936.c><option_cc936.c>
+File 12,1,<../../components/dfs/filesystems/devfs/console.c><devfs_console.c>
+File 12,1,<../../components/dfs/filesystems/devfs/devfs.c><devfs_devfs.c>
+
+
+
+
+Options 1,0,0  // Target 'RT-Thread Mini2440'
+ Device (S3C2440A)
+ Vendor (Samsung)
+ Cpu (IRAM(0x40000000-0x40000FFF) CLOCK(12000000) CPUTYPE(ARM920T))
+ FlashUt ()
+ StupF ("STARTUP\Samsung\S3C2440.s" ("Samsung S3C2440 Startup Code"))
+ FlashDR (UL2ARM(-UV2077N9E -O40 -S0 -C0 -N00("ARM920T Core") -D00(0032409D) -L00(4) -FO7 -FD40000000 -FC1000 -FN1 -FF0S3C2440_NAND_SP -FS030000000 -FL07FFC000))
+ DevID (4277)
+ Rgf (S3C2440.H)
+ Mem ()
+ C ()
+ A ()
+ RL ()
+ OH ()
+ DBC_IFX ()
+ DBC_CMS ()
+ DBC_AMS ()
+ DBC_LMS ()
+ UseEnv=0
+ EnvBin ()
+ EnvInc ()
+ EnvLib ()
+ EnvReg (ÿSamsung\)
+ OrgReg (ÿSamsung\)
+ TgStat=16
+ OutDir (.\obj\)
+ OutName (rtthread-mini2440)
+ GenApp=1
+ GenLib=0
+ GenHex=0
+ Debug=1
+ Browse=0
+ LstDir (.\obj)
+ HexSel=1
+ MG32K=0
+ TGMORE=0
+ RunUsr 0 0 <>
+ RunUsr 1 0 <>
+ BrunUsr 0 0 <>
+ BrunUsr 1 0 <>
+ CrunUsr 0 0 <>
+ CrunUsr 1 0 <>
+ SVCSID <>
+ GLFLAGS=1790
+ ADSFLGA { 242,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ ACPUTYP (ARM920T)
+ RVDEV ()
+ ADSTFLGA { 0,8,64,0,96,0,64,64,0,0,0,0,0,0,0,0,0,0,0,0 }
+ OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ OCMADSIRAM { 0,0,0,0,64,0,16,0,0 }
+ OCMADSIROM { 0,0,0,0,0,0,0,0,0 }
+ OCMADSXRAM { 0,0,0,0,0,0,0,0,0 }
+ OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,16,0,0,0,0,0,0,0,0,0,0,0 }
+ RV_STAVEC ()
+ ADSCCFLG { 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ ADSCMISC (--diag_suppress=870)
+ ADSCDEFN (RT_USING_ARM_LIBC)
+ ADSCUDEF ()
+ ADSCINCD (../../components/libdl;../../components/external/libpng;../../libcpu/arm/s3c24x0;../../components/finsh;../../components/net/lwip-1.4.1/src;../../components/pthreads;../../components/dfs/filesystems/elmfat;../../libcpu/arm/common;../../components/dfs/filesystems/devfs;.;../../components/external/libz;../../components/net/lwip-1.4.1/src/include/netif;../../include;../../components/dfs/include;../../components/net/lwip-1.4.1/src/include;../../components/external/jpeg;../../components/libc/armlibc;../../components/net/lwip-1.4.1/src/arch/include;../../components/net/lwip-1.4.1/src/include/ipv4)
+ ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ ADSAMISC ()
+ ADSADEFN ()
+ ADSAUDEF ()
+ ADSAINCD ()
+ PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ IncBld=1
+ AlwaysBuild=0
+ GenAsm=0
+ AsmAsm=0
+ PublicsOnly=0
+ StopCode=3
+ CustArgs ()
+ LibMods ()
+ ADSLDFG { 16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ ADSLDTA (0x30000000)
+ ADSLDDA (0x40000000)
+ ADSLDSC (rtthread-mini2440.sct)
+ ADSLDIB ()
+ ADSLDIC ()
+ ADSLDMC ( --keep *.o(RTMSymTab)   --keep *.o(FSymTab) --keep *.o(VSymTab) )
+ ADSLDIF ()
+ ADSLDDW ()
+  OPTDL (SARM.DLL)()(DARMSS9.DLL)(-pS3C2440A)(SARM.DLL)()(TARMSS9.DLL)(-pS3C2440A)
+  OPTDBG 47614,6,()()()()()()()()()(.\Ext_RAM.ini) (Segger\JLTAgdi.dll)()()()
+ FLASH1 { 1,0,0,0,1,0,0,0,4,16,0,0,0,0,0,0,0,0,0,0 }
+ FLASH2 (Segger\JLTAgdi.dll)
+ FLASH3 ("" ())
+ FLASH4 ()
+EndOpt
+

+ 646 - 0
bsp/nrf51822/project.uvproj

@@ -0,0 +1,646 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+  <SchemaVersion>2.1</SchemaVersion>
+  <Header>### uVision Project, (C) Keil Software</Header>
+  <Targets>
+    <Target>
+      <TargetName>rt-thread</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>nRF51822_xxAA</Device>
+          <Vendor>Nordic Semiconductor</Vendor>
+          <PackID>NordicSemiconductor.nRF_DeviceFamilyPack.1.1.4</PackID>
+          <PackURL>http://developer.nordicsemi.com/nRF51_SDK/pieces/nRF_DeviceFamilyPack/</PackURL>
+          <Cpu>IROM(0x00000000,0x40000) IRAM(0x20000000,0x4000) CPUTYPE("Cortex-M0") CLOCK(12000000) ELITTLE</Cpu>
+          <FlashUtilSpec />
+          <StartupFile />
+          <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0nrf51xxx -FS00 -FL0200000 -FP0($$Device:nRF51822_xxAA$Flash\nrf51xxx.flm))</FlashDriverDll>
+          <DeviceId>0</DeviceId>
+          <RegisterFile>$$Device:nRF51822_xxAA$Device\Include\nrf.h</RegisterFile>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile>$$Device:nRF51822_xxAA$SVD\nrf51.xml</SFDFile>
+          <bCustSvd>0</bCustSvd>
+          <UseEnv>0</UseEnv>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
+          <RegisterFilePath />
+          <DBRegisterFilePath />
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\build\</OutputDirectory>
+          <OutputName>template</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\build\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopB1X>0</nStopB1X>
+            <nStopB2X>0</nStopB2X>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString />
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument />
+          <IncludeLibraryModules />
+          <ComprImg>1</ComprImg>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments> </SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments>-pCM0</SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments> </TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments>-pCM0</TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>0</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+            <RestoreSysVw>1</RestoreSysVw>
+          </Simulator>
+          <Target>
+            <UseTarget>1</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+            <RestoreSysVw>1</RestoreSysVw>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>6</TargetSelection>
+          <SimDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+            <Driver>Segger\JL2CM3.dll</Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4096</DriverSelection>
+          </Flash1>
+          <bUseTDR>1</bUseTDR>
+          <Flash2>BIN\UL2CM3.DLL</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4 />
+          <pFcarmOut />
+          <pFcarmGrp />
+          <pFcArmRoot />
+          <FcArmLst>0</FcArmLst>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName />
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>1</hadIROM>
+            <hadIRAM>1</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>8</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>0</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>3</RoSelD>
+            <RwSelD>3</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>0</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>1</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>0</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>1</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x4000</Size>
+              </IRAM>
+              <IROM>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x40000</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x40000</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x4000</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector />
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>1</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>1</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <uC99>0</uC99>
+            <useXO>0</useXO>
+            <VariousControls>
+              <MiscControls>--c99</MiscControls>
+              <Define>NRF51, USE_STDPERIPH_DRIVER</Define>
+              <Undefine />
+              <IncludePath>Libraries/CMSIS/Include;Libraries/nrf51822/Include;applications;.;drivers;../../include;../../libcpu/arm/cortex-m0;../../libcpu/arm/common;../../components/drivers/include;../../components/finsh</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <useXO>0</useXO>
+            <VariousControls>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x08000000</TextAddressRange>
+            <DataAddressRange>0x20000000</DataAddressRange>
+            <pXoBase />
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(FSymTab)</Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup Code</GroupName>
+          <Files>
+            <File>
+              <FileName>system_nrf51.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Libraries/nrf51822/Source/templates/system_nrf51.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>arm_startup_nrf51.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>Libraries/nrf51822/Source/templates/arm/arm_startup_nrf51.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
+            <File>
+              <FileName>application.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/application.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/startup.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/board.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/uart.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Kernel</GroupName>
+          <Files>
+            <File>
+              <FileName>clock.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>device.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/device.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>idle.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/idle.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ipc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/ipc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>irq.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/irq.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>kservice.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/kservice.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>object.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/object.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>scheduler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/scheduler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>thread.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/thread.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/timer.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>CORTEX-M0</GroupName>
+          <Files>
+            <File>
+              <FileName>cpuport.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/cortex-m0/cpuport.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>context_rvds.S</FileName>
+              <FileType>2</FileType>
+              <FilePath>../../libcpu/arm/cortex-m0/context_rvds.S</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>backtrace.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>div0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>showmem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>DeviceDrivers</GroupName>
+          <Files>
+            <File>
+              <FileName>completion.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/completion.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>portal.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/portal.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ringbuffer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>workqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>cmd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>msh_cmd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/msh_cmd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>msh.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/msh.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+</Project>

+ 277 - 140
bsp/sam7x/project.uvproj

@@ -1,10 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
 <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
-
   <SchemaVersion>1.1</SchemaVersion>
-
   <Header>### uVision Project, (C) Keil Software</Header>
-
   <Targets>
     <Target>
       <TargetName>RT-Thread/AT91SAM7X256</TargetName>
@@ -15,25 +12,25 @@
           <Device>AT91SAM7X256</Device>
           <Vendor>Atmel</Vendor>
           <Cpu>IRAM(0x200000-0x20FFFF) IROM(0x100000-0x13FFFF) CLOCK(18432000) CPUTYPE(ARM7TDMI)</Cpu>
-          <FlashUtilSpec></FlashUtilSpec>
+          <FlashUtilSpec />
           <StartupFile>"STARTUP\Atmel\SAM7.s" ("Atmel AT91SAM7 Startup Code")</StartupFile>
           <FlashDriverDll>UL2ARM(-U56240812 -O15 -S0 -C0 -FO7 -FD200000 -FC800 -FN1 -FF0AT91SAM7_256 -FS0100000 -FL040000)</FlashDriverDll>
           <DeviceId>4081</DeviceId>
           <RegisterFile>AT91SAM7X256.H</RegisterFile>
-          <MemoryEnv></MemoryEnv>
-          <Cmp></Cmp>
-          <Asm></Asm>
-          <Linker></Linker>
-          <OHString></OHString>
-          <InfinionOptionDll></InfinionOptionDll>
-          <SLE66CMisc></SLE66CMisc>
-          <SLE66AMisc></SLE66AMisc>
-          <SLE66LinkerMisc></SLE66LinkerMisc>
-          <SFDFile></SFDFile>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile />
           <UseEnv>0</UseEnv>
-          <BinPath></BinPath>
-          <IncludePath></IncludePath>
-          <LibPath></LibPath>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
           <RegisterFilePath>Atmel\SAM7X\</RegisterFilePath>
           <DBRegisterFilePath>Atmel\SAM7X\</DBRegisterFilePath>
           <TargetStatus>
@@ -57,31 +54,29 @@
           <BeforeCompile>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
-            <nStopU1X>0</nStopU1X>
-            <nStopU2X>0</nStopU2X>
           </BeforeCompile>
           <BeforeMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </BeforeMake>
           <AfterMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </AfterMake>
           <SelectedForBatchBuild>0</SelectedForBatchBuild>
-          <SVCSIdString></SVCSIdString>
+          <SVCSIdString />
         </TargetCommonOption>
         <CommonProperty>
           <UseCPPCompiler>0</UseCPPCompiler>
@@ -95,8 +90,8 @@
           <AssembleAssemblyFile>0</AssembleAssemblyFile>
           <PublicsOnly>0</PublicsOnly>
           <StopOnExitCode>3</StopOnExitCode>
-          <CustomArgument></CustomArgument>
-          <IncludeLibraryModules></IncludeLibraryModules>
+          <CustomArgument />
+          <IncludeLibraryModules />
         </CommonProperty>
         <DllOption>
           <SimDllName>SARM.DLL</SimDllName>
@@ -104,7 +99,7 @@
           <SimDlgDll>DARMATS.DLL</SimDlgDll>
           <SimDlgDllArguments>-p91SAM7X256</SimDlgDllArguments>
           <TargetDllName>SARM.DLL</TargetDllName>
-          <TargetDllArguments></TargetDllArguments>
+          <TargetDllArguments />
           <TargetDlgDll>TARMATS.DLL</TargetDlgDll>
           <TargetDlgDllArguments>-p91SAM7X256</TargetDlgDllArguments>
         </DllOption>
@@ -140,18 +135,18 @@
           <RunDebugAfterBuild>0</RunDebugAfterBuild>
           <TargetSelection>6</TargetSelection>
           <SimDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
           </SimDlls>
           <TargetDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
             <Driver>Segger\JLTAgdi.dll</Driver>
           </TargetDlls>
         </DebugOption>
@@ -166,7 +161,7 @@
           </Flash1>
           <Flash2>Segger\JLTAgdi.dll</Flash2>
           <Flash3>"" ()</Flash3>
-          <Flash4></Flash4>
+          <Flash4 />
         </Utilities>
         <TargetArmAds>
           <ArmAdsMisc>
@@ -198,7 +193,7 @@
             <RvctClst>0</RvctClst>
             <GenPPlst>0</GenPPlst>
             <AdsCpuType>ARM7TDMI</AdsCpuType>
-            <RvctDeviceName></RvctDeviceName>
+            <RvctDeviceName />
             <mOS>0</mOS>
             <uocRom>0</uocRom>
             <uocRam>0</uocRam>
@@ -329,7 +324,7 @@
                 <Size>0x0</Size>
               </OCR_RVCT10>
             </OnChipMemories>
-            <RvctStartVector></RvctStartVector>
+            <RvctStartVector />
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
@@ -345,10 +340,10 @@
             <wLevel>0</wLevel>
             <uThumb>0</uThumb>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath>.;..\..\components\finsh;..\..\components\net\lwip\src;..\..\components\net\lwip\src\arch\include;..\..\components\net\lwip\src\include;..\..\components\net\lwip\src\include\ipv4;..\..\components\net\lwip\src\include\netif;..\..\include;..\..\libcpu\arm\AT91SAM7X;..\..\libcpu\arm\common;applications;drivers</IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath>applications;.;drivers;../../include;../../libcpu/arm/AT91SAM7X;../../libcpu/arm/common;../../components/finsh;../../components/net/lwip-1.4.1/src;../../components/net/lwip-1.4.1/src/include;../../components/net/lwip-1.4.1/src/include/ipv4;../../components/net/lwip-1.4.1/src/arch/include;../../components/net/lwip-1.4.1/src/include/netif</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -360,10 +355,10 @@
             <SwStkChk>0</SwStkChk>
             <NoWarn>0</NoWarn>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath></IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
             </VariousControls>
           </Aads>
           <LDads>
@@ -375,12 +370,12 @@
             <useFile>0</useFile>
             <TextAddressRange>0x00100000</TextAddressRange>
             <DataAddressRange>0x00200000</DataAddressRange>
-            <ScatterFile></ScatterFile>
-            <IncludeLibs></IncludeLibs>
-            <IncludeLibsPath></IncludeLibsPath>
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
-            <LinkerInputFile></LinkerInputFile>
-            <DisabledWarnings></DisabledWarnings>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
           </LDads>
         </TargetArmAds>
       </TargetOption>
@@ -391,12 +386,14 @@
             <File>
               <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>applications/startup.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -406,17 +403,21 @@
             <File>
               <FileName>board.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\board.c</FilePath>
+              <FilePath>drivers/board.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sam7x_emac.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\sam7x_emac.c</FilePath>
+              <FilePath>drivers/sam7x_emac.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>serial.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\serial.c</FilePath>
+              <FilePath>drivers/serial.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -426,62 +427,91 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -491,117 +521,157 @@
             <File>
               <FileName>cpu.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\AT91SAM7X\cpu.c</FilePath>
+              <FilePath>../../libcpu/arm/AT91SAM7X/cpu.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>interrupt.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\AT91SAM7X\interrupt.c</FilePath>
+              <FilePath>../../libcpu/arm/AT91SAM7X/interrupt.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stack.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\AT91SAM7X\stack.c</FilePath>
+              <FilePath>../../libcpu/arm/AT91SAM7X/stack.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>trap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\AT91SAM7X\trap.c</FilePath>
+              <FilePath>../../libcpu/arm/AT91SAM7X/trap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\AT91SAM7X\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/AT91SAM7X/context_rvds.S</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>start_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\AT91SAM7X\start_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/AT91SAM7X/start_rvds.S</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
             </File>
           </Files>
         </Group>
         <Group>
           <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
           <Files>
             <File>
               <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
-            </File>
-            <File>
-              <FileName>finsh_token.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
-            </File>
-            <File>
-              <FileName>shell.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>symbol.c</FileName>
+              <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -611,182 +681,249 @@
             <File>
               <FileName>api_lib.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\api_lib.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_lib.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>api_msg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\api_msg.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_msg.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>err.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\err.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/err.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netbuf.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\netbuf.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netbuf.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netdb.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\netdb.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netdb.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netifapi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\netifapi.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netifapi.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sockets.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\sockets.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/sockets.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcpip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\tcpip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/tcpip.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sys_arch.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\arch\sys_arch.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/arch/sys_arch.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>def.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\def.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/def.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>dhcp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\dhcp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dhcp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>dns.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\dns.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dns.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\init.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/init.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>memp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\memp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/memp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\netif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/netif.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>pbuf.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\pbuf.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/pbuf.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>raw.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\raw.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/raw.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stats.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\stats.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/stats.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sys.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\sys.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/sys.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\tcp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcp_in.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\tcp_in.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_in.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcp_out.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\tcp_out.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_out.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timers.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\timers.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/timers.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>udp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\udp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/udp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>autoip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\autoip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/autoip.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>icmp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\icmp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/icmp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>igmp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\igmp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/igmp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>inet.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\inet.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>inet_chksum.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\inet_chksum.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet_chksum.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\ip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ip_addr.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\ip_addr.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_addr.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ip_frag.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\ip_frag.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_frag.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>etharp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\netif\etharp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/etharp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ethernetif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\netif\ethernetif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/ethernetif.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>slipif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\netif\slipif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/slipif.c</FilePath>
             </File>
           </Files>
         </Group>
       </Groups>
     </Target>
   </Targets>
-
 </Project>

+ 387 - 121
bsp/stm32f0x/project.uvproj

@@ -1,10 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
 <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
-
   <SchemaVersion>1.1</SchemaVersion>
-
   <Header>### uVision Project, (C) Keil Software</Header>
-
   <Targets>
     <Target>
       <TargetName>rt-thread</TargetName>
@@ -15,25 +12,25 @@
           <Device>STM32F051R8</Device>
           <Vendor>STMicroelectronics</Vendor>
           <Cpu>IRAM(0x20000000-0x20001FFF) IROM(0x8000000-0x800FFFF) CLOCK(8000000) CPUTYPE("Cortex-M0")</Cpu>
-          <FlashUtilSpec></FlashUtilSpec>
+          <FlashUtilSpec />
           <StartupFile>"Startup\ST\STM32F0xx\startup_stm32f0xx.s" ("STM32F0xx Startup Code")</StartupFile>
           <FlashDriverDll>UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F05x_64 -FS08000000 -FL010000)</FlashDriverDll>
           <DeviceId>6188</DeviceId>
           <RegisterFile>stm32f0xx.h</RegisterFile>
-          <MemoryEnv></MemoryEnv>
-          <Cmp></Cmp>
-          <Asm></Asm>
-          <Linker></Linker>
-          <OHString></OHString>
-          <InfinionOptionDll></InfinionOptionDll>
-          <SLE66CMisc></SLE66CMisc>
-          <SLE66AMisc></SLE66AMisc>
-          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
           <SFDFile>SFD\ST\STM32F0xx\STM32F051xx.sfr</SFDFile>
           <UseEnv>0</UseEnv>
-          <BinPath></BinPath>
-          <IncludePath></IncludePath>
-          <LibPath></LibPath>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
           <RegisterFilePath>ST\STM32F0xx\</RegisterFilePath>
           <DBRegisterFilePath>ST\STM32F0xx\</DBRegisterFilePath>
           <TargetStatus>
@@ -57,8 +54,8 @@
           <BeforeCompile>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
             <nStopU1X>0</nStopU1X>
@@ -67,21 +64,21 @@
           <BeforeMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </BeforeMake>
           <AfterMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </AfterMake>
           <SelectedForBatchBuild>0</SelectedForBatchBuild>
-          <SVCSIdString></SVCSIdString>
+          <SVCSIdString />
         </TargetCommonOption>
         <CommonProperty>
           <UseCPPCompiler>0</UseCPPCompiler>
@@ -95,16 +92,16 @@
           <AssembleAssemblyFile>0</AssembleAssemblyFile>
           <PublicsOnly>0</PublicsOnly>
           <StopOnExitCode>3</StopOnExitCode>
-          <CustomArgument></CustomArgument>
-          <IncludeLibraryModules></IncludeLibraryModules>
+          <CustomArgument />
+          <IncludeLibraryModules />
         </CommonProperty>
         <DllOption>
           <SimDllName>SARMCM3.DLL</SimDllName>
-          <SimDllArguments></SimDllArguments>
+          <SimDllArguments />
           <SimDlgDll>DARMCM1.DLL</SimDlgDll>
           <SimDlgDllArguments>-pCM0</SimDlgDllArguments>
           <TargetDllName>SARMCM3.DLL</TargetDllName>
-          <TargetDllArguments></TargetDllArguments>
+          <TargetDllArguments />
           <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
           <TargetDlgDllArguments>-pCM0</TargetDlgDllArguments>
         </DllOption>
@@ -140,18 +137,18 @@
           <RunDebugAfterBuild>0</RunDebugAfterBuild>
           <TargetSelection>13</TargetSelection>
           <SimDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
           </SimDlls>
           <TargetDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
             <Driver>STLink\ST-LINKIII-KEIL_SWO.dll</Driver>
           </TargetDlls>
         </DebugOption>
@@ -166,7 +163,7 @@
           </Flash1>
           <Flash2>STLink\ST-LINKIII-KEIL_SWO.dll</Flash2>
           <Flash3>"" ()</Flash3>
-          <Flash4></Flash4>
+          <Flash4 />
         </Utilities>
         <TargetArmAds>
           <ArmAdsMisc>
@@ -198,7 +195,7 @@
             <RvctClst>0</RvctClst>
             <GenPPlst>0</GenPPlst>
             <AdsCpuType>"Cortex-M0"</AdsCpuType>
-            <RvctDeviceName></RvctDeviceName>
+            <RvctDeviceName />
             <mOS>0</mOS>
             <uocRom>0</uocRom>
             <uocRam>0</uocRam>
@@ -329,7 +326,7 @@
                 <Size>0x0</Size>
               </OCR_RVCT10>
             </OnChipMemories>
-            <RvctStartVector></RvctStartVector>
+            <RvctStartVector />
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
@@ -345,10 +342,10 @@
             <wLevel>0</wLevel>
             <uThumb>0</uThumb>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define>USE_STDPERIPH_DRIVER</Define>
-              <Undefine></Undefine>
-              <IncludePath>.;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m0;Libraries\CMSIS\Include;Libraries\CMSIS\ST\STM32F0xx\Include;Libraries\STM32F0xx_StdPeriph_Driver\inc;applications;drivers</IncludePath>
+              <MiscControls />
+              <Define>RT_USING_ARM_LIBC, USE_STDPERIPH_DRIVER</Define>
+              <Undefine />
+              <IncludePath>Libraries/STM32F0xx_StdPeriph_Driver/inc;Libraries/CMSIS/ST/STM32F0xx/Include;Libraries/CMSIS/Include;applications;.;drivers;../../include;../../libcpu/arm/cortex-m0;../../libcpu/arm/common;../../components/libc/armlibc;../../components/drivers/include;../../components/drivers/include;../../components/finsh</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -360,10 +357,10 @@
             <SwStkChk>0</SwStkChk>
             <NoWarn>0</NoWarn>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath></IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
             </VariousControls>
           </Aads>
           <LDads>
@@ -375,163 +372,225 @@
             <useFile>0</useFile>
             <TextAddressRange>0x08000000</TextAddressRange>
             <DataAddressRange>0x20000000</DataAddressRange>
-            <ScatterFile></ScatterFile>
-            <IncludeLibs></IncludeLibs>
-            <IncludeLibsPath></IncludeLibsPath>
-            <Misc></Misc>
-            <LinkerInputFile></LinkerInputFile>
-            <DisabledWarnings></DisabledWarnings>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
           </LDads>
         </TargetArmAds>
       </TargetOption>
       <Groups>
         <Group>
-          <GroupName>Applications</GroupName>
+          <GroupName>STM32_StdPeriph</GroupName>
           <Files>
             <File>
-              <FileName>application.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
-            </File>
-            <File>
-              <FileName>startup.c</FileName>
+              <FileName>system_stm32f0xx.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>Libraries/CMSIS/ST/STM32F0xx/Source/Templates/system_stm32f0xx.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>Drivers</GroupName>
           <Files>
             <File>
-              <FileName>board.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>drivers\board.c</FilePath>
-            </File>
-            <File>
-              <FileName>stm32f0xx_it.c</FileName>
+              <FileName>stm32f0xx_adc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\stm32f0xx_it.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_adc.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>STM32_StdPeriph</GroupName>
           <Files>
-            <File>
-              <FileName>system_stm32f0xx.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>Libraries\CMSIS\ST\STM32F0xx\Source\Templates\system_stm32f0xx.c</FilePath>
-            </File>
-            <File>
-              <FileName>stm32f0xx_adc.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_adc.c</FilePath>
-            </File>
             <File>
               <FileName>stm32f0xx_cec.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_cec.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_cec.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_comp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_comp.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_comp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_crc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_crc.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_crc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_dac.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_dac.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dac.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_dbgmcu.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_dbgmcu.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dbgmcu.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_dma.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_dma.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_dma.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_exti.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_exti.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_exti.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_flash.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_flash.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_flash.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_gpio.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_gpio.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_gpio.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_i2c.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_i2c.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_i2c.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_iwdg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_iwdg.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_iwdg.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_misc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_misc.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_misc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_pwr.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_pwr.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_pwr.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_rcc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_rcc.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rcc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_rtc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_rtc.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_rtc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_spi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_spi.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_spi.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_syscfg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_syscfg.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_tim.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_tim.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_tim.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_usart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_usart.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_usart.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stm32f0xx_wwdg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_wwdg.c</FilePath>
+              <FilePath>Libraries/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_wwdg.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>startup_stm32f0xx.s</FileName>
               <FileType>2</FileType>
-              <FilePath>Libraries\CMSIS\ST\STM32F0xx\Source\Templates\arm\startup_stm32f0xx.s</FilePath>
+              <FilePath>Libraries/CMSIS/ST/STM32F0xx/Source/Templates/arm/startup_stm32f0xx.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
+            <File>
+              <FileName>application.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/application.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/startup.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/board.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>led.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/led.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>stm32f0xx_it.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/stm32f0xx_it.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>usart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/usart.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -541,47 +600,84 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
             </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>device.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/device.c</FilePath>
+            </File>
+          </Files>
+          <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/mem.c</FilePath>
+            </File>
+          </Files>
+          <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -591,32 +687,202 @@
             <File>
               <FileName>cpuport.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m0\cpuport.c</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m0/cpuport.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m0\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m0/context_rvds.S</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>libc</GroupName>
+          <Files>
+            <File>
+              <FileName>mem_std.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/libc/armlibc/mem_std.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>stubs.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/libc/armlibc/stubs.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>DeviceDrivers</GroupName>
+          <Files>
+            <File>
+              <FileName>serial.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/serial/serial.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>completion.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/completion.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dataqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/dataqueue.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pipe.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/pipe.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>portal.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/portal.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ringbuffer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>workqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>cmd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_compiler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_error.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_heap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_init.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_node.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_ops.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_parser.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_var.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_vm.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_token.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>
       </Groups>
     </Target>
   </Targets>
-
 </Project>

+ 4 - 1624
bsp/stm32f107/project.uvopt

@@ -71,7 +71,7 @@
         <LExpSel>0</LExpSel>
       </OPTXL>
       <OPTFL>
-        <tvExp>1</tvExp>
+        <tvExp>0</tvExp>
         <tvExpOptDlg>0</tvExpOptDlg>
         <IsCurrentTarget>1</IsCurrentTarget>
       </OPTFL>
@@ -102,7 +102,7 @@
         <uSim>0</uSim>
         <uTrg>1</uTrg>
         <sLdApp>1</sLdApp>
-        <sGomain>1</sGomain>
+        <sGomain>0</sGomain>
         <sRbreak>1</sRbreak>
         <sRwatch>1</sRwatch>
         <sRmem>1</sRmem>
@@ -130,65 +130,6 @@
         <tIfile></tIfile>
         <pMon>Segger\JL2CM3.dll</pMon>
       </DebugOpt>
-      <TargetDriverDllRegistry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>DLGUARM</Key>
-          <Name>(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>DLGDARM</Key>
-          <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>DLGTARM</Key>
-          <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>ARMDBGFLAGS</Key>
-          <Name>-T0</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>JL2CM3</Key>
-          <Name>-U12345678 -O14 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -N01("Unknown JTAG device") -D01(06418041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO27 -FD20000000 -FC800 -FN1 -FF0STM32F10x_CL -FS08000000 -FL040000</Name>
-        </SetRegEntry>
-      </TargetDriverDllRegistry>
-      <Breakpoint>
-        <Bp>
-          <Number>0</Number>
-          <Type>0</Type>
-          <LineNumber>272</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>134282140</Address>
-          <ByteObject>0</ByteObject>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>1</BreakIfRCount>
-          <Filename></Filename>
-          <ExecCommand></ExecCommand>
-          <Expression>\\rtthread_stm32\init\272</Expression>
-        </Bp>
-        <Bp>
-          <Number>1</Number>
-          <Type>0</Type>
-          <LineNumber>274</LineNumber>
-          <EnabledFlag>1</EnabledFlag>
-          <Address>134279930</Address>
-          <ByteObject>0</ByteObject>
-          <ManyObjects>0</ManyObjects>
-          <SizeOfObject>0</SizeOfObject>
-          <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>1</BreakIfRCount>
-          <Filename></Filename>
-          <ExecCommand></ExecCommand>
-          <Expression>\\rtthread_stm32\dns\274</Expression>
-        </Bp>
-      </Breakpoint>
       <DebugFlag>
         <trace>0</trace>
         <periodic>0</periodic>
@@ -197,7 +138,7 @@
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>
         <aPa>0</aPa>
-        <viewmode>1</viewmode>
+        <viewmode>0</viewmode>
         <vrSel>0</vrSel>
         <aSym>0</aSym>
         <aTbox>0</aTbox>
@@ -212,7 +153,7 @@
         <aSer4>0</aSer4>
         <StkLoc>0</StkLoc>
         <TrcWin>0</TrcWin>
-        <newCpu>0</newCpu>
+        <newCpu>3</newCpu>
         <uProt>0</uProt>
       </DebugFlag>
       <LintExecutable></LintExecutable>
@@ -220,1565 +161,4 @@
     </TargetOption>
   </Target>
 
-  <Group>
-    <GroupName>Startup</GroupName>
-    <tvExp>0</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <File>
-      <GroupNumber>1</GroupNumber>
-      <FileNumber>1</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>70</TopLine>
-      <CurrentLine>84</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>.\application.c</PathWithFileName>
-      <FilenameWithoutPath>application.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>1</GroupNumber>
-      <FileNumber>2</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>108</TopLine>
-      <CurrentLine>120</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>.\startup.c</PathWithFileName>
-      <FilenameWithoutPath>startup.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>1</GroupNumber>
-      <FileNumber>3</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>.\board.c</PathWithFileName>
-      <FilenameWithoutPath>board.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>1</GroupNumber>
-      <FileNumber>4</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>58</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>166</TopLine>
-      <CurrentLine>166</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>.\stm32f10x_it.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_it.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>1</GroupNumber>
-      <FileNumber>5</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>.\usart.c</PathWithFileName>
-      <FilenameWithoutPath>usart.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>1</GroupNumber>
-      <FileNumber>6</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>1</TopLine>
-      <CurrentLine>1</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>.\serial.c</PathWithFileName>
-      <FilenameWithoutPath>serial.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>1</GroupNumber>
-      <FileNumber>7</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>.\stm32_eth.c</PathWithFileName>
-      <FilenameWithoutPath>stm32_eth.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>1</GroupNumber>
-      <FileNumber>8</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>.\msd.c</PathWithFileName>
-      <FilenameWithoutPath>msd.c</FilenameWithoutPath>
-    </File>
-  </Group>
-
-  <Group>
-    <GroupName>Kernel</GroupName>
-    <tvExp>0</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>9</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\clock.c</PathWithFileName>
-      <FilenameWithoutPath>clock.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>10</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\device.c</PathWithFileName>
-      <FilenameWithoutPath>device.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>11</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\idle.c</PathWithFileName>
-      <FilenameWithoutPath>idle.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>12</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\ipc.c</PathWithFileName>
-      <FilenameWithoutPath>ipc.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>13</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\irq.c</PathWithFileName>
-      <FilenameWithoutPath>irq.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>14</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\kservice.c</PathWithFileName>
-      <FilenameWithoutPath>kservice.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>15</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\mem.c</PathWithFileName>
-      <FilenameWithoutPath>mem.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>16</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\mempool.c</PathWithFileName>
-      <FilenameWithoutPath>mempool.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>17</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\module.c</PathWithFileName>
-      <FilenameWithoutPath>module.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>18</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\object.c</PathWithFileName>
-      <FilenameWithoutPath>object.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>19</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\rtm.c</PathWithFileName>
-      <FilenameWithoutPath>rtm.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>20</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\scheduler.c</PathWithFileName>
-      <FilenameWithoutPath>scheduler.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>21</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\slab.c</PathWithFileName>
-      <FilenameWithoutPath>slab.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>22</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\thread.c</PathWithFileName>
-      <FilenameWithoutPath>thread.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>23</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\src\timer.c</PathWithFileName>
-      <FilenameWithoutPath>timer.c</FilenameWithoutPath>
-    </File>
-  </Group>
-
-  <Group>
-    <GroupName>STM32</GroupName>
-    <tvExp>0</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>26</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\libcpu\arm\common\backtrace.c</PathWithFileName>
-      <FilenameWithoutPath>backtrace.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>27</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\libcpu\arm\common\div0.c</PathWithFileName>
-      <FilenameWithoutPath>div0.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>28</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\libcpu\arm\common\showmem.c</PathWithFileName>
-      <FilenameWithoutPath>showmem.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>0</FileNumber>
-      <FileType>2</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\libcpu\arm\cortex-m3\context_rvds.S</PathWithFileName>
-      <FilenameWithoutPath>context_rvds.S</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>0</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\libcpu\arm\cortex-m3\cpuport.c</PathWithFileName>
-      <FilenameWithoutPath>cpuport.c</FilenameWithoutPath>
-    </File>
-  </Group>
-
-  <Group>
-    <GroupName>Filesystem</GroupName>
-    <tvExp>0</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>29</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\dfs\src\dfs.c</PathWithFileName>
-      <FilenameWithoutPath>dfs.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>30</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\dfs\src\dfs_fs.c</PathWithFileName>
-      <FilenameWithoutPath>dfs_fs.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>31</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\dfs\src\dfs_file.c</PathWithFileName>
-      <FilenameWithoutPath>dfs_file.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>32</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\dfs\src\dfs_posix.c</PathWithFileName>
-      <FilenameWithoutPath>dfs_posix.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>33</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\dfs\filesystems\elmfat\dfs_elm.c</PathWithFileName>
-      <FilenameWithoutPath>dfs_elm.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>34</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\dfs\filesystems\elmfat\ff.c</PathWithFileName>
-      <FilenameWithoutPath>ff.c</FilenameWithoutPath>
-    </File>
-  </Group>
-
-  <Group>
-    <GroupName>finsh</GroupName>
-    <tvExp>0</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>35</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\cmd.c</PathWithFileName>
-      <FilenameWithoutPath>cmd.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>36</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_compiler.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_compiler.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>37</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_error.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_error.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>38</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_heap.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_heap.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>39</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_init.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_init.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>40</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_node.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_node.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>41</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_ops.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_ops.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>42</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_parser.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_parser.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>43</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_token.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_token.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>44</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_var.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_var.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>45</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\finsh_vm.c</PathWithFileName>
-      <FilenameWithoutPath>finsh_vm.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>46</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\shell.c</PathWithFileName>
-      <FilenameWithoutPath>shell.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>47</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\finsh\symbol.c</PathWithFileName>
-      <FilenameWithoutPath>symbol.c</FilenameWithoutPath>
-    </File>
-  </Group>
-
-  <Group>
-    <GroupName>LwIP</GroupName>
-    <tvExp>0</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>48</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\api\api_lib.c</PathWithFileName>
-      <FilenameWithoutPath>api_lib.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>49</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\api\api_msg.c</PathWithFileName>
-      <FilenameWithoutPath>api_msg.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>50</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\api\err.c</PathWithFileName>
-      <FilenameWithoutPath>err.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>51</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\api\netbuf.c</PathWithFileName>
-      <FilenameWithoutPath>netbuf.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>52</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\api\netdb.c</PathWithFileName>
-      <FilenameWithoutPath>netdb.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>53</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\api\netifapi.c</PathWithFileName>
-      <FilenameWithoutPath>netifapi.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>54</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\api\sockets.c</PathWithFileName>
-      <FilenameWithoutPath>sockets.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>55</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>534</TopLine>
-      <CurrentLine>546</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\api\tcpip.c</PathWithFileName>
-      <FilenameWithoutPath>tcpip.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>56</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\arch\sys_arch.c</PathWithFileName>
-      <FilenameWithoutPath>sys_arch.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>57</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>25</TopLine>
-      <CurrentLine>36</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\arch\sys_arch_init.c</PathWithFileName>
-      <FilenameWithoutPath>sys_arch_init.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>58</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\dhcp.c</PathWithFileName>
-      <FilenameWithoutPath>dhcp.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>59</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>262</TopLine>
-      <CurrentLine>274</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\dns.c</PathWithFileName>
-      <FilenameWithoutPath>dns.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>60</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>261</TopLine>
-      <CurrentLine>272</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\init.c</PathWithFileName>
-      <FilenameWithoutPath>init.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>61</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\memp.c</PathWithFileName>
-      <FilenameWithoutPath>memp.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>62</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\netif.c</PathWithFileName>
-      <FilenameWithoutPath>netif.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>63</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\pbuf.c</PathWithFileName>
-      <FilenameWithoutPath>pbuf.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>64</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\raw.c</PathWithFileName>
-      <FilenameWithoutPath>raw.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>65</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\stats.c</PathWithFileName>
-      <FilenameWithoutPath>stats.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>66</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\sys.c</PathWithFileName>
-      <FilenameWithoutPath>sys.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>67</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\tcp.c</PathWithFileName>
-      <FilenameWithoutPath>tcp.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>68</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\tcp_in.c</PathWithFileName>
-      <FilenameWithoutPath>tcp_in.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>69</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\tcp_out.c</PathWithFileName>
-      <FilenameWithoutPath>tcp_out.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>70</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>18</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>578</TopLine>
-      <CurrentLine>590</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\udp.c</PathWithFileName>
-      <FilenameWithoutPath>udp.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>71</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\ipv4\autoip.c</PathWithFileName>
-      <FilenameWithoutPath>autoip.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>72</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\ipv4\icmp.c</PathWithFileName>
-      <FilenameWithoutPath>icmp.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>73</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\ipv4\igmp.c</PathWithFileName>
-      <FilenameWithoutPath>igmp.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>74</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\ipv4\inet.c</PathWithFileName>
-      <FilenameWithoutPath>inet.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>75</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\ipv4\inet_chksum.c</PathWithFileName>
-      <FilenameWithoutPath>inet_chksum.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>76</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\ipv4\ip.c</PathWithFileName>
-      <FilenameWithoutPath>ip.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>77</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\ipv4\ip_addr.c</PathWithFileName>
-      <FilenameWithoutPath>ip_addr.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>78</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\core\ipv4\ip_frag.c</PathWithFileName>
-      <FilenameWithoutPath>ip_frag.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>79</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\netif\etharp.c</PathWithFileName>
-      <FilenameWithoutPath>etharp.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>80</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\netif\ethernetif.c</PathWithFileName>
-      <FilenameWithoutPath>ethernetif.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>81</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\netif\loopif.c</PathWithFileName>
-      <FilenameWithoutPath>loopif.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>82</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>148</TopLine>
-      <CurrentLine>148</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\components\net\lwip\src\netif\slipif.c</PathWithFileName>
-      <FilenameWithoutPath>slipif.c</FilenameWithoutPath>
-    </File>
-  </Group>
-
-  <Group>
-    <GroupName>STM32_StdPeriph</GroupName>
-    <tvExp>0</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>83</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\CMSIS\CM3\CoreSupport\core_cm3.c</PathWithFileName>
-      <FilenameWithoutPath>core_cm3.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>84</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>257</TopLine>
-      <CurrentLine>269</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c</PathWithFileName>
-      <FilenameWithoutPath>system_stm32f10x.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>85</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_crc.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>86</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_rcc.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>87</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_wwdg.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>88</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_pwr.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>89</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_exti.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>90</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_bkp.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_bkp.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>91</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_i2c.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>92</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_adc.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_adc.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>93</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_dac.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>94</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_rtc.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>95</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_fsmc.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>96</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_tim.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>97</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_iwdg.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>98</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_spi.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_spi.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>99</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_flash.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>100</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_sdio.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>101</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_gpio.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>102</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_usart.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>103</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_dbgmcu.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>104</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_dma.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>105</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_can.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_can.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>106</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_cec.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_cec.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>107</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>0</TopLine>
-      <CurrentLine>0</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\STM32F10x_StdPeriph_Driver\src\misc.c</PathWithFileName>
-      <FilenameWithoutPath>misc.c</FilenameWithoutPath>
-    </File>
-    <File>
-      <GroupNumber>7</GroupNumber>
-      <FileNumber>108</FileNumber>
-      <FileType>2</FileType>
-      <tvExp>0</tvExp>
-      <Focus>0</Focus>
-      <ColumnNumber>0</ColumnNumber>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <TopLine>1</TopLine>
-      <CurrentLine>1</CurrentLine>
-      <bDave2>0</bDave2>
-      <PathWithFileName>Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x_cl.s</PathWithFileName>
-      <FilenameWithoutPath>startup_stm32f10x_cl.s</FilenameWithoutPath>
-    </File>
-  </Group>
-
 </ProjectOpt>

+ 439 - 253
bsp/stm32f107/project.uvproj

@@ -1,10 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
 <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
-
   <SchemaVersion>1.1</SchemaVersion>
-
   <Header>### uVision Project, (C) Keil Software</Header>
-
   <Targets>
     <Target>
       <TargetName>RT-Thread STM32</TargetName>
@@ -15,25 +12,25 @@
           <Device>STM32F107VC</Device>
           <Vendor>STMicroelectronics</Vendor>
           <Cpu>IRAM(0x20000000-0x2000FFFF) IROM(0x8000000-0x803FFFF) CLOCK(25000000) CPUTYPE("Cortex-M3")</Cpu>
-          <FlashUtilSpec></FlashUtilSpec>
+          <FlashUtilSpec />
           <StartupFile>"STARTUP\ST\STM32F10x.s" ("STM32 Startup Code")</StartupFile>
           <FlashDriverDll>UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_CL -FS08000000 -FL040000)</FlashDriverDll>
           <DeviceId>4889</DeviceId>
           <RegisterFile>stm32f10x_lib.h</RegisterFile>
-          <MemoryEnv></MemoryEnv>
-          <Cmp></Cmp>
-          <Asm></Asm>
-          <Linker></Linker>
-          <OHString></OHString>
-          <InfinionOptionDll></InfinionOptionDll>
-          <SLE66CMisc></SLE66CMisc>
-          <SLE66AMisc></SLE66AMisc>
-          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
           <SFDFile>SFD\ST\STM32F107x\STM32F107.sfr</SFDFile>
           <UseEnv>0</UseEnv>
-          <BinPath></BinPath>
-          <IncludePath></IncludePath>
-          <LibPath></LibPath>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
           <RegisterFilePath>ST\STM32F10x\</RegisterFilePath>
           <DBRegisterFilePath>ST\STM32F10x\</DBRegisterFilePath>
           <TargetStatus>
@@ -57,18 +54,16 @@
           <BeforeCompile>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
-            <nStopU1X>0</nStopU1X>
-            <nStopU2X>0</nStopU2X>
           </BeforeCompile>
           <BeforeMake>
             <RunUserProg1>0</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
-            <UserProg1Name></UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg1Name />
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </BeforeMake>
@@ -76,12 +71,12 @@
             <RunUserProg1>1</RunUserProg1>
             <RunUserProg2>0</RunUserProg2>
             <UserProg1Name>fromelf --bin !L --output rtthread.bin</UserProg1Name>
-            <UserProg2Name></UserProg2Name>
+            <UserProg2Name />
             <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
             <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
           </AfterMake>
           <SelectedForBatchBuild>0</SelectedForBatchBuild>
-          <SVCSIdString></SVCSIdString>
+          <SVCSIdString />
         </TargetCommonOption>
         <CommonProperty>
           <UseCPPCompiler>0</UseCPPCompiler>
@@ -95,16 +90,16 @@
           <AssembleAssemblyFile>0</AssembleAssemblyFile>
           <PublicsOnly>0</PublicsOnly>
           <StopOnExitCode>3</StopOnExitCode>
-          <CustomArgument></CustomArgument>
-          <IncludeLibraryModules></IncludeLibraryModules>
+          <CustomArgument />
+          <IncludeLibraryModules />
         </CommonProperty>
         <DllOption>
           <SimDllName>SARMCM3.DLL</SimDllName>
-          <SimDllArguments></SimDllArguments>
+          <SimDllArguments />
           <SimDlgDll>DARMSTM.DLL</SimDlgDll>
           <SimDlgDllArguments>-pSTM32F107VC</SimDlgDllArguments>
           <TargetDllName>SARMCM3.DLL</TargetDllName>
-          <TargetDllArguments></TargetDllArguments>
+          <TargetDllArguments />
           <TargetDlgDll>TARMSTM.DLL</TargetDlgDll>
           <TargetDlgDllArguments>-pSTM32F107VC</TargetDlgDllArguments>
         </DllOption>
@@ -136,23 +131,22 @@
             <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
             <RestoreFunctions>0</RestoreFunctions>
             <RestoreToolbox>1</RestoreToolbox>
-            <RestoreTracepoints>0</RestoreTracepoints>
           </Target>
           <RunDebugAfterBuild>0</RunDebugAfterBuild>
           <TargetSelection>7</TargetSelection>
           <SimDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
           </SimDlls>
           <TargetDlls>
-            <CpuDll></CpuDll>
-            <CpuDllArguments></CpuDllArguments>
-            <PeripheralDll></PeripheralDll>
-            <PeripheralDllArguments></PeripheralDllArguments>
-            <InitializationFile></InitializationFile>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
             <Driver>Segger\JL2CM3.dll</Driver>
           </TargetDlls>
         </DebugOption>
@@ -166,8 +160,8 @@
             <DriverSelection>4099</DriverSelection>
           </Flash1>
           <Flash2>Segger\JL2CM3.dll</Flash2>
-          <Flash3>"" ()</Flash3>
-          <Flash4></Flash4>
+          <Flash3 />
+          <Flash4 />
         </Utilities>
         <TargetArmAds>
           <ArmAdsMisc>
@@ -199,7 +193,7 @@
             <RvctClst>0</RvctClst>
             <GenPPlst>0</GenPPlst>
             <AdsCpuType>"Cortex-M3"</AdsCpuType>
-            <RvctDeviceName></RvctDeviceName>
+            <RvctDeviceName />
             <mOS>0</mOS>
             <uocRom>0</uocRom>
             <uocRam>0</uocRam>
@@ -330,7 +324,7 @@
                 <Size>0x0</Size>
               </OCR_RVCT10>
             </OnChipMemories>
-            <RvctStartVector></RvctStartVector>
+            <RvctStartVector />
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
@@ -345,12 +339,11 @@
             <Rwpi>0</Rwpi>
             <wLevel>0</wLevel>
             <uThumb>0</uThumb>
-            <uSurpInc>0</uSurpInc>
             <VariousControls>
-              <MiscControls></MiscControls>
+              <MiscControls />
               <Define>STM32F10X_CL, USE_STDPERIPH_DRIVER</Define>
-              <Undefine></Undefine>
-              <IncludePath>.;..\..\components\CMSIS\Include;..\..\components\dfs;..\..\components\dfs\include;..\..\components\drivers\include;..\..\components\finsh;..\..\components\init;..\..\components\net\lwip\src;..\..\components\net\lwip\src\arch\include;..\..\components\net\lwip\src\include;..\..\components\net\lwip\src\include\ipv4;..\..\components\net\lwip\src\include\netif;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m3;Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x;Libraries\STM32F10x_StdPeriph_Driver\inc;applications;drivers</IncludePath>
+              <Undefine />
+              <IncludePath>Libraries/STM32F10x_StdPeriph_Driver/inc;Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x;../../components/CMSIS/Include;applications;.;drivers;../../include;../../libcpu/arm/cortex-m3;../../libcpu/arm/common;../../components/drivers/spi;../../components/drivers/include;../../components/finsh;../../components/net/lwip-1.4.1/src;../../components/net/lwip-1.4.1/src/include;../../components/net/lwip-1.4.1/src/include/ipv4;../../components/net/lwip-1.4.1/src/arch/include;../../components/net/lwip-1.4.1/src/include/netif;../../components/dfs/include;../../components/dfs/filesystems/elmfat</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -361,12 +354,11 @@
             <SplitLS>0</SplitLS>
             <SwStkChk>0</SwStkChk>
             <NoWarn>0</NoWarn>
-            <uSurpInc>0</uSurpInc>
             <VariousControls>
-              <MiscControls></MiscControls>
-              <Define></Define>
-              <Undefine></Undefine>
-              <IncludePath></IncludePath>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
             </VariousControls>
           </Aads>
           <LDads>
@@ -378,203 +370,267 @@
             <useFile>0</useFile>
             <TextAddressRange>0x08000000</TextAddressRange>
             <DataAddressRange>0x20000000</DataAddressRange>
-            <ScatterFile></ScatterFile>
-            <IncludeLibs></IncludeLibs>
-            <IncludeLibsPath></IncludeLibsPath>
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
-            <LinkerInputFile></LinkerInputFile>
-            <DisabledWarnings></DisabledWarnings>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
           </LDads>
         </TargetArmAds>
       </TargetOption>
       <Groups>
         <Group>
-          <GroupName>Applications</GroupName>
+          <GroupName>STM32_StdPeriph</GroupName>
           <Files>
             <File>
-              <FileName>application.c</FileName>
+              <FileName>system_stm32f10x.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
+              <FilePath>Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>startup.c</FileName>
+              <FileName>stm32f10x_crc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>Drivers</GroupName>
           <Files>
             <File>
-              <FileName>board.c</FileName>
+              <FileName>stm32f10x_rcc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\board.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>msd.c</FileName>
+              <FileName>stm32f10x_wwdg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\msd.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>platform.c</FileName>
+              <FileName>stm32f10x_pwr.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\platform.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>rt_stm32f10x_spi.c</FileName>
+              <FileName>stm32f10x_exti.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\rt_stm32f10x_spi.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>serial.c</FileName>
+              <FileName>stm32f10x_bkp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\serial.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32_eth.c</FileName>
+              <FileName>stm32f10x_i2c.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\stm32_eth.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_it.c</FileName>
+              <FileName>stm32f10x_adc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\stm32f10x_it.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>usart.c</FileName>
+              <FileName>stm32f10x_dac.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers\usart.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>STM32_StdPeriph</GroupName>
           <Files>
             <File>
-              <FileName>system_stm32f10x.c</FileName>
+              <FileName>stm32f10x_rtc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_crc.c</FileName>
+              <FileName>stm32f10x_fsmc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_rcc.c</FileName>
+              <FileName>stm32f10x_tim.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_wwdg.c</FileName>
+              <FileName>stm32f10x_iwdg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_pwr.c</FileName>
+              <FileName>stm32f10x_spi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_exti.c</FileName>
+              <FileName>stm32f10x_flash.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_bkp.c</FileName>
+              <FileName>stm32f10x_sdio.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_bkp.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_i2c.c</FileName>
+              <FileName>stm32f10x_gpio.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_adc.c</FileName>
+              <FileName>stm32f10x_usart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_adc.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_dac.c</FileName>
+              <FileName>stm32f10x_dbgmcu.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_rtc.c</FileName>
+              <FileName>stm32f10x_dma.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_fsmc.c</FileName>
+              <FileName>stm32f10x_can.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_tim.c</FileName>
+              <FileName>stm32f10x_cec.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_iwdg.c</FileName>
+              <FileName>misc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c</FilePath>
+              <FilePath>Libraries/STM32F10x_StdPeriph_Driver/src/misc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_spi.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_spi.c</FilePath>
+              <FileName>startup_stm32f10x_cl.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_cl.s</FilePath>
             </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
             <File>
-              <FileName>stm32f10x_flash.c</FileName>
+              <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_sdio.c</FileName>
+              <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c</FilePath>
+              <FilePath>applications/startup.c</FilePath>
             </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
             <File>
-              <FileName>stm32f10x_gpio.c</FileName>
+              <FileName>board.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c</FilePath>
+              <FilePath>drivers/board.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_usart.c</FileName>
+              <FileName>msd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c</FilePath>
+              <FilePath>drivers/msd.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_dbgmcu.c</FileName>
+              <FileName>platform.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c</FilePath>
+              <FilePath>drivers/platform.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_dma.c</FileName>
+              <FileName>rt_stm32f10x_spi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c</FilePath>
+              <FilePath>drivers/rt_stm32f10x_spi.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_can.c</FileName>
+              <FileName>serial.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_can.c</FilePath>
+              <FilePath>drivers/serial.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>stm32f10x_cec.c</FileName>
+              <FileName>stm32_eth.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_cec.c</FilePath>
+              <FilePath>drivers/stm32_eth.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>misc.c</FileName>
+              <FileName>stm32f10x_it.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F10x_StdPeriph_Driver\src\misc.c</FilePath>
+              <FilePath>drivers/stm32f10x_it.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>startup_stm32f10x_cl.s</FileName>
-              <FileType>2</FileType>
-              <FilePath>Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x_cl.s</FilePath>
+              <FileName>usart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/usart.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -584,62 +640,91 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
             </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
+            </File>
+          </Files>
+          <Files>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -649,157 +734,146 @@
             <File>
               <FileName>cpuport.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\cpuport.c</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/cpuport.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/context_rvds.S</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
             </File>
           </Files>
         </Group>
         <Group>
-          <GroupName>Filesystem</GroupName>
+          <GroupName>DeviceDrivers</GroupName>
           <Files>
             <File>
-              <FileName>dfs.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\dfs\src\dfs.c</FilePath>
-            </File>
-            <File>
-              <FileName>dfs_fs.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\dfs\src\dfs_fs.c</FilePath>
-            </File>
-            <File>
-              <FileName>dfs_file.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\dfs\src\dfs_file.c</FilePath>
-            </File>
-            <File>
-              <FileName>dfs_posix.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\dfs\src\dfs_posix.c</FilePath>
-            </File>
-            <File>
-              <FileName>dfs_elm.c</FileName>
+              <FileName>spi_core.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\dfs\filesystems\elmfat\dfs_elm.c</FilePath>
+              <FilePath>../../components/drivers/spi/spi_core.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>ff.c</FileName>
+              <FileName>spi_dev.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\dfs\filesystems\elmfat\ff.c</FilePath>
+              <FilePath>../../components/drivers/spi/spi_dev.c</FilePath>
             </File>
           </Files>
         </Group>
         <Group>
-          <GroupName>DeviceDrivers</GroupName>
+          <GroupName>finsh</GroupName>
           <Files>
             <File>
-              <FileName>spi_core.c</FileName>
+              <FileName>shell.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\spi\spi_core.c</FilePath>
+              <FilePath>../../components/finsh/shell.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
-              <FileName>spi_dev.c</FileName>
+              <FileName>symbol.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\drivers\spi\spi_dev.c</FilePath>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>finsh</GroupName>
           <Files>
             <File>
               <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
-            </File>
-            <File>
-              <FileName>finsh_token.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
-            </File>
-            <File>
-              <FileName>shell.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
-            </File>
-            <File>
-              <FileName>symbol.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>Components</GroupName>
           <Files>
             <File>
-              <FileName>components.c</FileName>
+              <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\init\components.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -809,182 +883,294 @@
             <File>
               <FileName>api_lib.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\api_lib.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_lib.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>api_msg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\api_msg.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_msg.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>err.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\err.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/err.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netbuf.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\netbuf.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netbuf.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netdb.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\netdb.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netdb.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netifapi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\netifapi.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netifapi.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sockets.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\sockets.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/sockets.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcpip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\api\tcpip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/tcpip.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sys_arch.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\arch\sys_arch.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/arch/sys_arch.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>def.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\def.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/def.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>dhcp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\dhcp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dhcp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>dns.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\dns.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dns.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\init.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/init.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>memp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\memp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/memp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>netif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\netif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/netif.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>pbuf.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\pbuf.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/pbuf.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>raw.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\raw.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/raw.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>stats.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\stats.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/stats.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>sys.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\sys.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/sys.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\tcp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcp_in.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\tcp_in.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_in.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>tcp_out.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\tcp_out.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_out.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>timers.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\timers.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/timers.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>udp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\udp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/udp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>autoip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\autoip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/autoip.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>icmp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\icmp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/icmp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>igmp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\igmp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/igmp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>inet.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\inet.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>inet_chksum.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\inet_chksum.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet_chksum.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ip.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\ip.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ip_addr.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\ip_addr.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_addr.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ip_frag.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\core\ipv4\ip_frag.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_frag.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>etharp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\netif\etharp.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/etharp.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>ethernetif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\netif\ethernetif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/ethernetif.c</FilePath>
             </File>
+          </Files>
+          <Files>
             <File>
               <FileName>slipif.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\net\lwip\src\netif\slipif.c</FilePath>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/slipif.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Filesystem</GroupName>
+          <Files>
+            <File>
+              <FileName>dfs.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/dfs/src/dfs.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dfs_file.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/dfs/src/dfs_file.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dfs_fs.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/dfs/src/dfs_fs.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dfs_posix.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/dfs/src/dfs_posix.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dfs_elm.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/dfs/filesystems/elmfat/dfs_elm.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ff.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/dfs/filesystems/elmfat/ff.c</FilePath>
             </File>
           </Files>
         </Group>
       </Groups>
     </Target>
   </Targets>
-
 </Project>

+ 145 - 0
bsp/stm32f10x/applications/canapp.c

@@ -0,0 +1,145 @@
+/*
+ * File      : canapp.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date           Author       		Notes
+ * 2015-05-14     aubrcool@qq.com 	first version
+ */
+
+#ifdef RT_USING_CAN
+#include <board.h>
+#include <rtthread.h>
+#include <rtdevice.h>
+struct can_app_struct
+{
+    const char* name;
+    struct rt_event event;
+    struct rt_can_filter_config * filter;
+    rt_uint8_t eventopt;
+};
+static struct can_app_struct can_data[2];
+static rt_err_t  can1ind(rt_device_t dev,  void* args, rt_int32_t hdr, rt_size_t size)
+{
+    rt_event_t pevent = (rt_event_t)args;
+    rt_event_send(pevent, 1 << (hdr));
+    return RT_EOK;
+}
+static rt_err_t  can2ind(rt_device_t dev, void* args, rt_int32_t hdr, rt_size_t size)
+{
+    rt_event_t pevent = (rt_event_t)args;
+    rt_event_send(pevent, 1 << (hdr));
+    return RT_EOK;
+}
+struct rt_can_filter_item filter1item[4] =
+{
+  RT_CAN_FILTER_STD_INIT(1,can1ind,&can_data[0].event),
+  RT_CAN_FILTER_STD_INIT(2,can1ind,&can_data[0].event),
+  RT_CAN_STD_RMT_FILTER_INIT(3,can1ind,&can_data[0].event),
+  RT_CAN_STD_RMT_DATA_FILTER_INIT(4,can1ind,&can_data[0].event),
+};
+struct rt_can_filter_item filter2item[4] =
+{
+  RT_CAN_FILTER_STD_INIT(1,can2ind,&can_data[1].event),
+  RT_CAN_FILTER_STD_INIT(2,can2ind,&can_data[1].event),
+  RT_CAN_STD_RMT_FILTER_INIT(3,can2ind,&can_data[1].event),
+  RT_CAN_STD_RMT_DATA_FILTER_INIT(4,can2ind,&can_data[1].event),
+};
+struct rt_can_filter_config filter1 =
+{
+       .count = 4,
+       .actived = 1,
+       .items = filter1item,
+};
+struct rt_can_filter_config filter2 =
+{
+       .count = 4,
+       .actived = 1,
+       .items = filter2item,
+};
+static struct can_app_struct can_data[2] = {
+    {
+      .name = "bxcan1",
+      .filter = &filter1,
+      .eventopt = RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
+    },
+    {
+      .name = "bxcan2",
+      .filter = &filter2,
+      .eventopt = RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
+    },
+};
+void rt_can_thread_entry(void* parameter)
+{
+      struct rt_can_msg msg;
+      struct can_app_struct* canpara = (struct can_app_struct*) parameter;
+      rt_device_t candev;
+      rt_uint32_t e;
+
+      candev = rt_device_find(canpara->name);
+      RT_ASSERT(candev);
+      rt_event_init(&canpara->event, canpara->name, RT_IPC_FLAG_FIFO);
+      rt_device_open(candev, (RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX));
+      rt_device_control(candev,RT_CAN_CMD_SET_FILTER,canpara->filter);
+      while(1) {
+              if (
+                     rt_event_recv(&canpara->event, 
+                     ((1 << canpara->filter->items[0].hdr)  |
+                      (1 << canpara->filter->items[1].hdr) |
+                      (1 << canpara->filter->items[2].hdr) |
+                      (1 << canpara->filter->items[3].hdr)),
+                      canpara->eventopt,
+                      RT_WAITING_FOREVER, &e) != RT_EOK
+                  ) {
+                    continue;
+                  }
+              if(e & (1 << canpara->filter->items[0].hdr)) {
+                  msg.hdr = canpara->filter->items[0].hdr;
+                  while (rt_device_read(candev, 0, &msg, sizeof(msg)) == sizeof(msg)) {
+                     rt_device_write(candev, 0, &msg, sizeof(msg));
+                  }
+              }
+              if(e & (1 << canpara->filter->items[1].hdr)) {
+                  msg.hdr = canpara->filter->items[1].hdr;
+                  while (rt_device_read(candev, 0, &msg, sizeof(msg)) == sizeof(msg)) {
+                     rt_device_write(candev, 0, &msg, sizeof(msg));
+                  }
+              }
+              if(e & (1 << canpara->filter->items[2].hdr)) {
+                  msg.hdr = canpara->filter->items[2].hdr;
+                  while (rt_device_read(candev, 0, &msg, sizeof(msg)) == sizeof(msg)) {
+                     rt_device_write(candev, 0, &msg, sizeof(msg));
+                  }
+              }
+              if(e & (1 << canpara->filter->items[3].hdr)) {
+                  msg.hdr = canpara->filter->items[3].hdr;
+                  while (rt_device_read(candev, 0, &msg, sizeof(msg)) == sizeof(msg)) {
+                     rt_device_write(candev, 0, &msg, sizeof(msg));
+                  }
+              }
+      }
+}
+int rt_can_app_init(void)
+{
+    rt_thread_t tid;
+    
+    tid = rt_thread_create("canapp1",
+    rt_can_thread_entry, &can_data[0],
+    512, RT_THREAD_PRIORITY_MAX /3 - 1, 20);
+    if (tid != RT_NULL) rt_thread_startup(tid);
+    
+    tid = rt_thread_create("canapp2",
+    rt_can_thread_entry, &can_data[1],
+    512, RT_THREAD_PRIORITY_MAX /3 - 1, 20);
+    if (tid != RT_NULL) rt_thread_startup(tid);
+    
+    return 0;
+}
+
+INIT_APP_EXPORT(rt_can_app_init);
+#endif /*RT_USING_CAN*/

+ 1412 - 0
bsp/stm32f10x/drivers/bxcan.c

@@ -0,0 +1,1412 @@
+/*
+ * File      : bxcan.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2015, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date           Author       		Notes
+ * 2015-05-14     aubrcool@qq.com 	first version
+ */
+#include <rthw.h>
+#include <rtdevice.h>
+#include <board.h>
+#include <bxcan.h>
+#ifdef RT_USING_COMPONENTS_INIT
+#include <init/components.h>
+#endif
+#ifdef RT_USING_CAN
+
+#ifndef STM32F10X_CL
+#define BX_CAN_FMRNUMBER 14
+#define BX_CAN2_FMRSTART 7
+#else
+#define BX_CAN_FMRNUMBER 28
+#define BX_CAN2_FMRSTART 14
+#endif
+
+#define BX_CAN_MAX_FILTERS (BX_CAN_FMRNUMBER * 4)
+#define BX_CAN_MAX_FILTER_MASKS BX_CAN_MAX_FILTERS
+#define BX_CAN_FILTER_MAX_ARRAY_SIZE ((BX_CAN_MAX_FILTERS + 32 - 1) / 32)
+
+struct stm_bxcanfiltermap {
+    rt_uint32_t id32mask_cnt;
+    rt_uint32_t id32bit_cnt;
+    rt_uint32_t id16mask_cnt;
+    rt_uint32_t id16bit_cnt;
+};
+struct stm_bxcanfilter_masks {
+      rt_uint32_t id32maskm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
+      rt_uint32_t id32bitm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
+      rt_uint32_t id16maskm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
+      rt_uint32_t id16bitm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
+      rt_uint32_t id32maskshift[2];
+      rt_uint32_t id32bitshift[2];
+      rt_uint32_t id16maskshift[2];
+      rt_uint32_t id16bitshift[2];
+};
+struct stm_bxcan
+{
+    CAN_TypeDef* reg;
+    void* mfrbase;
+    IRQn_Type sndirq;
+    IRQn_Type rcvirq0;
+    IRQn_Type rcvirq1;
+    IRQn_Type errirq;
+    struct stm_bxcanfilter_masks filtermask;
+    rt_uint32_t alocmask[BX_CAN_FILTER_MAX_ARRAY_SIZE];
+    const rt_uint32_t filtercnt;
+    const rt_uint32_t fifo1filteroff;
+    const struct stm_bxcanfiltermap filtermap[2];
+};
+static void calcfiltermasks(struct stm_bxcan *pbxcan);
+static void bxcan1_filter_init(struct rt_can_device *can)
+{
+    rt_uint32_t i;
+    rt_uint32_t mask;
+    struct stm_bxcan *pbxcan = (struct stm_bxcan *) can->parent.user_data;
+    for(i = 0; i < BX_CAN2_FMRSTART; i++) {
+        CAN1->FMR |= FMR_FINIT;
+        mask = 0x01 << (i + 0);
+        if(i < pbxcan->fifo1filteroff) {
+          if(pbxcan->filtermap[0].id32mask_cnt && i < pbxcan->filtermap[0].id32mask_cnt) {
+            CAN1->FS1R |= mask;
+            CAN1->FM1R &= ~mask;
+            CAN1->FFA1R &= ~mask;
+          } else if(pbxcan->filtermap[0].id32bit_cnt &&
+              i < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt /2) {
+            CAN1->FS1R |= mask;
+            CAN1->FM1R |= mask;
+            CAN1->FFA1R &= ~mask;
+          } else if(pbxcan->filtermap[0].id16mask_cnt &&
+              i < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt /2
+              + pbxcan->filtermap[0].id16mask_cnt /2) {
+            CAN1->FS1R &= ~mask;
+            CAN1->FM1R &= ~mask;
+            CAN1->FFA1R &= ~mask;
+          } else if(pbxcan->filtermap[0].id16bit_cnt &&
+              i < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt /2
+              + pbxcan->filtermap[0].id16mask_cnt /2 + pbxcan->filtermap[0].id16bit_cnt / 4
+          ) {
+            CAN1->FS1R &= ~mask;
+            CAN1->FM1R |= mask;
+            CAN1->FFA1R &= ~mask;
+          }
+        } else {
+          if(pbxcan->filtermap[1].id32mask_cnt &&
+              i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->fifo1filteroff) {
+              CAN1->FS1R |= mask;
+              CAN1->FM1R &= ~mask;
+              CAN1->FFA1R |= mask;
+          } else if(pbxcan->filtermap[1].id32bit_cnt &&
+              i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt /2
+              + pbxcan->fifo1filteroff) {
+              CAN1->FS1R |= mask;
+              CAN1->FM1R |= mask;
+              CAN1->FFA1R |= mask;
+          } else if(pbxcan->filtermap[1].id16mask_cnt &&
+              i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt /2
+              + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->fifo1filteroff) {
+              CAN1->FS1R &= ~mask;
+              CAN1->FM1R &= ~mask;
+              CAN1->FFA1R |= mask;
+          } else if(pbxcan->filtermap[1].id16bit_cnt &&
+              i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt /2
+              + pbxcan->filtermap[1].id16mask_cnt /2 + pbxcan->filtermap[1].id16bit_cnt / 4
+              + pbxcan->fifo1filteroff) {
+              CAN1->FS1R &= ~mask;
+              CAN1->FM1R |= mask;
+              CAN1->FFA1R |= mask;
+          }
+        }
+        CAN1->sFilterRegister[i].FR1 = 0xFFFFFFFF; 
+        CAN1->sFilterRegister[i].FR2 = 0xFFFFFFFF; 
+        CAN1->FMR &= ~FMR_FINIT;
+    }
+    calcfiltermasks(pbxcan);
+}
+static void bxcan2_filter_init(struct rt_can_device *can)
+{
+    rt_uint32_t i;
+    rt_uint32_t off;
+    rt_uint32_t mask;
+    CAN_SlaveStartBank(BX_CAN2_FMRSTART);
+    struct stm_bxcan *pbxcan = (struct stm_bxcan *) can->parent.user_data;
+    for(i = BX_CAN2_FMRSTART; i < BX_CAN_FMRNUMBER; i++) {
+        CAN1->FMR |= FMR_FINIT;
+        mask = 0x01 << (i + 0);
+        off = i - BX_CAN2_FMRSTART;
+        if(i < pbxcan->fifo1filteroff) {
+          if(pbxcan->filtermap[0].id32mask_cnt && off < pbxcan->filtermap[0].id32mask_cnt) {
+            CAN1->FS1R |= mask;
+            CAN1->FM1R &= ~mask;
+            CAN1->FFA1R &= ~mask;
+          } else if(pbxcan->filtermap[0].id32bit_cnt &&
+              off < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt /2) {
+            CAN1->FS1R |= mask;
+            CAN1->FM1R |= mask;
+            CAN1->FFA1R &= ~mask;
+          } else if(pbxcan->filtermap[0].id16mask_cnt &&
+              off < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt /2
+              + pbxcan->filtermap[0].id16mask_cnt /2) {
+            CAN1->FS1R &= ~mask;
+            CAN1->FM1R &= ~mask;
+            CAN1->FFA1R &= ~mask;
+          } else if(pbxcan->filtermap[0].id16bit_cnt &&
+              off < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt /2
+              + pbxcan->filtermap[0].id16mask_cnt /2 + pbxcan->filtermap[0].id16bit_cnt / 4
+          ) {
+            CAN1->FS1R &= ~mask;
+            CAN1->FM1R |= mask;
+            CAN1->FFA1R &= ~mask;
+          }
+        } else {
+          if(pbxcan->filtermap[1].id32mask_cnt &&
+              off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->fifo1filteroff) {
+              CAN1->FS1R |= mask;
+              CAN1->FM1R &= ~mask;
+              CAN1->FFA1R |= mask;
+          } else if(pbxcan->filtermap[1].id32bit_cnt &&
+              off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt /2
+              + pbxcan->fifo1filteroff) {
+              CAN1->FS1R |= mask;
+              CAN1->FM1R |= mask;
+              CAN1->FFA1R |= mask;
+          } else if(pbxcan->filtermap[1].id16mask_cnt &&
+              off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt /2
+              + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->fifo1filteroff) {
+              CAN1->FS1R &= ~mask;
+              CAN1->FM1R &= ~mask;
+              CAN1->FFA1R |= mask;
+          } else if(pbxcan->filtermap[1].id16bit_cnt &&
+              off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt /2
+              + pbxcan->filtermap[1].id16mask_cnt /2 + pbxcan->filtermap[1].id16bit_cnt / 4
+              + pbxcan->fifo1filteroff) {
+              CAN1->FS1R &= ~mask;
+              CAN1->FM1R |= mask;
+              CAN1->FFA1R |= mask;
+          }
+        }
+        CAN1->sFilterRegister[i].FR1 = 0xFFFFFFFF; 
+        CAN1->sFilterRegister[i].FR2 = 0xFFFFFFFF; 
+        CAN1->FMR &= ~FMR_FINIT;
+    }
+    calcfiltermasks(pbxcan);
+}
+#define BS1SHIFT 16
+#define BS2SHIFT 20
+#define RRESCLSHIFT 0
+#define SJWSHIFT 24
+#define BS1MASK ( (0x0F) << BS1SHIFT )
+#define BS2MASK ( (0x07) << BS2SHIFT )
+#define RRESCLMASK ( 0x3FF << RRESCLSHIFT )
+#define SJWMASK ( 0x3 << SJWSHIFT )
+
+#define MK_BKCAN_BAUD(SJW,BS1,BS2,PRES) \
+    ((SJW << SJWSHIFT) | (BS1 << BS1SHIFT) | (BS2 << BS2SHIFT) | (PRES << RRESCLSHIFT))
+  
+static const rt_uint32_t bxcan_baud_rate_tab[] =
+{
+    // 48 M
+    MK_BKCAN_BAUD(CAN_SJW_2tq,CAN_BS1_12tq,CAN_BS2_3tq,3),
+    MK_BKCAN_BAUD(CAN_SJW_2tq,CAN_BS1_6tq,CAN_BS2_3tq,6),
+    MK_BKCAN_BAUD(CAN_SJW_2tq,CAN_BS1_12tq,CAN_BS2_3tq,5),
+    MK_BKCAN_BAUD(CAN_SJW_2tq,CAN_BS1_12tq,CAN_BS2_3tq,11),
+    MK_BKCAN_BAUD(CAN_SJW_2tq,CAN_BS1_12tq,CAN_BS2_3tq,23),
+    MK_BKCAN_BAUD(CAN_SJW_2tq,CAN_BS1_12tq,CAN_BS2_3tq,29),
+    MK_BKCAN_BAUD(CAN_SJW_2tq,CAN_BS1_12tq,CAN_BS2_3tq,59),
+    MK_BKCAN_BAUD(CAN_SJW_2tq,CAN_BS1_14tq,CAN_BS2_3tq,149),
+    MK_BKCAN_BAUD(CAN_SJW_2tq,CAN_BS1_16tq,CAN_BS2_8tq,199),
+};
+
+#define BAUD_DATA(TYPE,NO) \
+    ((bxcan_baud_rate_tab[NO] & TYPE##MASK) >> TYPE##SHIFT)
+
+static void bxcan_init(CAN_TypeDef* pcan, rt_uint32_t baud, rt_uint32_t mode)
+{
+      CAN_InitTypeDef        CAN_InitStructure;
+
+      CAN_InitStructure.CAN_TTCM = DISABLE;
+      CAN_InitStructure.CAN_ABOM = ENABLE;
+      CAN_InitStructure.CAN_AWUM = DISABLE;
+      CAN_InitStructure.CAN_NART = DISABLE;
+      CAN_InitStructure.CAN_RFLM = DISABLE;
+      CAN_InitStructure.CAN_TXFP = ENABLE;
+      switch(mode)
+      {
+      case RT_CAN_MODE_NORMAL:
+        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
+      break;
+      case RT_CAN_MODE_LISEN:
+        CAN_InitStructure.CAN_Mode = CAN_Mode_Silent;
+      break;
+      case RT_CAN_MODE_LOOPBACK:
+        CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
+      break;
+      case RT_CAN_MODE_LOOPBACKANLISEN:
+        CAN_InitStructure.CAN_Mode = CAN_Mode_Silent_LoopBack;
+      break;
+      }
+      CAN_InitStructure.CAN_SJW = BAUD_DATA(SJW,baud);
+      CAN_InitStructure.CAN_BS1 = BAUD_DATA(BS1,baud);
+      CAN_InitStructure.CAN_BS2 = BAUD_DATA(BS2,baud);
+      CAN_InitStructure.CAN_Prescaler =BAUD_DATA(RRESCL,baud);
+
+      CAN_Init(pcan, &CAN_InitStructure);
+}
+static void bxcan1_hw_init(void)
+{
+      GPIO_InitTypeDef  GPIO_InitStructure;
+      NVIC_InitTypeDef  NVIC_InitStructure;    
+
+      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
+         
+      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
+      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
+      GPIO_Init(GPIOA, &GPIO_InitStructure);
+    
+      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
+      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+      GPIO_Init(GPIOA, &GPIO_InitStructure);
+    
+      RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);  
+      
+      CAN_DeInit(CAN1);
+      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
+      NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
+      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
+      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
+      NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;      
+      NVIC_Init(&NVIC_InitStructure);
+      NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;
+      NVIC_Init(&NVIC_InitStructure);
+      NVIC_InitStructure.NVIC_IRQChannel = CAN1_TX_IRQn;
+      NVIC_Init(&NVIC_InitStructure);
+}
+static void bxcan2_hw_init(void)
+{
+      GPIO_InitTypeDef  GPIO_InitStructure;
+      NVIC_InitTypeDef  NVIC_InitStructure;    
+
+      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
+
+      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      
+      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
+      GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
+      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+      GPIO_Init(GPIOB, &GPIO_InitStructure);
+    
+      RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);  
+      
+      CAN_DeInit(CAN2);
+
+      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
+      NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
+      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
+      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
+      NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;      
+      NVIC_Init(&NVIC_InitStructure);
+      NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX1_IRQn;
+      NVIC_Init(&NVIC_InitStructure);
+      NVIC_InitStructure.NVIC_IRQChannel = CAN2_TX_IRQn;
+      NVIC_Init(&NVIC_InitStructure);
+}
+static inline rt_err_t bxcan_enter_init(CAN_TypeDef* pcan)
+{
+  uint32_t wait_ack = 0x00000000;
+
+  pcan->MCR |= CAN_MCR_INRQ ;
+
+  while (((pcan->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
+  {
+    wait_ack++;
+  }
+  if ((pcan->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
+  {
+    return RT_ERROR;
+  }
+  return RT_EOK;
+}
+static inline rt_err_t bxcan_exit_init(CAN_TypeDef* pcan)
+{
+   uint32_t wait_ack = 0x00000000;
+
+   pcan->MCR &= ~(uint32_t)CAN_MCR_INRQ;
+
+   while (((pcan->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
+   {
+     wait_ack++;
+   }
+   if ((pcan->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
+   {
+      return RT_ERROR;
+   }
+   return RT_EOK;
+}
+static rt_err_t bxcan_set_mode(CAN_TypeDef* pcan, rt_uint32_t mode)
+{
+    if(bxcan_enter_init(pcan) != RT_EOK)
+    {
+      return RT_ERROR;
+    }
+    pcan->BTR &= ~(uint32_t)((uint32_t)0x03 << 30);
+    switch(mode)
+    {
+    case RT_CAN_MODE_NORMAL:
+      mode = CAN_Mode_Normal;
+    break;
+    case RT_CAN_MODE_LISEN:
+      mode = CAN_Mode_Silent;
+    break;
+    case RT_CAN_MODE_LOOPBACK:
+      mode = CAN_Mode_LoopBack;
+    break;
+    case RT_CAN_MODE_LOOPBACKANLISEN:
+      mode = CAN_Mode_Silent_LoopBack;
+    break;
+    }
+    pcan->BTR |= ~(uint32_t)(mode << 30);
+    if(bxcan_exit_init(pcan) != RT_EOK)
+    {
+      return RT_ERROR;
+    }
+   return RT_EOK;
+}
+static rt_err_t bxcan_set_privmode(CAN_TypeDef* pcan, rt_uint32_t mode)
+{
+    if(bxcan_enter_init(pcan) != RT_EOK)
+    {
+      return RT_ERROR;
+    }
+    if (mode == ENABLE)
+    {
+      pcan->MCR |= CAN_MCR_TXFP;
+    }
+    else
+    {
+      pcan->MCR &= ~(uint32_t)CAN_MCR_TXFP;
+    }
+    if(bxcan_exit_init(pcan) != RT_EOK)
+    {
+      return RT_ERROR;
+    }
+   return RT_EOK;
+}
+static rt_err_t bxcan_set_baud_rate(CAN_TypeDef* pcan, rt_uint32_t baud)
+{
+    rt_uint32_t mode;
+    if(bxcan_enter_init(pcan) != RT_EOK)
+    {
+      return RT_ERROR;
+    }
+    pcan->BTR = 0;
+    mode = pcan->BTR & ((rt_uint32_t)0x03 << 30);
+    pcan->BTR = (mode                         | \
+                ((BAUD_DATA(SJW,baud)) << 24) | \
+                ((BAUD_DATA(BS1,baud)) << 16) | \
+                ((BAUD_DATA(BS2,baud)) << 20) | \
+                (BAUD_DATA(RRESCL,baud)));
+    if(bxcan_exit_init(pcan) != RT_EOK)
+    {
+      return RT_ERROR;
+    }
+   return RT_EOK;
+}
+static rt_err_t bxcancalcbaseoff(struct stm_bxcan *pbxcan, rt_int32_t hdr, 
+                rt_int32_t * pbase, rt_int32_t *  poff)
+{
+    rt_uint32_t fifo0start,fifo0end;
+    rt_uint32_t fifo1start,fifo1end;
+    rt_uint32_t ptr;
+    fifo0start = 0;
+    fifo0end = pbxcan->filtermap[0].id32mask_cnt
+               + pbxcan->filtermap[0].id32bit_cnt
+               + pbxcan->filtermap[0].id16mask_cnt
+               + pbxcan->filtermap[0].id16bit_cnt ;
+    fifo1start = pbxcan->fifo1filteroff * 4;
+    fifo1end = pbxcan->filtermap[1].id32mask_cnt
+               + pbxcan->filtermap[1].id32bit_cnt
+               + pbxcan->filtermap[1].id16mask_cnt
+               + pbxcan->filtermap[1].id16bit_cnt ;
+    if(hdr >= fifo0start && hdr < fifo0end) {
+      *pbase = 0;
+      ptr = 0;
+    } else if(hdr >= fifo1start && hdr < fifo1end) {
+        *pbase = pbxcan->fifo1filteroff;
+        ptr = 1;
+    } else {
+      return RT_ERROR;
+    }
+    ptr = 0;
+    if(hdr > pbxcan->filtermap[ptr].id32mask_cnt) {
+      hdr -= pbxcan->filtermap[ptr].id32mask_cnt;
+      *pbase += pbxcan->filtermap[ptr].id32mask_cnt;
+    } else {
+      *pbase += hdr;
+      *poff = 0;
+      return RT_EOK;
+    }
+    if(hdr > pbxcan->filtermap[ptr].id32bit_cnt) {
+      hdr -= pbxcan->filtermap[ptr].id32bit_cnt;
+      *pbase += pbxcan->filtermap[ptr].id32bit_cnt / 2;
+    } else {
+      *pbase += hdr / 2;
+      *poff = hdr % 2;
+      return RT_EOK;
+    }
+    if(hdr > pbxcan->filtermap[ptr].id16mask_cnt) {
+      hdr -= pbxcan->filtermap[ptr].id16mask_cnt;
+      *pbase += pbxcan->filtermap[ptr].id16mask_cnt / 2;
+    } else {
+      *pbase += hdr / 2;
+      *poff = hdr % 2;
+      return RT_EOK;
+    }
+    if(hdr > pbxcan->filtermap[ptr].id16bit_cnt) {
+      return RT_ERROR;
+    } else {
+      *pbase += hdr / 4;
+      *poff = hdr % 4;
+      return RT_EOK;
+    }
+}
+static void calcandormask(rt_uint32_t* pmask,rt_uint32_t shift,rt_int32_t count)
+{
+      rt_uint32_t tmpmask;
+      rt_uint32_t tmpmaskarray[BX_CAN_FILTER_MAX_ARRAY_SIZE] = {0,};
+      rt_int32_t i;
+      i = 0;
+      while(count > 0) {
+          if(i >= 32) {
+            tmpmaskarray[i] = 0xFFFFFFFF;
+          } else {
+            tmpmaskarray[i] = (0x01 << count) - 1;
+          }
+          count -= 32;
+          i++;
+      };
+      count = i;
+      for(i = 0; i < count && i < BX_CAN_FILTER_MAX_ARRAY_SIZE; i++) {
+          tmpmask = tmpmaskarray[i];
+          pmask[i] |= (rt_uint32_t)(tmpmask << shift);
+          if(i < BX_CAN_FILTER_MAX_ARRAY_SIZE - 1) {
+            pmask[i + 1] |= (rt_uint32_t)(tmpmask >> (32 - shift));
+          }
+      }
+}
+static void calcfiltermasks(struct stm_bxcan *pbxcan)
+{
+      rt_memset(&pbxcan->filtermask,0,sizeof(pbxcan->filtermask));
+      pbxcan->filtermask.id32maskshift[0] = 0;
+      if(pbxcan->filtermap[0].id32mask_cnt) {
+          calcandormask(pbxcan->filtermask.id32maskm,pbxcan->filtermask.id32maskshift[0],
+                        pbxcan->filtermap[0].id32mask_cnt);
+      }
+      pbxcan->filtermask.id32maskshift[1] = pbxcan->fifo1filteroff * 4;
+      if(pbxcan->filtermap[1].id32mask_cnt) {
+            calcandormask(pbxcan->filtermask.id32maskm,pbxcan->filtermask.id32maskshift[1],
+                  pbxcan->filtermap[1].id32mask_cnt);
+      }
+      pbxcan->filtermask.id32bitshift[0] = pbxcan->filtermask.id32maskshift[0] +
+                                           pbxcan->filtermap[0].id32mask_cnt;
+      if(pbxcan->filtermap[0].id32bit_cnt) {
+            calcandormask(pbxcan->filtermask.id32bitm,pbxcan->filtermask.id32bitshift[0],
+                          pbxcan->filtermap[0].id32bit_cnt);
+      }
+      pbxcan->filtermask.id32bitshift[1] = pbxcan->filtermask.id32maskshift[1] +
+                                           pbxcan->filtermap[1].id32mask_cnt;
+      if(pbxcan->filtermap[1].id32bit_cnt) {
+            calcandormask(pbxcan->filtermask.id32bitm,pbxcan->filtermask.id32bitshift[1],
+                          pbxcan->filtermap[1].id32bit_cnt);
+      }
+      pbxcan->filtermask.id16maskshift[0] = pbxcan->filtermask.id32bitshift[0] +
+                                            pbxcan->filtermap[0].id32bit_cnt;
+      if(pbxcan->filtermap[0].id16mask_cnt) {
+            calcandormask(pbxcan->filtermask.id16maskm,pbxcan->filtermask.id16maskshift[0],
+                          pbxcan->filtermap[0].id16mask_cnt);
+      }
+      pbxcan->filtermask.id16maskshift[1] = pbxcan->filtermask.id32bitshift[1] +
+                                            pbxcan->filtermap[1].id32bit_cnt;
+      if(pbxcan->filtermap[1].id16mask_cnt) {
+            calcandormask(pbxcan->filtermask.id16maskm,pbxcan->filtermask.id16maskshift[1],
+                          pbxcan->filtermap[1].id16mask_cnt);
+      }
+      pbxcan->filtermask.id16bitshift[0] = pbxcan->filtermask.id16maskshift[0] +
+                                           pbxcan->filtermap[0].id16mask_cnt;
+      if(pbxcan->filtermap[0].id16bit_cnt) {
+            calcandormask(pbxcan->filtermask.id16bitm,pbxcan->filtermask.id16bitshift[0],
+                          pbxcan->filtermap[0].id16bit_cnt);
+      }
+      pbxcan->filtermask.id16bitshift[1] = pbxcan->filtermask.id16maskshift[1] +
+                                           pbxcan->filtermap[1].id16mask_cnt;
+      if(pbxcan->filtermap[1].id16bit_cnt) {
+            calcandormask(pbxcan->filtermask.id16bitm,pbxcan->filtermask.id16bitshift[1],
+                          pbxcan->filtermap[1].id16bit_cnt);
+      }
+}
+static rt_int32_t bxcanfindfilter(struct stm_bxcan *pbxcan,struct rt_can_filter_item* pitem,
+                                  rt_int32_t type,rt_int32_t* base,rt_int32_t* off)
+{
+      rt_int32_t i;
+      rt_uint32_t bits,thisid,thismask,shift,found;
+      CAN_FilterRegister_TypeDef * pfilterreg;
+      found = 0;
+      switch(type) {
+      case 3:
+        shift = 3;
+        for(i = 0; i < BX_CAN_MAX_FILTERS; i++) {
+            bits = 0x01 << (i & 0x1F);
+            if(bits & (pbxcan->filtermask.id32maskm[i >> 5] & pbxcan->alocmask[i >> 5])) {
+                bxcancalcbaseoff(pbxcan,i,base,off);
+                pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
+                thisid = (rt_uint32_t)pitem->id<<shift;
+                thismask = (rt_uint32_t)pitem->mask<<shift;
+                if(pitem->ide) {
+                      thisid |= CAN_ID_EXT;
+                      thismask |= CAN_ID_EXT;
+                }
+                if(pitem->rtr) {
+                    thisid |= CAN_RTR_REMOTE;
+                    thismask |= CAN_RTR_REMOTE;
+                }
+                if(pfilterreg->FR1 == thisid && pfilterreg->FR2 == thismask) {
+                    found = 1;
+                    break;
+                }
+            }
+        }
+        break;
+      case 2:
+        shift = 3;
+        for(i = 0; i < BX_CAN_MAX_FILTERS; i++) {
+            bits = 0x01 << (i % 32);
+            if(bits & (pbxcan->filtermask.id32bitm[i >> 5] & pbxcan->alocmask[i >> 5])) {
+                  bxcancalcbaseoff(pbxcan,i,base,off);
+                  pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
+                  thisid = (rt_uint32_t)pitem->id<<shift;
+                  if(pitem->ide) {
+                       thisid |= CAN_ID_EXT;
+                  }
+                  if(pitem->rtr) {
+                      thisid |= CAN_RTR_REMOTE;
+                  }
+                  if((off == 0 && pfilterreg->FR1 == thisid) ||
+                     (*off == 1 && pfilterreg->FR2 == thisid)
+                  ) {
+                    found = 1;
+                    break;
+                  }
+            }
+        }
+        break;
+      case 1:
+        shift = 5;
+        for(i = 0; i < BX_CAN_MAX_FILTERS; i++) {
+            bits = 0x01 << (i % 32);
+            if(bits & (pbxcan->filtermask.id16maskm[i >> 5] & pbxcan->alocmask[i >> 5])) {
+                bxcancalcbaseoff(pbxcan,i,base,off);
+                pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
+                thisid = pitem->id << shift;
+                if(pitem->rtr) {
+                    thisid |= CAN_RTR_REMOTE << (shift - 2);
+                }
+                thismask = pitem->mask << shift;
+                if(pitem->rtr) {
+                    thismask |= CAN_RTR_REMOTE << (shift - 2);
+                }
+                if(*off == 0 && pfilterreg->FR1 == ((thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16)) ||
+                   *off == 1 && pfilterreg->FR2 == ((thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16))
+                   ){
+                    found = 1;
+                    break;
+                }
+            }
+        }
+        break;
+      case 0:
+        shift = 5;
+        for(i = 0; i < BX_CAN_MAX_FILTERS; i++) {
+            bits = 0x01 << (i % 32);
+            if(bits & (pbxcan->filtermask.id16bitm[i >> 5] & pbxcan->alocmask[i >> 5])) {
+                  bxcancalcbaseoff(pbxcan,i,base,off);
+                  pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
+                  thisid = pitem->id << shift;
+                  if(pitem->rtr) {
+                     thisid |= CAN_RTR_REMOTE << (shift - 2);
+                  }
+                  if(*off < 2 && ((rt_uint16_t*)&pfilterreg->FR1)[*off & 0x01] == thisid ||
+                     *off >= 2 && ((rt_uint16_t*)&pfilterreg->FR2)[*off & 0x01] == thisid) {
+                      found = 1;
+                      break;
+                  }
+            }
+        }
+        break;
+      }
+      if(found) {
+          return i;
+      }
+      return -1;
+}
+extern int __rt_ffs(int value);
+static rt_err_t bxcanallocfilter(rt_uint32_t * pmask, rt_uint32_t * palocmask,
+                                 rt_uint32_t count, rt_int32_t* hdr)
+{
+      rt_int32_t i;
+      for(i = 0; i < count; i++) {
+        rt_enter_critical();
+        if((pmask[i] & ~palocmask[i]) != 0) {
+          *hdr = __rt_ffs(pmask[i] & ~palocmask[i]) - 1 + i * 32;
+          palocmask[i] |= 0x01 <<(*hdr % 0x1F);
+          rt_exit_critical();
+          return RT_EOK;
+        }
+        rt_exit_critical();
+      }
+      if(i >= count) {
+         return RT_ENOMEM;
+      }
+      return RT_EOK;
+}
+static rt_err_t bxcanallocnewfilter(struct stm_bxcan *pbxcan, rt_int32_t actived,
+                                    rt_int32_t type, rt_int32_t* hdr, rt_int32_t* base, rt_int32_t* off)
+{
+      rt_err_t res;
+      *hdr = -1;
+      switch(type) {
+      case 0x03:
+        res = bxcanallocfilter(pbxcan->filtermask.id32maskm,pbxcan->alocmask,
+                                BX_CAN_FILTER_MAX_ARRAY_SIZE,hdr);
+        break;
+      case 0x02:
+        res = bxcanallocfilter(pbxcan->filtermask.id32bitm,pbxcan->alocmask,
+                                BX_CAN_FILTER_MAX_ARRAY_SIZE,hdr);
+        break;
+      case 0x01:
+        res = bxcanallocfilter(pbxcan->filtermask.id16maskm,pbxcan->alocmask,
+                                BX_CAN_FILTER_MAX_ARRAY_SIZE,hdr);
+        break;
+      case 0x00:
+        res = bxcanallocfilter(pbxcan->filtermask.id16bitm,pbxcan->alocmask,
+                                BX_CAN_FILTER_MAX_ARRAY_SIZE,hdr);
+        break;
+      }  
+      if(res != RT_EOK  || *hdr < 0) {
+         return RT_ENOMEM; 
+      }
+      bxcancalcbaseoff(pbxcan,*hdr,base,off);
+      return RT_EOK;
+}
+static rt_err_t bxmodifyfilter(struct stm_bxcan *pbxcan, struct rt_can_filter_item* pitem, rt_uint32_t actived)
+{
+      rt_int32_t fcase;
+      rt_err_t res;
+      rt_int32_t hdr,fbase,foff;
+
+      fcase = (pitem->mode | (pitem->ide << 1));
+      hdr = bxcanfindfilter(pbxcan,pitem,fcase,&fbase,&foff);
+      if(hdr < 0) {
+            if(!actived) {
+                return RT_EOK;
+            } else if(pitem->hdr == -1) {
+                res = bxcanallocnewfilter(pbxcan,actived,fcase,&hdr,&fbase,&foff);
+                if(res != RT_EOK) {
+                  return res;
+                }
+            } else if(pitem->hdr >= 0) {
+                rt_enter_critical();
+                res = bxcancalcbaseoff(pbxcan,pitem->hdr,&fbase,&foff);
+                if(res != RT_EOK) {
+                  return res;
+                }
+                hdr = pitem->hdr;
+                if(actived) {
+                    pbxcan->alocmask[hdr >> 5] |= 0x01 <<(hdr % 0x1F);
+                }
+                rt_exit_critical();
+            }
+      } else {
+            if(!actived) {
+                pitem->hdr = hdr;
+            } else if(hdr >= 0 && (pitem->hdr >= 0 || pitem->hdr == -1)) {
+                pitem->hdr = hdr;
+                return RT_EBUSY;
+            }
+      }
+      rt_uint32_t ID[2];
+      rt_uint32_t shift;
+      rt_uint32_t thisid;
+      rt_uint32_t thismask;
+      CAN_FilterInitTypeDef  CAN_FilterInitStructure;
+
+      pitem->hdr =  hdr;
+      CAN_FilterRegister_TypeDef * pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[fbase];
+      ID[0] = pfilterreg->FR1;
+      ID[1] = pfilterreg->FR2;
+      CAN_FilterInitStructure.CAN_FilterNumber = (pfilterreg - &CAN1->sFilterRegister[0]);
+      if(pitem->mode) {
+           CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
+      } else {
+           CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;
+      }
+      if(pitem->ide) {
+           CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
+      } else {
+           CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;
+      }
+      switch(fcase) {
+      case 0x03:
+         if(actived) {
+             shift = 3;
+             thisid = (rt_uint32_t)pitem->id<<shift;
+             thismask = (rt_uint32_t)pitem->mask<<shift;
+             if(pitem->ide) {
+                   thisid |= CAN_ID_EXT;
+                   thismask |= CAN_ID_EXT;
+             }
+             if(pitem->rtr) {
+                 thisid |= CAN_RTR_REMOTE;
+                 thismask |= CAN_RTR_REMOTE;
+             }
+             ID[0] = thisid;
+             ID[1] = thismask;
+         } else {
+             ID[0] = 0xFFFFFFFF;
+             ID[1] = 0xFFFFFFFF;
+         }
+        break;
+      case 0x02:
+         if(actived) {
+             shift = 3;
+             thisid = (rt_uint32_t)pitem->id<<shift;
+             if(pitem->ide) {
+                   thisid |= CAN_ID_EXT;
+             }
+             if(pitem->rtr) {
+                 thisid |= CAN_RTR_REMOTE;
+             }
+             ID[foff] = thisid;
+          } else {
+             ID[foff] = 0xFFFFFFFF;
+          }
+        break;
+      case 0x01:
+         if(actived) {
+             shift = 5;
+             thisid = pitem->id << shift;
+             if(pitem->rtr) {
+                 thisid |= CAN_RTR_REMOTE << (shift - 2);
+             }
+             thismask = pitem->mask << shift;
+             if(pitem->rtr) {
+                 thismask |= CAN_RTR_REMOTE << (shift - 2);
+             }
+             ID[foff] = (thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16);
+         } else {
+             ID[foff] = 0xFFFFFFFF;
+         }
+        break;
+      case 0x00:
+         if(actived) {
+             shift = 5;
+             thisid = pitem->id << shift;
+             if(pitem->rtr) {
+                 thisid |= CAN_RTR_REMOTE << (shift - 2);
+             }
+             ((rt_uint16_t*) ID)[foff] = thisid;
+         } else {
+             ((rt_uint16_t*) ID)[foff] = 0xFFFF;
+         }
+        break;
+      }
+      CAN_FilterInitStructure.CAN_FilterIdHigh = ((ID[1]) & 0x0000FFFF);
+      CAN_FilterInitStructure.CAN_FilterIdLow = ID[0] & 0x0000FFFF;
+      CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ID[1] & 0xFFFF0000) >> 16;
+      CAN_FilterInitStructure.CAN_FilterMaskIdLow = (ID[0] & 0xFFFF0000) >> 16;
+      if(fbase >= pbxcan->fifo1filteroff) {
+          CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 1;
+      } else {
+          CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
+      }
+      if(ID[0] != 0xFFFFFFFF || ID[1] != 0xFFFFFFFF) {
+          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
+      } else {
+          CAN_FilterInitStructure.CAN_FilterActivation=DISABLE;
+      }
+      if(!actived) {
+            rt_enter_critical();
+            pbxcan->alocmask[hdr >> 5] &= ~(0x01 <<(hdr % 0x1F));
+            rt_exit_critical();
+      }
+      CAN_FilterInit(&CAN_FilterInitStructure);
+      return RT_EOK;
+}
+static rt_err_t setfilter(struct stm_bxcan *pbxcan,struct rt_can_filter_config *pconfig)
+{
+    struct rt_can_filter_item* pitem = pconfig->items;
+    rt_uint32_t count = pconfig->count;
+    rt_err_t res;
+    while(count) {
+      res = bxmodifyfilter(pbxcan,pitem,pconfig->actived);
+      if(res != RT_EOK) {
+        return res;
+      }
+      pitem++;
+      count--;
+    }
+    return RT_EOK;
+}
+static rt_err_t configure(struct rt_can_device *can, struct can_configure *cfg)
+{
+    CAN_TypeDef* pbxcan;
+
+    pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
+    assert_param(IS_CAN_ALL_PERIPH(pbxcan));
+    if(pbxcan == CAN1)
+    {
+        bxcan1_hw_init();
+        bxcan_init(pbxcan,cfg->baud_rate,can->config.mode);
+        bxcan1_filter_init(can);
+    } else {
+        bxcan2_hw_init();
+        bxcan_init(pbxcan,cfg->baud_rate,can->config.mode);
+        bxcan2_filter_init(can);
+    }
+    return RT_EOK;
+}
+static rt_err_t control(struct rt_can_device *can, int cmd, void *arg)
+{
+    struct stm_bxcan* pbxcan;
+    rt_uint32_t argval;
+    NVIC_InitTypeDef  NVIC_InitStructure;
+
+    pbxcan= (struct stm_bxcan *) can->parent.user_data;
+    assert_param(pbxcan != RT_NULL);
+
+    switch (cmd)
+    {
+    case RT_DEVICE_CTRL_CLR_INT:
+        argval = (rt_uint32_t) arg;
+        if(argval == RT_DEVICE_FLAG_INT_RX)
+        {
+          NVIC_DisableIRQ(pbxcan->rcvirq0);
+          NVIC_DisableIRQ(pbxcan->rcvirq1);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FMP0 ,DISABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FF0 ,DISABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FOV0 ,DISABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FMP1 ,DISABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FF1 ,DISABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FOV1 ,DISABLE);
+        } else if(argval == RT_DEVICE_FLAG_INT_TX)
+        {
+          NVIC_DisableIRQ(pbxcan->sndirq);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_TME,DISABLE);
+        } else if(argval == RT_DEVICE_CAN_INT_ERR) {
+          CAN_ITConfig(pbxcan->reg,CAN_IT_BOF ,DISABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_LEC ,DISABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_ERR ,DISABLE);
+          NVIC_DisableIRQ(pbxcan->errirq);
+        }
+        break;
+    case RT_DEVICE_CTRL_SET_INT:
+        argval = (rt_uint32_t) arg;
+        if(argval == RT_DEVICE_FLAG_INT_RX)
+        {
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FMP0 ,ENABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FF0 ,ENABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FOV0 ,ENABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FMP1 ,ENABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FF1 ,ENABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_FOV1 ,ENABLE);
+          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
+          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
+          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
+          NVIC_InitStructure.NVIC_IRQChannel = pbxcan->rcvirq0;
+          NVIC_Init(&NVIC_InitStructure);
+          NVIC_InitStructure.NVIC_IRQChannel = pbxcan->rcvirq1;
+          NVIC_Init(&NVIC_InitStructure);
+        } else if(argval == RT_DEVICE_FLAG_INT_TX)
+        {
+          CAN_ITConfig(pbxcan->reg,CAN_IT_TME,ENABLE);
+          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
+          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
+          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
+          NVIC_InitStructure.NVIC_IRQChannel = pbxcan->sndirq;
+          NVIC_Init(&NVIC_InitStructure);
+        } else if(argval == RT_DEVICE_CAN_INT_ERR) {
+          CAN_ITConfig(pbxcan->reg,CAN_IT_BOF ,ENABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_LEC ,ENABLE);
+          CAN_ITConfig(pbxcan->reg,CAN_IT_ERR ,ENABLE);
+          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
+          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
+          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
+          NVIC_InitStructure.NVIC_IRQChannel = pbxcan->errirq;
+          NVIC_Init(&NVIC_InitStructure);
+        }
+        break;
+    case RT_CAN_CMD_SET_FILTER:
+         return setfilter(pbxcan, (struct rt_can_filter_config*) arg);
+        break;
+      case RT_CAN_CMD_SET_MODE:
+        argval = (rt_uint32_t) arg;
+        if(argval != RT_CAN_MODE_NORMAL ||
+           argval != RT_CAN_MODE_LISEN ||
+           argval != RT_CAN_MODE_LOOPBACK ||
+           argval != RT_CAN_MODE_LOOPBACKANLISEN ) {
+              return RT_ERROR; 
+         }
+         if(argval != can->config.mode)
+         {
+           can->config.mode = argval;
+           return bxcan_set_mode(pbxcan->reg, argval);
+         }
+        break;
+      case RT_CAN_CMD_SET_BAUD:
+        argval = (rt_uint32_t) arg;
+        if(argval != CAN1MBaud ||
+           argval != CAN800kBaud ||
+           argval != CAN500kBaud ||
+           argval != CAN250kBaud ||
+           argval != CAN125kBaud ||
+           argval != CAN100kBaud ||
+           argval != CAN50kBaud  ||
+           argval != CAN20kBaud  ||
+           argval != CAN10kBaud  ) {
+              return RT_ERROR; 
+         }
+         if(argval != can->config.baud_rate)
+         {
+           can->config.baud_rate = argval;
+           return bxcan_set_baud_rate(pbxcan->reg, argval);
+         }
+        break;
+      case RT_CAN_CMD_SET_PRIV:
+        argval = (rt_uint32_t) arg;
+        if(argval != RT_CAN_MODE_PRIV ||
+           argval != RT_CAN_MODE_NOPRIV) {
+              return RT_ERROR; 
+         }
+         if(argval != can->config.privmode)
+         {
+           can->config.privmode = argval;
+           return bxcan_set_privmode(pbxcan->reg, argval);
+         }
+        break;
+      case RT_CAN_CMD_GET_STATUS:
+        {
+          rt_uint32_t errtype;
+          errtype = pbxcan->reg->ESR;
+          can->status.rcverrcnt = errtype >> 24;
+          can->status.snderrcnt = (errtype >> 16 & 0xFF);
+          can->status.errcode = errtype & 0x07;
+          if(arg != &can->status) {
+              rt_memcpy(arg,&can->status,sizeof(can->status));
+          }
+        }
+        break;
+    }
+
+    return RT_EOK;
+}
+static int sendmsg(struct rt_can_device *can, const void* buf, rt_uint32_t boxno)
+{
+    CAN_TypeDef* pbxcan;
+    struct rt_can_msg* pmsg = (struct rt_can_msg*) buf;
+
+    pbxcan= ((struct stm_bxcan *) can->parent.user_data)->reg;
+    assert_param(IS_CAN_ALL_PERIPH(pbxcan));
+
+    pbxcan->sTxMailBox[boxno].TIR &= TMIDxR_TXRQ;
+    if (pmsg->ide == RT_CAN_STDID)
+    {
+      assert_param(IS_CAN_STDID(pmsg->id));
+      pbxcan->sTxMailBox[boxno].TIR |= ((pmsg->id << 21) | \
+                                                  pmsg->rtr);
+    }
+    else
+    {
+      assert_param(IS_CAN_EXTID(pmsg->id));
+      pbxcan->sTxMailBox[boxno].TIR |= ((pmsg->id << 3) | \
+                                                  pmsg->ide <<2 | \
+                                                  pmsg->rtr);
+    }
+
+    pmsg->len &= (uint8_t)0x0000000F;
+    pbxcan->sTxMailBox[boxno].TDTR &= (uint32_t)0xFFFFFFF0;
+    pbxcan->sTxMailBox[boxno].TDTR |= pmsg->len;
+
+    pbxcan->sTxMailBox[boxno].TDLR = (((uint32_t)pmsg->data[3] << 24) |
+                                             ((uint32_t)pmsg->data[2] << 16) |
+                                             ((uint32_t)pmsg->data[1] << 8) |
+                                             ((uint32_t)pmsg->data[0]));
+    if(pmsg->len > 4) {
+      pbxcan->sTxMailBox[boxno].TDHR = (((uint32_t)pmsg->data[7] << 24) |
+                                               ((uint32_t)pmsg->data[6] << 16) |
+                                               ((uint32_t)pmsg->data[5] << 8) |
+                                               ((uint32_t)pmsg->data[4]));
+    }
+    pbxcan->sTxMailBox[boxno].TIR |= TMIDxR_TXRQ;
+
+    return RT_EOK;
+}
+static int recvmsg(struct rt_can_device *can, void* buf, rt_uint32_t boxno)
+{
+    CAN_TypeDef* pbxcan;
+    struct rt_can_msg* pmsg = (struct rt_can_msg*) buf;
+
+    pbxcan= ((struct stm_bxcan *) can->parent.user_data)->reg;
+    assert_param(IS_CAN_ALL_PERIPH(pbxcan));
+    assert_param(IS_CAN_FIFO(boxno));
+    pmsg->ide = ((uint8_t)0x04 & pbxcan->sFIFOMailBox[boxno].RIR)>>2;
+    if (pmsg->ide == CAN_Id_Standard)
+    {
+      pmsg->id = (uint32_t)0x000007FF & (pbxcan->sFIFOMailBox[boxno].RIR >> 21);
+    }
+    else
+    {
+      pmsg->id = (uint32_t)0x1FFFFFFF & (pbxcan->sFIFOMailBox[boxno].RIR >> 3);
+    }
+
+    pmsg->rtr = (uint8_t)0x02 & pbxcan->sFIFOMailBox[boxno].RIR;
+    pmsg->len = (uint8_t)0x0F & pbxcan->sFIFOMailBox[boxno].RDTR;
+    pmsg->data[0] = (uint8_t)0xFF & pbxcan->sFIFOMailBox[boxno].RDLR;
+    pmsg->data[1] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 8);
+    pmsg->data[2] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 16);
+    pmsg->data[3] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 24);
+    if(pmsg->len > 4) {
+      pmsg->data[4] = (uint8_t)0xFF & pbxcan->sFIFOMailBox[boxno].RDHR;
+      pmsg->data[5] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 8);
+      pmsg->data[6] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 16);
+      pmsg->data[7] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 24);
+    }
+    pmsg->hdr = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDTR >> 8);
+    if(boxno) pmsg->hdr += ((struct stm_bxcan *) can->parent.user_data)->fifo1filteroff * 4;
+    return RT_EOK;
+}
+
+static const struct rt_can_ops canops =
+{
+    configure,
+    control,
+    sendmsg,
+    recvmsg,
+};
+#ifdef USING_BXCAN1
+#ifdef RT_CAN_USING_LED
+static struct  rt_can_led can1rcvled =
+{
+        CANRT1,PIN_MODE_OUTPUT_OD,1,
+};
+static struct  rt_can_led can1errled =
+{
+        CANERR1,PIN_MODE_OUTPUT_OD,1,
+};
+#endif
+static struct stm_bxcan bxcan1data =
+{
+    .reg = CAN1,
+    .mfrbase = (void*)&CAN1->sFilterRegister[0],
+    .sndirq = CAN1_TX_IRQn,
+    .rcvirq0 = CAN1_RX0_IRQn,
+    .rcvirq1 = CAN1_RX1_IRQn,
+    .errirq =  CAN1_SCE_IRQn,
+    .alocmask = {0,0},
+    .filtercnt = BX_CAN2_FMRSTART,
+    .fifo1filteroff = 7,
+    .filtermap = {
+      [0] = {
+        .id32mask_cnt = 0,
+        .id32bit_cnt = 0,
+        .id16mask_cnt = 2,
+        .id16bit_cnt =24,
+      },
+      [1] = {
+        .id32mask_cnt = 0,
+        .id32bit_cnt = 0,
+        .id16mask_cnt = 2,
+        .id16bit_cnt =24,
+      },
+    },
+};
+struct rt_can_device bxcan1;
+void CAN1_RX0_IRQHandler(void)
+{
+    while(CAN1->RF0R & 0x11)
+    {
+      if ((CAN1->RF0R & CAN_RF0R_FOVR0) != 0)
+      {
+          CAN1->RF0R = CAN_RF0R_FOVR0;
+          rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_RXOF_IND | 0<<8);  
+      } else {
+          rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_RX_IND | 0<<8);   
+      }
+      CAN1->RF0R |= CAN_RF0R_RFOM0;
+    }
+}
+void CAN1_RX1_IRQHandler(void)
+{
+    while(CAN1->RF1R & 0x11)
+    {
+      if ((CAN1->RF1R & CAN_RF1R_FOVR1) != 0)
+      {
+          CAN1->RF1R = CAN_RF1R_FOVR1;
+          rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_RXOF_IND | 1<<8);  
+      } else {
+          rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_RX_IND | 1<<8);   
+      }
+      CAN1->RF1R |= CAN_RF1R_RFOM1;
+    }
+}
+void CAN1_TX_IRQHandler(void)
+{
+    rt_uint32_t state;
+    if(CAN1->TSR &  (CAN_TSR_RQCP0))
+    {
+        state =  CAN1->TSR &  (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
+        CAN1->TSR |= CAN_TSR_RQCP0;
+        if(state == (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0))
+        {
+              rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_TX_DONE | 0<<8);
+        } else {
+              rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_TX_FAIL | 0<<8);
+        }
+    }
+    if(CAN1->TSR &  (CAN_TSR_RQCP1)) {
+         state =  CAN1->TSR &  (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
+         CAN1->TSR |= CAN_TSR_RQCP1;
+        if(state == (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1))
+        {
+              rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_TX_DONE | 1<<8);
+        } else {
+              rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_TX_FAIL | 1<<8);
+        }
+    }
+    if(CAN1->TSR &  (CAN_TSR_RQCP2)) {
+         state =  CAN1->TSR &  (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
+         CAN1->TSR |= CAN_TSR_RQCP2;
+        if(state == (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2))
+        {
+              rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_TX_DONE | 2<<8);
+        } else {
+              rt_hw_can_isr(&bxcan1,RT_CAN_EVENT_TX_FAIL | 2<<8);
+        }
+    }
+}
+void CAN1_SCE_IRQHandler(void)
+{
+  rt_uint32_t errtype;
+  errtype = CAN1->ESR;
+  if(errtype & 0x70 && bxcan1.status.lasterrtype == (errtype & 0x70)) {
+      switch((errtype & 0x70)>>4) {
+      case RT_CAN_BUS_BIT_PAD_ERR:
+        bxcan1.status.bitpaderrcnt++;
+        break;
+      case RT_CAN_BUS_FORMAT_ERR:
+        bxcan1.status.formaterrcnt++;
+        break;
+      case RT_CAN_BUS_ACK_ERR:
+        bxcan1.status.ackerrcnt++;
+        break;
+      case RT_CAN_BUS_IMPLICIT_BIT_ERR:
+      case RT_CAN_BUS_EXPLICIT_BIT_ERR:
+        bxcan1.status.biterrcnt++;
+        break;
+      case RT_CAN_BUS_CRC_ERR:
+        bxcan1.status.crcerrcnt++;
+        break;
+      }
+      bxcan1.status.lasterrtype = errtype & 0x70;
+      CAN1->ESR &= ~0x70;
+  }
+  bxcan1.status.rcverrcnt = errtype >> 24;
+  bxcan1.status.snderrcnt = (errtype >> 16 & 0xFF);
+  bxcan1.status.errcode = errtype & 0x07;
+  CAN1->MSR |= CAN_MSR_ERRI;
+}
+#endif /*USING_BXCAN1*/
+
+#ifdef USING_BXCAN2
+#ifdef RT_CAN_USING_LED
+static struct  rt_can_led can2rcvled =
+{
+        CANRT2,PIN_MODE_OUTPUT_OD,1,
+};
+static struct  rt_can_led can2errled =
+{
+        CANERR2,PIN_MODE_OUTPUT_OD,1,
+};
+#endif
+static struct stm_bxcan bxcan2data =
+{
+    .reg = CAN2,
+    .mfrbase = (void*)&CAN1->sFilterRegister[BX_CAN2_FMRSTART],
+    .sndirq = CAN2_TX_IRQn,
+    .rcvirq0 = CAN2_RX0_IRQn,
+    .rcvirq1 = CAN2_RX1_IRQn,
+    .errirq =  CAN2_SCE_IRQn,
+    .alocmask = {0,0},
+    .filtercnt = BX_CAN_FMRNUMBER - BX_CAN2_FMRSTART,
+    .fifo1filteroff = 7,
+    .filtermap = {
+      [0] = {
+        .id32mask_cnt = 0,
+        .id32bit_cnt = 0,
+        .id16mask_cnt = 2,
+        .id16bit_cnt =24,
+      },
+      [1] = {
+        .id32mask_cnt = 0,
+        .id32bit_cnt = 0,
+        .id16mask_cnt = 2,
+        .id16bit_cnt =24,
+      },
+    },
+};
+
+struct rt_can_device bxcan2;
+void CAN2_RX0_IRQHandler(void)
+{
+    while(CAN2->RF0R & 0x11)
+    {
+      if ((CAN2->RF0R & CAN_RF0R_FOVR0) != 0)
+      {
+          CAN2->RF0R = CAN_RF0R_FOVR0;
+          rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_RXOF_IND | 0<<8);  
+      } else {
+          rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_RX_IND | 0<<8);   
+      }
+      CAN2->RF0R |= CAN_RF0R_RFOM0;
+    }
+}
+void CAN2_RX1_IRQHandler(void)
+{
+    while(CAN2->RF1R & 0x11)
+    {
+      if ((CAN2->RF1R & CAN_RF1R_FOVR1) != 0)
+      {
+          CAN2->RF1R = CAN_RF1R_FOVR1;
+          rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_RXOF_IND | 1<<8);  
+      } else {
+          rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_RX_IND | 1<<8);   
+      }
+      CAN2->RF1R |= CAN_RF1R_RFOM1;
+    }
+}
+void CAN2_TX_IRQHandler(void)
+{
+    rt_uint32_t state;
+    if(CAN2->TSR &  (CAN_TSR_RQCP0))
+    {
+        state =  CAN2->TSR &  (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
+        CAN2->TSR |= CAN_TSR_RQCP0;
+        if(state == (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0))
+        {
+              rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_TX_DONE | 0<<8);
+        } else {
+              rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_TX_FAIL | 0<<8);
+        }
+    }
+    if(CAN2->TSR &  (CAN_TSR_RQCP1)) {
+         state =  CAN2->TSR &  (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
+         CAN2->TSR |= CAN_TSR_RQCP1;
+        if(state == (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1))
+        {
+              rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_TX_DONE | 1<<8);
+        } else {
+              rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_TX_FAIL | 1<<8);
+        }
+    }
+    if(CAN2->TSR &  (CAN_TSR_RQCP2)) {
+         state =  CAN2->TSR &  (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
+         CAN2->TSR |= CAN_TSR_RQCP2;
+        if(state == (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2))
+        {
+              rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_TX_DONE | 2<<8);
+        } else {
+              rt_hw_can_isr(&bxcan2,RT_CAN_EVENT_TX_FAIL | 2<<8);
+        }
+    }
+}
+void CAN2_SCE_IRQHandler(void)
+{
+    rt_uint32_t errtype;
+    errtype = CAN2->ESR;
+    if(errtype & 0x70 && bxcan2.status.lasterrtype == (errtype & 0x70)) {
+        switch((errtype & 0x70)>>4) {
+        case RT_CAN_BUS_BIT_PAD_ERR:
+          bxcan2.status.bitpaderrcnt++;
+          break;
+        case RT_CAN_BUS_FORMAT_ERR:
+          bxcan2.status.formaterrcnt++;
+          break;
+        case RT_CAN_BUS_ACK_ERR:
+          bxcan2.status.ackerrcnt++;
+          break;
+        case RT_CAN_BUS_IMPLICIT_BIT_ERR:
+        case RT_CAN_BUS_EXPLICIT_BIT_ERR:
+          bxcan2.status.biterrcnt++;
+          break;
+        case RT_CAN_BUS_CRC_ERR:
+          bxcan2.status.crcerrcnt++;
+          break;
+        }
+        bxcan2.status.lasterrtype = errtype & 0x70;
+        CAN2->ESR &= ~0x70;
+    }
+    bxcan2.status.rcverrcnt = errtype >> 24;
+    bxcan2.status.snderrcnt = (errtype >> 16 & 0xFF);
+    bxcan2.status.errcode = errtype & 0x07;
+    CAN2->MSR |= CAN_MSR_ERRI;
+}
+#endif /*USING_BXCAN2*/
+
+int stm32_bxcan_init(void)
+{
+
+#ifdef USING_BXCAN1
+      bxcan1.config.baud_rate=CAN1MBaud;
+      bxcan1.config.msgboxsz=16;
+      bxcan1.config.sndboxnumber=3;
+      bxcan1.config.mode=RT_CAN_MODE_NORMAL;
+      bxcan1.config.privmode=0;
+      #ifdef RT_CAN_USING_LED
+      bxcan1.config.rcvled = &can1rcvled;
+      bxcan1.config.sndled = RT_NULL;
+      bxcan1.config.errled = &can1errled;
+      #endif
+      bxcan1.config.ticks = 50;
+#ifdef RT_CAN_USING_HDR
+      bxcan1.config.maxhdr = BX_CAN2_FMRSTART * 4;
+#endif
+      rt_hw_can_register(&bxcan1, "bxcan1", &canops, &bxcan1data);
+#endif
+
+#ifdef USING_BXCAN2
+      bxcan2.config.baud_rate=CAN1MBaud;
+      bxcan2.config.msgboxsz=16;
+      bxcan2.config.sndboxnumber=3;
+      bxcan2.config.mode=RT_CAN_MODE_NORMAL;
+      bxcan2.config.privmode=0;
+      #ifdef RT_CAN_USING_LED
+      bxcan2.config.rcvled = &can2rcvled;
+      bxcan2.config.sndled = RT_NULL;
+      bxcan2.config.errled = &can2errled;
+      #endif
+      bxcan2.config.ticks = 50;
+#ifdef RT_CAN_USING_HDR
+      bxcan2.config.maxhdr = (BX_CAN_FMRNUMBER - BX_CAN2_FMRSTART) * 4;
+#endif
+      rt_hw_can_register(&bxcan2, "bxcan2", &canops, &bxcan2data);
+#endif
+      return RT_EOK;
+}
+INIT_BOARD_EXPORT(stm32_bxcan_init);
+
+#endif /*RT_USING_CAN2*/

+ 17 - 0
bsp/stm32f10x/drivers/bxcan.h

@@ -0,0 +1,17 @@
+/*
+ * File      : bxcan.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2015, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2015-05-14     aubrcool@qq.com first version
+ */
+
+#ifndef BXCAN_H_
+#define BXCAN_H_
+#endif /*BXCAN_H_*/

+ 72 - 73
bsp/stm32f10x/project.Uv2

@@ -3,84 +3,83 @@
 
 Target (RT-Thread STM32), 0x0004 // Tools: 'ARM-ADS'
 
+Group (STM32_StdPeriph)
 Group (Applications)
 Group (Drivers)
-Group (STM32_StdPeriph)
 Group (Kernel)
 Group (CORTEX-M3)
 Group (DeviceDrivers)
 Group (finsh)
-Group (Components)
 
-File 1,1,<applications\application.c><application.c>
-File 1,1,<applications\startup.c><startup.c>
-File 2,1,<drivers\board.c><board.c>
-File 2,1,<drivers\stm32f10x_it.c><stm32f10x_it.c>
-File 2,1,<drivers\led.c><led.c>
-File 2,1,<drivers\usart.c><usart.c>
-File 3,1,<Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c><system_stm32f10x.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c><stm32f10x_crc.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c><stm32f10x_rcc.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c><stm32f10x_wwdg.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c><stm32f10x_pwr.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c><stm32f10x_exti.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_bkp.c><stm32f10x_bkp.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c><stm32f10x_i2c.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_adc.c><stm32f10x_adc.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c><stm32f10x_dac.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c><stm32f10x_rtc.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c><stm32f10x_fsmc.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c><stm32f10x_tim.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c><stm32f10x_iwdg.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_spi.c><stm32f10x_spi.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c><stm32f10x_flash.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c><stm32f10x_sdio.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c><stm32f10x_gpio.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c><stm32f10x_usart.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c><stm32f10x_dbgmcu.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c><stm32f10x_dma.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_can.c><stm32f10x_can.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_cec.c><stm32f10x_cec.c>
-File 3,1,<Libraries\STM32F10x_StdPeriph_Driver\src\misc.c><misc.c>
-File 3,2,<Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x_hd.s><startup_stm32f10x_hd.s>
-File 4,1,<..\..\src\clock.c><clock.c>
-File 4,1,<..\..\src\device.c><device.c>
-File 4,1,<..\..\src\idle.c><idle.c>
-File 4,1,<..\..\src\ipc.c><ipc.c>
-File 4,1,<..\..\src\irq.c><irq.c>
-File 4,1,<..\..\src\kservice.c><kservice.c>
-File 4,1,<..\..\src\mem.c><mem.c>
-File 4,1,<..\..\src\mempool.c><mempool.c>
-File 4,1,<..\..\src\object.c><object.c>
-File 4,1,<..\..\src\scheduler.c><scheduler.c>
-File 4,1,<..\..\src\thread.c><thread.c>
-File 4,1,<..\..\src\timer.c><timer.c>
-File 5,1,<..\..\libcpu\arm\cortex-m3\cpuport.c><cpuport.c>
-File 5,2,<..\..\libcpu\arm\cortex-m3\context_rvds.S><context_rvds.S>
-File 5,1,<..\..\libcpu\arm\common\backtrace.c><backtrace.c>
-File 5,1,<..\..\libcpu\arm\common\div0.c><div0.c>
-File 5,1,<..\..\libcpu\arm\common\showmem.c><showmem.c>
-File 6,1,<..\..\components\drivers\serial\serial.c><serial.c>
-File 6,1,<..\..\components\drivers\src\completion.c><completion.c>
-File 6,1,<..\..\components\drivers\src\dataqueue.c><dataqueue.c>
-File 6,1,<..\..\components\drivers\src\pipe.c><pipe.c>
-File 6,1,<..\..\components\drivers\src\ringbuffer.c><ringbuffer.c>
-File 7,1,<..\..\components\finsh\cmd.c><cmd.c>
-File 7,1,<..\..\components\finsh\finsh_compiler.c><finsh_compiler.c>
-File 7,1,<..\..\components\finsh\finsh_error.c><finsh_error.c>
-File 7,1,<..\..\components\finsh\finsh_heap.c><finsh_heap.c>
-File 7,1,<..\..\components\finsh\finsh_init.c><finsh_init.c>
-File 7,1,<..\..\components\finsh\finsh_node.c><finsh_node.c>
-File 7,1,<..\..\components\finsh\finsh_ops.c><finsh_ops.c>
-File 7,1,<..\..\components\finsh\finsh_parser.c><finsh_parser.c>
-File 7,1,<..\..\components\finsh\finsh_token.c><finsh_token.c>
-File 7,1,<..\..\components\finsh\finsh_var.c><finsh_var.c>
-File 7,1,<..\..\components\finsh\finsh_vm.c><finsh_vm.c>
-File 7,1,<..\..\components\finsh\msh.c><msh.c>
-File 7,1,<..\..\components\finsh\msh_cmd.c><msh_cmd.c>
-File 7,1,<..\..\components\finsh\shell.c><shell.c>
-File 7,1,<..\..\components\finsh\symbol.c><symbol.c>
-File 8,1,<..\..\components\init\components.c><components.c>
+File 1,1,<Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c><system_stm32f10x.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c><stm32f10x_crc.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c><stm32f10x_rcc.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c><stm32f10x_wwdg.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c><stm32f10x_pwr.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c><stm32f10x_exti.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c><stm32f10x_bkp.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c><stm32f10x_i2c.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c><stm32f10x_adc.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c><stm32f10x_dac.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c><stm32f10x_rtc.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c><stm32f10x_fsmc.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c><stm32f10x_tim.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c><stm32f10x_iwdg.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c><stm32f10x_spi.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c><stm32f10x_flash.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c><stm32f10x_sdio.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c><stm32f10x_gpio.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c><stm32f10x_usart.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c><stm32f10x_dbgmcu.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c><stm32f10x_dma.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c><stm32f10x_can.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c><stm32f10x_cec.c>
+File 1,1,<Libraries/STM32F10x_StdPeriph_Driver/src/misc.c><misc.c>
+File 1,2,<Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd.s><startup_stm32f10x_hd.s>
+File 2,1,<applications/application.c><application.c>
+File 2,1,<applications/startup.c><startup.c>
+File 3,1,<drivers/board.c><board.c>
+File 3,1,<drivers/stm32f10x_it.c><stm32f10x_it.c>
+File 3,1,<drivers/led.c><led.c>
+File 3,1,<drivers/usart.c><usart.c>
+File 4,1,<../../src/clock.c><clock.c>
+File 4,1,<../../src/components.c><components.c>
+File 4,1,<../../src/device.c><device.c>
+File 4,1,<../../src/idle.c><idle.c>
+File 4,1,<../../src/ipc.c><ipc.c>
+File 4,1,<../../src/irq.c><irq.c>
+File 4,1,<../../src/kservice.c><kservice.c>
+File 4,1,<../../src/mem.c><mem.c>
+File 4,1,<../../src/mempool.c><mempool.c>
+File 4,1,<../../src/object.c><object.c>
+File 4,1,<../../src/scheduler.c><scheduler.c>
+File 4,1,<../../src/thread.c><thread.c>
+File 4,1,<../../src/timer.c><timer.c>
+File 5,1,<../../libcpu/arm/cortex-m3/cpuport.c><cpuport.c>
+File 5,2,<../../libcpu/arm/cortex-m3/context_rvds.S><context_rvds.S>
+File 5,1,<../../libcpu/arm/common/backtrace.c><backtrace.c>
+File 5,1,<../../libcpu/arm/common/div0.c><div0.c>
+File 5,1,<../../libcpu/arm/common/showmem.c><showmem.c>
+File 6,1,<../../components/drivers/serial/serial.c><serial.c>
+File 6,1,<../../components/drivers/src/completion.c><completion.c>
+File 6,1,<../../components/drivers/src/dataqueue.c><dataqueue.c>
+File 6,1,<../../components/drivers/src/pipe.c><pipe.c>
+File 6,1,<../../components/drivers/src/portal.c><portal.c>
+File 6,1,<../../components/drivers/src/ringbuffer.c><ringbuffer.c>
+File 6,1,<../../components/drivers/src/workqueue.c><workqueue.c>
+File 7,1,<../../components/finsh/shell.c><shell.c>
+File 7,1,<../../components/finsh/symbol.c><symbol.c>
+File 7,1,<../../components/finsh/cmd.c><cmd.c>
+File 7,1,<../../components/finsh/finsh_compiler.c><finsh_compiler.c>
+File 7,1,<../../components/finsh/finsh_error.c><finsh_error.c>
+File 7,1,<../../components/finsh/finsh_heap.c><finsh_heap.c>
+File 7,1,<../../components/finsh/finsh_init.c><finsh_init.c>
+File 7,1,<../../components/finsh/finsh_node.c><finsh_node.c>
+File 7,1,<../../components/finsh/finsh_ops.c><finsh_ops.c>
+File 7,1,<../../components/finsh/finsh_parser.c><finsh_parser.c>
+File 7,1,<../../components/finsh/finsh_var.c><finsh_var.c>
+File 7,1,<../../components/finsh/finsh_vm.c><finsh_vm.c>
+File 7,1,<../../components/finsh/finsh_token.c><finsh_token.c>
 
 
 
@@ -143,7 +142,7 @@ Options 1,0,0  // Target 'RT-Thread STM32'
  ADSCMISC ()
  ADSCDEFN (STM32F10X_HD, USE_STDPERIPH_DRIVER)
  ADSCUDEF ()
- ADSCINCD (Libraries\STM32F10x_StdPeriph_Driver\inc;..\..\include;drivers;..\..\components\CMSIS\Include;.;applications;..\..\libcpu\arm\cortex-m3;..\..\components\drivers\include;..\..\libcpu\arm\common;..\..\components\init;..\..\components\finsh;Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x)
+ ADSCINCD (../../libcpu/arm/cortex-m3;../../components/drivers/include;Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x;../../libcpu/arm/common;.;applications;../../include;../../components/finsh;../../components/CMSIS/Include;drivers;Libraries/STM32F10x_StdPeriph_Driver/inc)
  ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
  ADSAMISC ()
  ADSADEFN ()
@@ -164,7 +163,7 @@ Options 1,0,0  // Target 'RT-Thread STM32'
  ADSLDSC ()
  ADSLDIB ()
  ADSLDIC ()
- ADSLDMC ( --keep __fsym_* --keep __vsym_*   --keep __rt_init* )
+ ADSLDMC ( --keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --keep *.o(VSymTab) )
  ADSLDIF ()
  ADSLDDW ()
   OPTDL (SARMCM3.DLL)()(DARMSTM.DLL)(-pSTM32F103ZE)(SARMCM3.DLL)()(TARMSTM.DLL)(-pSTM32F103ZE)

+ 147 - 140
bsp/stm32f20x/project.uvproj

@@ -343,7 +343,7 @@
               <MiscControls />
               <Define>USE_STDPERIPH_DRIVER</Define>
               <Undefine />
-              <IncludePath>.;..\..\components\CMSIS\Include;..\..\components\finsh;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m3;Drivers;Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F2xx;Libraries\STM32F2xx_StdPeriph_Driver\inc;applications</IncludePath>
+              <IncludePath>Libraries/STM32F2xx_StdPeriph_Driver/inc;Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F2xx;../../components/CMSIS/Include;applications;.;Drivers;../../include;../../libcpu/arm/cortex-m3;../../libcpu/arm/common;../../components/finsh</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -373,7 +373,7 @@
             <ScatterFile />
             <IncludeLibs />
             <IncludeLibsPath />
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
             <LinkerInputFile />
             <DisabledWarnings />
           </LDads>
@@ -381,312 +381,312 @@
       </TargetOption>
       <Groups>
         <Group>
-          <GroupName>Applications</GroupName>
+          <GroupName>STM32_StdPeriph</GroupName>
           <Files>
             <File>
-              <FileName>application.c</FileName>
+              <FileName>system_stm32f2xx.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\application.c</FilePath>
+              <FilePath>Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F2xx/system_stm32f2xx.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>startup.c</FileName>
+              <FileName>misc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>applications\startup.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/misc.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>Drivers</GroupName>
           <Files>
             <File>
-              <FileName>24LCxx.c</FileName>
+              <FileName>stm32f2xx_adc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Drivers\24LCxx.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_adc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>FM25Lx.c</FileName>
+              <FileName>stm32f2xx_can.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Drivers\FM25Lx.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_can.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>board.c</FileName>
+              <FileName>stm32f2xx_crc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Drivers\board.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_crc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>i2c.c</FileName>
+              <FileName>stm32f2xx_cryp.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Drivers\i2c.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_cryp.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>rtc.c</FileName>
+              <FileName>stm32f2xx_cryp_aes.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Drivers\rtc.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_cryp_aes.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>serial.c</FileName>
+              <FileName>stm32f2xx_cryp_des.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Drivers\serial.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_cryp_des.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_it.c</FileName>
+              <FileName>stm32f2xx_cryp_tdes.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Drivers\stm32f2xx_it.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_cryp_tdes.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>usart.c</FileName>
+              <FileName>stm32f2xx_dac.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Drivers\usart.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dac.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>STM32_StdPeriph</GroupName>
           <Files>
             <File>
-              <FileName>system_stm32f2xx.c</FileName>
+              <FileName>stm32f2xx_dbgmcu.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F2xx\system_stm32f2xx.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dbgmcu.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>misc.c</FileName>
+              <FileName>stm32f2xx_dcmi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\misc.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dcmi.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_adc.c</FileName>
+              <FileName>stm32f2xx_dma.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_adc.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dma.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_can.c</FileName>
+              <FileName>stm32f2xx_exti.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_can.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_exti.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_crc.c</FileName>
+              <FileName>stm32f2xx_flash.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_crc.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_flash.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_cryp.c</FileName>
+              <FileName>stm32f2xx_fsmc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_cryp.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_fsmc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_cryp_aes.c</FileName>
+              <FileName>stm32f2xx_gpio.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_cryp_aes.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_cryp_des.c</FileName>
+              <FileName>stm32f2xx_hash.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_cryp_des.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_hash.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_cryp_tdes.c</FileName>
+              <FileName>stm32f2xx_hash_md5.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_cryp_tdes.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_hash_md5.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_dac.c</FileName>
+              <FileName>stm32f2xx_hash_sha1.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_dac.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_hash_sha1.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_dbgmcu.c</FileName>
+              <FileName>stm32f2xx_i2c.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_dbgmcu.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_i2c.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_dcmi.c</FileName>
+              <FileName>stm32f2xx_iwdg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_dcmi.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_iwdg.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_dma.c</FileName>
+              <FileName>stm32f2xx_pwr.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_dma.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_pwr.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_exti.c</FileName>
+              <FileName>stm32f2xx_rcc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_exti.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rcc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_flash.c</FileName>
+              <FileName>stm32f2xx_rng.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_flash.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rng.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_fsmc.c</FileName>
+              <FileName>stm32f2xx_rtc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_fsmc.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rtc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_gpio.c</FileName>
+              <FileName>stm32f2xx_sdio.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_gpio.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_sdio.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_hash.c</FileName>
+              <FileName>stm32f2xx_spi.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_hash.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_spi.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_hash_md5.c</FileName>
+              <FileName>stm32f2xx_syscfg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_hash_md5.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_syscfg.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_hash_sha1.c</FileName>
+              <FileName>stm32f2xx_tim.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_hash_sha1.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_tim.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_i2c.c</FileName>
+              <FileName>stm32f2xx_usart.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_i2c.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_usart.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_iwdg.c</FileName>
+              <FileName>stm32f2xx_wwdg.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_iwdg.c</FilePath>
+              <FilePath>Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_wwdg.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_pwr.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_pwr.c</FilePath>
+              <FileName>startup_stm32f2xx.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F2xx/startup/arm/startup_stm32f2xx.s</FilePath>
             </File>
           </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
           <Files>
             <File>
-              <FileName>stm32f2xx_rcc.c</FileName>
+              <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_rcc.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_rng.c</FileName>
+              <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_rng.c</FilePath>
+              <FilePath>applications/startup.c</FilePath>
             </File>
           </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
           <Files>
             <File>
-              <FileName>stm32f2xx_rtc.c</FileName>
+              <FileName>24LCxx.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_rtc.c</FilePath>
+              <FilePath>Drivers/24LCxx.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_sdio.c</FileName>
+              <FileName>FM25Lx.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_sdio.c</FilePath>
+              <FilePath>Drivers/FM25Lx.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_spi.c</FileName>
+              <FileName>board.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_spi.c</FilePath>
+              <FilePath>Drivers/board.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_syscfg.c</FileName>
+              <FileName>i2c.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_syscfg.c</FilePath>
+              <FilePath>Drivers/i2c.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_tim.c</FileName>
+              <FileName>rtc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_tim.c</FilePath>
+              <FilePath>Drivers/rtc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_usart.c</FileName>
+              <FileName>serial.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_usart.c</FilePath>
+              <FilePath>Drivers/serial.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>stm32f2xx_wwdg.c</FileName>
+              <FileName>stm32f2xx_it.c</FileName>
               <FileType>1</FileType>
-              <FilePath>Libraries\STM32F2xx_StdPeriph_Driver\src\stm32f2xx_wwdg.c</FilePath>
+              <FilePath>Drivers/stm32f2xx_it.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>startup_stm32f2xx.s</FileName>
-              <FileType>2</FileType>
-              <FilePath>Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F2xx\startup\arm\startup_stm32f2xx.s</FilePath>
+              <FileName>usart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>Drivers/usart.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -696,84 +696,91 @@
             <File>
               <FileName>clock.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\clock.c</FilePath>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\device.c</FilePath>
+              <FilePath>../../src/device.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>idle.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\idle.c</FilePath>
+              <FilePath>../../src/idle.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>ipc.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\ipc.c</FilePath>
+              <FilePath>../../src/ipc.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>irq.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\irq.c</FilePath>
+              <FilePath>../../src/irq.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>kservice.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\kservice.c</FilePath>
+              <FilePath>../../src/kservice.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>mem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mem.c</FilePath>
+              <FilePath>../../src/mem.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>mempool.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\mempool.c</FilePath>
+              <FilePath>../../src/mempool.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>object.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\object.c</FilePath>
+              <FilePath>../../src/object.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>scheduler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\scheduler.c</FilePath>
+              <FilePath>../../src/scheduler.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>thread.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\thread.c</FilePath>
+              <FilePath>../../src/thread.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>timer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\src\timer.c</FilePath>
+              <FilePath>../../src/timer.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -783,35 +790,35 @@
             <File>
               <FileName>cpuport.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\cpuport.c</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/cpuport.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>context_rvds.S</FileName>
               <FileType>2</FileType>
-              <FilePath>..\..\libcpu\arm\cortex-m3\context_rvds.S</FilePath>
+              <FilePath>../../libcpu/arm/cortex-m3/context_rvds.S</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>backtrace.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\backtrace.c</FilePath>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>div0.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\div0.c</FilePath>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
               <FileName>showmem.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\libcpu\arm\common\showmem.c</FilePath>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
             </File>
           </Files>
         </Group>
@@ -819,93 +826,93 @@
           <GroupName>finsh</GroupName>
           <Files>
             <File>
-              <FileName>cmd.c</FileName>
+              <FileName>shell.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\cmd.c</FilePath>
+              <FilePath>../../components/finsh/shell.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_compiler.c</FileName>
+              <FileName>symbol.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_error.c</FileName>
+              <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_error.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_heap.c</FileName>
+              <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_heap.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_init.c</FileName>
+              <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_init.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_node.c</FileName>
+              <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_node.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_ops.c</FileName>
+              <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_parser.c</FileName>
+              <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_parser.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_token.c</FileName>
+              <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_var.c</FileName>
+              <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_vm.c</FileName>
+              <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\finsh_vm.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>shell.c</FileName>
+              <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\shell.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>symbol.c</FileName>
+              <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\..\components\finsh\symbol.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>

+ 1 - 1
bsp/stm32f40x/applications/application.c

@@ -20,7 +20,7 @@
 #include <lwip/sys.h>
 #include <lwip/api.h>
 #include <netif/ethernetif.h>
-#include "stm32_eth.h"
+#include "stm32f4xx_eth.h"
 #endif
 
 #ifdef RT_USING_GDB

+ 17 - 1
bsp/stm32f40x/drivers/SConscript

@@ -3,9 +3,25 @@ Import('rtconfig')
 from building import *
 
 cwd     = os.path.join(str(Dir('#')), 'drivers')
-src	= Glob('*.c')
+
+# add the general drivers.
+src = Split("""
+board.c
+stm32f4xx_it.c
+usart.c
+""")
+
+# add Ethernet drivers.
+if GetDepend('RT_USING_LWIP'):
+    src += ['stm32f4xx_eth.c']
+
+# add gpio drivers.
+if GetDepend('RT_USING_PIN'):
+    src += ['gpio.c']
+
 CPPPATH = [cwd]
 
 group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
 
 Return('group')
+

+ 4038 - 0
bsp/stm32f40x/drivers/stm32f4xx_eth.c

@@ -0,0 +1,4038 @@
+/**
+  ******************************************************************************
+  * @file    stm32f2xx_eth.c
+  * @author  MCD Application Team
+  * @version V0.0.1
+  * @date    10/21/2010
+  * @brief   This file provides all the ETH firmware functions for STM32F2xx devices.
+  *          This driver is based on V1.1.0 of "stm32_eth.c" driver, and updated
+  *          to support new feature added in STM32F2xx devices (Enhanced DMA descriptors)
+  ******************************************************************************
+  * @copy
+  *
+  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+  *
+  * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>
+  */
+
+/*
+ * Change Logs:
+ * Date           Author       Notes
+ * 2011-07-22     aozima       first implementation.
+ * 2012-09-24     aozima       update for stm32f4.
+ * 2012-09-26     aozima       add phy monitor.
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f4xx_eth.h"
+#include "stm32f4xx_rcc.h"
+
+/* STM32F ETH dirver options */
+#define RMII_MODE                       /* MII_MODE or RMII_MODE */
+#define RMII_TX_GPIO_GROUP        2     /* 1:GPIOB or 2:GPIOG */
+#define CHECKSUM_BY_HARDWARE
+
+/** @addtogroup STM32F4XX_ETH_Driver
+  * @brief ETH driver modules
+  * @{
+  */
+
+/** @defgroup ETH_Private_TypesDefinitions
+  * @{
+  */
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Private_Defines
+  * @{
+  */
+/* Global pointers on Tx and Rx descriptor used to track transmit and receive descriptors */
+ETH_DMADESCTypeDef  *DMATxDescToSet;
+ETH_DMADESCTypeDef  *DMARxDescToGet;
+
+ETH_DMADESCTypeDef  *DMAPTPTxDescToSet;
+ETH_DMADESCTypeDef  *DMAPTPRxDescToGet;
+
+/* ETHERNET MAC address offsets */
+#define ETH_MAC_ADDR_HBASE   (ETH_MAC_BASE + 0x40)  /* ETHERNET MAC address high offset */
+#define ETH_MAC_ADDR_LBASE    (ETH_MAC_BASE + 0x44)  /* ETHERNET MAC address low offset */
+
+/* ETHERNET MACMIIAR register Mask */
+#define MACMIIAR_CR_MASK    ((uint32_t)0xFFFFFFE3)
+
+/* ETHERNET MACCR register Mask */
+#define MACCR_CLEAR_MASK    ((uint32_t)0xFF20810F)
+
+/* ETHERNET MACFCR register Mask */
+#define MACFCR_CLEAR_MASK   ((uint32_t)0x0000FF41)
+
+/* ETHERNET DMAOMR register Mask */
+#define DMAOMR_CLEAR_MASK   ((uint32_t)0xF8DE3F23)
+
+/* ETHERNET Remote Wake-up frame register length */
+#define ETH_WAKEUP_REGISTER_LENGTH      8
+
+/* ETHERNET Missed frames counter Shift */
+#define  ETH_DMA_RX_OVERFLOW_MISSEDFRAMES_COUNTERSHIFT     17
+
+/* ETHERNET DMA Tx descriptors Collision Count Shift */
+#define  ETH_DMATXDESC_COLLISION_COUNTSHIFT        3
+
+/* ETHERNET DMA Tx descriptors Buffer2 Size Shift */
+#define  ETH_DMATXDESC_BUFFER2_SIZESHIFT           16
+
+/* ETHERNET DMA Rx descriptors Frame Length Shift */
+#define  ETH_DMARXDESC_FRAME_LENGTHSHIFT           16
+
+/* ETHERNET DMA Rx descriptors Buffer2 Size Shift */
+#define  ETH_DMARXDESC_BUFFER2_SIZESHIFT           16
+
+/* ETHERNET errors */
+#define  ETH_ERROR              ((uint32_t)0)
+#define  ETH_SUCCESS            ((uint32_t)1)
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Private_Macros
+  * @{
+  */
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Private_Variables
+  * @{
+  */
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Private_FunctionPrototypes
+  * @{
+  */
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Private_Functions
+  * @{
+  */
+
+/**
+  * @brief  Deinitializes the ETHERNET peripheral registers to their default reset values.
+  * @param  None
+  * @retval None
+  */
+void ETH_DeInit(void)
+{
+  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE);
+  RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE);
+}
+
+/**
+  * @brief  Initializes the ETHERNET peripheral according to the specified
+  *   parameters in the ETH_InitStruct .
+  * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure that contains
+  *   the configuration information for the specified ETHERNET peripheral.
+  * @param PHYAddress: external PHY address
+  * @retval ETH_ERROR: Ethernet initialization failed
+  *         ETH_SUCCESS: Ethernet successfully initialized
+  */
+uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct)
+{
+  uint32_t tmpreg = 0;
+  __IO uint32_t i = 0;
+  RCC_ClocksTypeDef  rcc_clocks;
+  uint32_t hclk = 60000000;
+  __IO uint32_t timeout = 0;
+  /* Check the parameters */
+  /* MAC --------------------------*/
+  assert_param(IS_ETH_AUTONEGOTIATION(ETH_InitStruct->ETH_AutoNegotiation));
+  assert_param(IS_ETH_WATCHDOG(ETH_InitStruct->ETH_Watchdog));
+  assert_param(IS_ETH_JABBER(ETH_InitStruct->ETH_Jabber));
+  assert_param(IS_ETH_INTER_FRAME_GAP(ETH_InitStruct->ETH_InterFrameGap));
+  assert_param(IS_ETH_CARRIER_SENSE(ETH_InitStruct->ETH_CarrierSense));
+  assert_param(IS_ETH_SPEED(ETH_InitStruct->ETH_Speed));
+  assert_param(IS_ETH_RECEIVE_OWN(ETH_InitStruct->ETH_ReceiveOwn));
+  assert_param(IS_ETH_LOOPBACK_MODE(ETH_InitStruct->ETH_LoopbackMode));
+  assert_param(IS_ETH_DUPLEX_MODE(ETH_InitStruct->ETH_Mode));
+  assert_param(IS_ETH_CHECKSUM_OFFLOAD(ETH_InitStruct->ETH_ChecksumOffload));
+  assert_param(IS_ETH_RETRY_TRANSMISSION(ETH_InitStruct->ETH_RetryTransmission));
+  assert_param(IS_ETH_AUTOMATIC_PADCRC_STRIP(ETH_InitStruct->ETH_AutomaticPadCRCStrip));
+  assert_param(IS_ETH_BACKOFF_LIMIT(ETH_InitStruct->ETH_BackOffLimit));
+  assert_param(IS_ETH_DEFERRAL_CHECK(ETH_InitStruct->ETH_DeferralCheck));
+  assert_param(IS_ETH_RECEIVE_ALL(ETH_InitStruct->ETH_ReceiveAll));
+  assert_param(IS_ETH_SOURCE_ADDR_FILTER(ETH_InitStruct->ETH_SourceAddrFilter));
+  assert_param(IS_ETH_CONTROL_FRAMES(ETH_InitStruct->ETH_PassControlFrames));
+  assert_param(IS_ETH_BROADCAST_FRAMES_RECEPTION(ETH_InitStruct->ETH_BroadcastFramesReception));
+  assert_param(IS_ETH_DESTINATION_ADDR_FILTER(ETH_InitStruct->ETH_DestinationAddrFilter));
+//  assert_param(IS_ETH_PROMISCIOUS_MODE(ETH_InitStruct->ETH_PromiscuousMode));
+  assert_param(IS_ETH_MULTICAST_FRAMES_FILTER(ETH_InitStruct->ETH_MulticastFramesFilter));
+  assert_param(IS_ETH_UNICAST_FRAMES_FILTER(ETH_InitStruct->ETH_UnicastFramesFilter));
+  assert_param(IS_ETH_PAUSE_TIME(ETH_InitStruct->ETH_PauseTime));
+  assert_param(IS_ETH_ZEROQUANTA_PAUSE(ETH_InitStruct->ETH_ZeroQuantaPause));
+  assert_param(IS_ETH_PAUSE_LOW_THRESHOLD(ETH_InitStruct->ETH_PauseLowThreshold));
+  assert_param(IS_ETH_UNICAST_PAUSE_FRAME_DETECT(ETH_InitStruct->ETH_UnicastPauseFrameDetect));
+  assert_param(IS_ETH_RECEIVE_FLOWCONTROL(ETH_InitStruct->ETH_ReceiveFlowControl));
+  assert_param(IS_ETH_TRANSMIT_FLOWCONTROL(ETH_InitStruct->ETH_TransmitFlowControl));
+  assert_param(IS_ETH_VLAN_TAG_COMPARISON(ETH_InitStruct->ETH_VLANTagComparison));
+  assert_param(IS_ETH_VLAN_TAG_IDENTIFIER(ETH_InitStruct->ETH_VLANTagIdentifier));
+  /* DMA --------------------------*/
+  assert_param(IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame));
+  assert_param(IS_ETH_RECEIVE_STORE_FORWARD(ETH_InitStruct->ETH_ReceiveStoreForward));
+  assert_param(IS_ETH_FLUSH_RECEIVE_FRAME(ETH_InitStruct->ETH_FlushReceivedFrame));
+  assert_param(IS_ETH_TRANSMIT_STORE_FORWARD(ETH_InitStruct->ETH_TransmitStoreForward));
+  assert_param(IS_ETH_TRANSMIT_THRESHOLD_CONTROL(ETH_InitStruct->ETH_TransmitThresholdControl));
+  assert_param(IS_ETH_FORWARD_ERROR_FRAMES(ETH_InitStruct->ETH_ForwardErrorFrames));
+  assert_param(IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(ETH_InitStruct->ETH_ForwardUndersizedGoodFrames));
+  assert_param(IS_ETH_RECEIVE_THRESHOLD_CONTROL(ETH_InitStruct->ETH_ReceiveThresholdControl));
+  assert_param(IS_ETH_SECOND_FRAME_OPERATE(ETH_InitStruct->ETH_SecondFrameOperate));
+  assert_param(IS_ETH_ADDRESS_ALIGNED_BEATS(ETH_InitStruct->ETH_AddressAlignedBeats));
+  assert_param(IS_ETH_FIXED_BURST(ETH_InitStruct->ETH_FixedBurst));
+  assert_param(IS_ETH_RXDMA_BURST_LENGTH(ETH_InitStruct->ETH_RxDMABurstLength));
+  assert_param(IS_ETH_TXDMA_BURST_LENGTH(ETH_InitStruct->ETH_TxDMABurstLength));
+  assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength));
+  assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration));
+  /*-------------------------------- MAC Config ------------------------------*/
+  /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/
+  /* Get the ETHERNET MACMIIAR value */
+  tmpreg = ETH->MACMIIAR;
+  /* Clear CSR Clock Range CR[2:0] bits */
+  tmpreg &= MACMIIAR_CR_MASK;
+  /* Get hclk frequency value */
+  RCC_GetClocksFreq(&rcc_clocks);
+  hclk = rcc_clocks.HCLK_Frequency;
+
+  /* Set CR bits depending on hclk value */
+  if((hclk >= 20000000)&&(hclk < 35000000))
+  {
+    /* CSR Clock Range between 20-35 MHz */
+    tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16;
+  }
+  else if((hclk >= 35000000)&&(hclk < 60000000))
+  {
+    /* CSR Clock Range between 35-60 MHz */
+    tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26;
+  }
+  else if((hclk >= 60000000)&&(hclk < 100000000))
+  {
+    /* CSR Clock Range between 60-100 MHz */
+    tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42;
+  }
+  else if((hclk >= 100000000)&&(hclk < 150000000))
+  {
+    /* CSR Clock Range between 100-150 MHz */
+    tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62;
+  }
+  else /* ((hclk >= 150000000)&&(hclk <= 168000000)) */
+  {
+    /* CSR Clock Range between 150-168 MHz */
+    tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div102;
+  }
+
+  /* Write to ETHERNET MAC MIIAR: configure the ETHERNET CSR Clock Range */
+  ETH->MACMIIAR = (uint32_t)tmpreg;
+
+  /*------------------------ ETHERNET MACCR Configuration --------------------*/
+  /* Get the ETHERNET MACCR value */
+  tmpreg = ETH->MACCR;
+  /* Clear WD, PCE, PS, TE and RE bits */
+  tmpreg &= MACCR_CLEAR_MASK;
+  /* Set the WD bit according to ETH_Watchdog value */
+  /* Set the JD: bit according to ETH_Jabber value */
+  /* Set the IFG bit according to ETH_InterFrameGap value */
+  /* Set the DCRS bit according to ETH_CarrierSense value */
+  /* Set the FES bit according to ETH_Speed value */
+  /* Set the DO bit according to ETH_ReceiveOwn value */
+  /* Set the LM bit according to ETH_LoopbackMode value */
+  /* Set the DM bit according to ETH_Mode value */
+  /* Set the IPCO bit according to ETH_ChecksumOffload value */
+  /* Set the DR bit according to ETH_RetryTransmission value */
+  /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */
+  /* Set the BL bit according to ETH_BackOffLimit value */
+  /* Set the DC bit according to ETH_DeferralCheck value */
+  tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog |
+                  ETH_InitStruct->ETH_Jabber |
+                  ETH_InitStruct->ETH_InterFrameGap |
+                  ETH_InitStruct->ETH_CarrierSense |
+                  ETH_InitStruct->ETH_Speed |
+                  ETH_InitStruct->ETH_ReceiveOwn |
+                  ETH_InitStruct->ETH_LoopbackMode |
+                  ETH_InitStruct->ETH_Mode |
+                  ETH_InitStruct->ETH_ChecksumOffload |
+                  ETH_InitStruct->ETH_RetryTransmission |
+                  ETH_InitStruct->ETH_AutomaticPadCRCStrip |
+                  ETH_InitStruct->ETH_BackOffLimit |
+                  ETH_InitStruct->ETH_DeferralCheck);
+  /* Write to ETHERNET MACCR */
+  ETH->MACCR = (uint32_t)tmpreg;
+
+  /*----------------------- ETHERNET MACFFR Configuration --------------------*/
+  /* Set the RA bit according to ETH_ReceiveAll value */
+  /* Set the SAF and SAIF bits according to ETH_SourceAddrFilter value */
+  /* Set the PCF bit according to ETH_PassControlFrames value */
+  /* Set the DBF bit according to ETH_BroadcastFramesReception value */
+  /* Set the DAIF bit according to ETH_DestinationAddrFilter value */
+  /* Set the PR bit according to ETH_PromiscuousMode value */
+  /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */
+  /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */
+  /* Write to ETHERNET MACFFR */
+  ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll |
+                          ETH_InitStruct->ETH_SourceAddrFilter |
+                          ETH_InitStruct->ETH_PassControlFrames |
+                          ETH_InitStruct->ETH_BroadcastFramesReception |
+                          ETH_InitStruct->ETH_DestinationAddrFilter |
+                          ETH_InitStruct->ETH_PromiscuousMode |
+                          ETH_InitStruct->ETH_MulticastFramesFilter |
+                          ETH_InitStruct->ETH_UnicastFramesFilter);
+  /*--------------- ETHERNET MACHTHR and MACHTLR Configuration ---------------*/
+  /* Write to ETHERNET MACHTHR */
+  ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh;
+  /* Write to ETHERNET MACHTLR */
+  ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow;
+  /*----------------------- ETHERNET MACFCR Configuration --------------------*/
+  /* Get the ETHERNET MACFCR value */
+  tmpreg = ETH->MACFCR;
+  /* Clear xx bits */
+  tmpreg &= MACFCR_CLEAR_MASK;
+
+  /* Set the PT bit according to ETH_PauseTime value */
+  /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
+  /* Set the PLT bit according to ETH_PauseLowThreshold value */
+  /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
+  /* Set the RFE bit according to ETH_ReceiveFlowControl value */
+  /* Set the TFE bit according to ETH_TransmitFlowControl value */
+  tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) |
+                   ETH_InitStruct->ETH_ZeroQuantaPause |
+                   ETH_InitStruct->ETH_PauseLowThreshold |
+                   ETH_InitStruct->ETH_UnicastPauseFrameDetect |
+                   ETH_InitStruct->ETH_ReceiveFlowControl |
+                   ETH_InitStruct->ETH_TransmitFlowControl);
+  /* Write to ETHERNET MACFCR */
+  ETH->MACFCR = (uint32_t)tmpreg;
+  /*----------------------- ETHERNET MACVLANTR Configuration -----------------*/
+  /* Set the ETV bit according to ETH_VLANTagComparison value */
+  /* Set the VL bit according to ETH_VLANTagIdentifier value */
+  ETH->MACVLANTR = (uint32_t)(ETH_InitStruct->ETH_VLANTagComparison |
+                             ETH_InitStruct->ETH_VLANTagIdentifier);
+
+  /*-------------------------------- DMA Config ------------------------------*/
+  /*----------------------- ETHERNET DMAOMR Configuration --------------------*/
+  /* Get the ETHERNET DMAOMR value */
+  tmpreg = ETH->DMAOMR;
+  /* Clear xx bits */
+  tmpreg &= DMAOMR_CLEAR_MASK;
+
+  /* Set the DT bit according to ETH_DropTCPIPChecksumErrorFrame value */
+  /* Set the RSF bit according to ETH_ReceiveStoreForward value */
+  /* Set the DFF bit according to ETH_FlushReceivedFrame value */
+  /* Set the TSF bit according to ETH_TransmitStoreForward value */
+  /* Set the TTC bit according to ETH_TransmitThresholdControl value */
+  /* Set the FEF bit according to ETH_ForwardErrorFrames value */
+  /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
+  /* Set the RTC bit according to ETH_ReceiveThresholdControl value */
+  /* Set the OSF bit according to ETH_SecondFrameOperate value */
+  tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
+                  ETH_InitStruct->ETH_ReceiveStoreForward |
+                  ETH_InitStruct->ETH_FlushReceivedFrame |
+                  ETH_InitStruct->ETH_TransmitStoreForward |
+                  ETH_InitStruct->ETH_TransmitThresholdControl |
+                  ETH_InitStruct->ETH_ForwardErrorFrames |
+                  ETH_InitStruct->ETH_ForwardUndersizedGoodFrames |
+                  ETH_InitStruct->ETH_ReceiveThresholdControl |
+                  ETH_InitStruct->ETH_SecondFrameOperate);
+  /* Write to ETHERNET DMAOMR */
+  ETH->DMAOMR = (uint32_t)tmpreg;
+
+  /*----------------------- ETHERNET DMABMR Configuration --------------------*/
+  /* Set the AAL bit according to ETH_AddressAlignedBeats value */
+  /* Set the FB bit according to ETH_FixedBurst value */
+  /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
+  /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
+  /* Set the DSL bit according to ETH_DesciptorSkipLength value */
+  /* Set the PR and DA bits according to ETH_DMAArbitration value */
+  ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
+                          ETH_InitStruct->ETH_FixedBurst |
+                          ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */
+                          ETH_InitStruct->ETH_TxDMABurstLength |
+                         (ETH_InitStruct->ETH_DescriptorSkipLength << 2) |
+                          ETH_InitStruct->ETH_DMAArbitration |
+                          ETH_DMABMR_USP); /* Enable use of separate PBL for Rx and Tx */
+
+  #ifdef USE_ENHANCED_DMA_DESCRIPTORS
+    /* Enable the Enhanced DMA descriptors */
+    ETH->DMABMR |= ETH_DMABMR_EDE;
+  #endif /* USE_ENHANCED_DMA_DESCRIPTORS */
+
+  /* Return Ethernet configuration success */
+  return ETH_SUCCESS;
+}
+
+void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct)
+{
+  /* ETH_InitStruct members default value */
+  /*------------------------   MAC Configuration   ---------------------------*/
+
+  /* PHY Auto-negotiation enabled */
+  ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
+  /* MAC watchdog enabled: cuts-off long frame */
+  ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable;
+  /* MAC Jabber enabled in Half-duplex mode */
+  ETH_InitStruct->ETH_Jabber = ETH_Jabber_Enable;
+  /* Ethernet interframe gap set to 96 bits */
+  ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit;
+  /* Carrier Sense Enabled in Half-Duplex mode */
+  ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable;
+  /* PHY speed configured to 100Mbit/s */
+  ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
+  /* Receive own Frames in Half-Duplex mode enabled */
+  ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable;
+  /* MAC MII loopback disabled */
+  ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable;
+  /* Full-Duplex mode selected */
+  ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
+  /* IPv4 and TCP/UDP/ICMP frame Checksum Offload disabled */
+  ETH_InitStruct->ETH_ChecksumOffload = ETH_ChecksumOffload_Disable;
+  /* Retry Transmission enabled for half-duplex mode */
+  ETH_InitStruct->ETH_RetryTransmission = ETH_RetryTransmission_Enable;
+  /* Automatic PAD/CRC strip disabled*/
+  ETH_InitStruct->ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
+  /* half-duplex mode retransmission Backoff time_limit = 10 slot times*/
+  ETH_InitStruct->ETH_BackOffLimit = ETH_BackOffLimit_10;
+  /* half-duplex mode Deferral check disabled */
+  ETH_InitStruct->ETH_DeferralCheck = ETH_DeferralCheck_Disable;
+  /* Receive all frames disabled */
+  ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable;
+  /* Source address filtering (on the optional MAC addresses) disabled */
+  ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable;
+  /* Do not forward control frames that do not pass the address filtering */
+  ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;
+  /* Disable reception of Broadcast frames */
+  ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;
+  /* Normal Destination address filtering (not reverse addressing) */
+  ETH_InitStruct->ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal;
+  /* Promiscuous address filtering mode disabled */
+  ETH_InitStruct->ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
+  /* Perfect address filtering for multicast addresses */
+  ETH_InitStruct->ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
+  /* Perfect address filtering for unicast addresses */
+  ETH_InitStruct->ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
+  /* Initialize hash table high and low regs */
+  ETH_InitStruct->ETH_HashTableHigh = 0x0;
+  ETH_InitStruct->ETH_HashTableLow = 0x0;
+  /* Flow control config (flow control disabled)*/
+  ETH_InitStruct->ETH_PauseTime = 0x0;
+  ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable;
+  ETH_InitStruct->ETH_PauseLowThreshold = ETH_PauseLowThreshold_Minus4;
+  ETH_InitStruct->ETH_UnicastPauseFrameDetect = ETH_UnicastPauseFrameDetect_Disable;
+  ETH_InitStruct->ETH_ReceiveFlowControl = ETH_ReceiveFlowControl_Disable;
+  ETH_InitStruct->ETH_TransmitFlowControl = ETH_TransmitFlowControl_Disable;
+  /* VLANtag config (VLAN field not checked) */
+  ETH_InitStruct->ETH_VLANTagComparison = ETH_VLANTagComparison_16Bit;
+  ETH_InitStruct->ETH_VLANTagIdentifier = 0x0;
+
+  /*---------------------- DMA Configuration   -------------------------------*/
+
+  /* Drops frames with with TCP/IP checksum errors */
+  ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;
+  /* Store and forward mode enabled for receive */
+  ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
+  /* Flush received frame that created FIFO overflow */
+  ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable;
+  /* Store and forward mode enabled for transmit */
+  ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
+  /* Threshold TXFIFO level set to 64 bytes (used when threshold mode is enabled) */
+  ETH_InitStruct->ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes;
+  /* Disable forwarding frames with errors (short frames, CRC,...)*/
+  ETH_InitStruct->ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
+  /* Disable undersized good frames */
+  ETH_InitStruct->ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
+  /* Threshold RXFIFO level set to 64 bytes (used when Cut-through mode is enabled) */
+  ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes;
+  /* Disable Operate on second frame (transmit a second frame to FIFO without
+  waiting status of previous frame*/
+  ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable;
+  /* DMA works on 32-bit aligned start source and destinations addresses */
+  ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
+  /* Enabled Fixed Burst Mode (mix of INC4, INC8, INC16 and SINGLE DMA transactions */
+  ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Enable;
+  /* DMA transfer max burst length = 32 beats = 32 x 32bits */
+  ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
+  ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
+  /* DMA Ring mode skip length = 0 */
+  ETH_InitStruct->ETH_DescriptorSkipLength = 0x0;
+  /* Equal priority (round-robin) between transmit and receive DMA engines */
+  ETH_InitStruct->ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_1_1;
+}
+
+/**
+  * @brief  Enables ENET MAC and DMA reception/transmission
+  * @param  None
+  * @retval None
+  */
+void ETH_Start(void)
+{
+  /* Enable transmit state machine of the MAC for transmission on the MII */
+  ETH_MACTransmissionCmd(ENABLE);
+  /* Flush Transmit FIFO */
+  ETH_FlushTransmitFIFO();
+  /* Enable receive state machine of the MAC for reception from the MII */
+  ETH_MACReceptionCmd(ENABLE);
+
+  /* Start DMA transmission */
+  ETH_DMATransmissionCmd(ENABLE);
+  /* Start DMA reception */
+  ETH_DMAReceptionCmd(ENABLE);
+}
+
+/**
+  * @brief  Transmits a packet, from application buffer, pointed by ppkt.
+  * @param  ppkt: pointer to the application's packet buffer to transmit.
+  * @param  FrameLength: Tx Packet size.
+  * @retval ETH_ERROR: in case of Tx desc owned by DMA
+  *         ETH_SUCCESS: for correct transmission
+  */
+uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength)
+{
+  uint32_t offset = 0;
+
+  /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
+  if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET)
+  {
+    /* Return ERROR: OWN bit set */
+    return ETH_ERROR;
+  }
+
+  /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */
+  for(offset=0; offset<FrameLength; offset++)
+  {
+    (*(__IO uint8_t *)((DMATxDescToSet->Buffer1Addr) + offset)) = (*(ppkt + offset));
+  }
+
+  /* Setting the Frame Length: bits[12:0] */
+  DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1);
+  /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */
+  DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS;
+  /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
+  DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
+  /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
+  if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET)
+  {
+    /* Clear TBUS ETHERNET DMA flag */
+    ETH->DMASR = ETH_DMASR_TBUS;
+    /* Resume DMA transmission*/
+    ETH->DMATPDR = 0;
+  }
+
+  /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */
+  /* Chained Mode */
+  if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET)
+  {
+    /* Selects the next DMA Tx descriptor list for next buffer to send */
+    DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr);
+  }
+  else /* Ring Mode */
+  {
+    if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET)
+    {
+      /* Selects the first DMA Tx descriptor for next buffer to send: last Tx descriptor was used */
+      DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR);
+    }
+    else
+    {
+      /* Selects the next DMA Tx descriptor list for next buffer to send */
+      DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2));
+    }
+  }
+  /* Return SUCCESS */
+  return ETH_SUCCESS;
+}
+
+/**
+  * @brief  Receives a packet and copies it to memory pointed by ppkt.
+  * @param  ppkt: pointer to the application packet receive buffer.
+  * @retval ETH_ERROR: if there is error in reception
+  *         framelength: received packet size if packet reception is correct
+  */
+uint32_t ETH_HandleRxPkt(uint8_t *ppkt)
+{
+  uint32_t offset = 0, framelength = 0;
+  /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
+  if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET)
+  {
+    /* Return error: OWN bit set */
+    return ETH_ERROR;
+  }
+
+  if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) &&
+     ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) &&
+     ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET))
+  {
+    /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
+    framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARXDESC_FRAME_LENGTHSHIFT) - 4;
+    /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */
+    for(offset=0; offset<framelength; offset++)
+    {
+      (*(ppkt + offset)) = (*(__IO uint8_t *)((DMARxDescToGet->Buffer1Addr) + offset));
+    }
+  }
+  else
+  {
+    /* Return ERROR */
+    framelength = ETH_ERROR;
+  }
+  /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */
+  DMARxDescToGet->Status = ETH_DMARxDesc_OWN;
+
+  /* When Rx Buffer unavailable flag is set: clear it and resume reception */
+  if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET)
+  {
+    /* Clear RBUS ETHERNET DMA flag */
+    ETH->DMASR = ETH_DMASR_RBUS;
+    /* Resume DMA reception */
+    ETH->DMARPDR = 0;
+  }
+
+  /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */
+  /* Chained Mode */
+  if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET)
+  {
+    /* Selects the next DMA Rx descriptor list for next buffer to read */
+    DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
+  }
+  else /* Ring Mode */
+  {
+    if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET)
+    {
+      /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */
+      DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR);
+    }
+    else
+    {
+      /* Selects the next DMA Rx descriptor list for next buffer to read */
+      DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2));
+    }
+  }
+
+  /* Return Frame Length/ERROR */
+  return (framelength);
+}
+
+/**
+  * @brief  Get the size of received the received packet.
+  * @param  None
+  * @retval framelength: received packet size
+  */
+uint32_t ETH_GetRxPktSize(void)
+{
+  uint32_t frameLength = 0;
+  if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) &&
+     ((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) &&
+     ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) &&
+     ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET))
+  {
+    /* Get the size of the packet: including 4 bytes of the CRC */
+    frameLength = ETH_GetDMARxDescFrameLength(DMARxDescToGet);
+  }
+
+ /* Return Frame Length */
+ return frameLength;
+}
+
+/**
+  * @brief  Drop a Received packet (too small packet, etc...)
+  * @param  None
+  * @retval None
+  */
+void ETH_DropRxPkt(void)
+{
+  /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */
+  DMARxDescToGet->Status = ETH_DMARxDesc_OWN;
+  /* Chained Mode */
+  if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET)
+  {
+    /* Selects the next DMA Rx descriptor list for next buffer read */
+    DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
+  }
+  else /* Ring Mode */
+  {
+    if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET)
+    {
+      /* Selects the next DMA Rx descriptor list for next buffer read: this will
+         be the first Rx descriptor in this case */
+      DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR);
+    }
+    else
+    {
+      /* Selects the next DMA Rx descriptor list for next buffer read */
+      DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2));
+    }
+  }
+}
+
+#ifdef USE_ENHANCED_DMA_DESCRIPTORS
+/**
+  * @brief  Enables or disables the Enhanced descriptor structure.
+  * @param  NewState: new state of the Enhanced descriptor structure.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_EnhancedDescriptorCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable enhanced descriptor structure */
+    ETH->DMABMR |= ETH_DMABMR_EDE;
+  }
+  else
+  {
+    /* Disable enhanced descriptor structure */
+    ETH->DMABMR &= ~ETH_DMABMR_EDE;
+  }
+}
+#endif /* USE_ENHANCED_DMA_DESCRIPTORS */
+/*---------------------------------  PHY  ------------------------------------*/
+/**
+  * @brief  Read a PHY register
+  * @param PHYAddress: PHY device address, is the index of one of supported 32 PHY devices.
+  *   This parameter can be one of the following values: 0,..,31
+  * @param PHYReg: PHY register address, is the index of one of the 32 PHY register.
+  *   This parameter can be one of the following values:
+  *     @arg PHY_BCR: Tranceiver Basic Control Register
+  *     @arg PHY_BSR: Tranceiver Basic Status Register
+  *     @arg PHY_SR : Tranceiver Status Register
+  *     @arg More PHY register could be read depending on the used PHY
+  * @retval ETH_ERROR: in case of timeout
+  *         MAC MIIDR register value: Data read from the selected PHY register (correct read )
+  */
+uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg)
+{
+  uint32_t tmpreg = 0;
+__IO uint32_t timeout = 0;
+  /* Check the parameters */
+  assert_param(IS_ETH_PHY_ADDRESS(PHYAddress));
+  assert_param(IS_ETH_PHY_REG(PHYReg));
+
+  /* Get the ETHERNET MACMIIAR value */
+  tmpreg = ETH->MACMIIAR;
+  /* Keep only the CSR Clock Range CR[2:0] bits value */
+  tmpreg &= ~MACMIIAR_CR_MASK;
+  /* Prepare the MII address register value */
+  tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
+  tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR);      /* Set the PHY register address */
+  tmpreg &= ~ETH_MACMIIAR_MW;                              /* Set the read mode */
+  tmpreg |= ETH_MACMIIAR_MB;                               /* Set the MII Busy bit */
+  /* Write the result value into the MII Address register */
+  ETH->MACMIIAR = tmpreg;
+  /* Check for the Busy flag */
+  do
+  {
+    timeout++;
+    tmpreg = ETH->MACMIIAR;
+  } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
+  /* Return ERROR in case of timeout */
+  if(timeout == PHY_READ_TO)
+  {
+    return (uint16_t)ETH_ERROR;
+  }
+
+  /* Return data register value */
+  return (uint16_t)(ETH->MACMIIDR);
+}
+
+/**
+  * @brief  Write to a PHY register
+  * @param PHYAddress: PHY device address, is the index of one of supported 32 PHY devices.
+  *   This parameter can be one of the following values: 0,..,31
+  * @param PHYReg: PHY register address, is the index of one of the 32 PHY register.
+  *   This parameter can be one of the following values:
+  *     @arg PHY_BCR    : Tranceiver Control Register
+  *     @arg More PHY register could be written depending on the used PHY
+  * @param  PHYValue: the value to write
+  * @retval ETH_ERROR: in case of timeout
+  *         ETH_SUCCESS: for correct write
+  */
+uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue)
+{
+  uint32_t tmpreg = 0;
+  __IO uint32_t timeout = 0;
+  /* Check the parameters */
+  assert_param(IS_ETH_PHY_ADDRESS(PHYAddress));
+  assert_param(IS_ETH_PHY_REG(PHYReg));
+
+  /* Get the ETHERNET MACMIIAR value */
+  tmpreg = ETH->MACMIIAR;
+  /* Keep only the CSR Clock Range CR[2:0] bits value */
+  tmpreg &= ~MACMIIAR_CR_MASK;
+  /* Prepare the MII register address value */
+  tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */
+  tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR);      /* Set the PHY register address */
+  tmpreg |= ETH_MACMIIAR_MW;                               /* Set the write mode */
+  tmpreg |= ETH_MACMIIAR_MB;                               /* Set the MII Busy bit */
+  /* Give the value to the MII data register */
+  ETH->MACMIIDR = PHYValue;
+  /* Write the result value into the MII Address register */
+  ETH->MACMIIAR = tmpreg;
+  /* Check for the Busy flag */
+  do
+  {
+    timeout++;
+    tmpreg = ETH->MACMIIAR;
+  } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO));
+  /* Return ERROR in case of timeout */
+  if(timeout == PHY_WRITE_TO)
+  {
+    return ETH_ERROR;
+  }
+
+  /* Return SUCCESS */
+  return ETH_SUCCESS;
+}
+
+/**
+  * @brief  Enables or disables the PHY loopBack mode.
+  * @Note: Don't be confused with ETH_MACLoopBackCmd function which enables internal
+  *  loopback at MII level
+  * @param  PHYAddress: PHY device address, is the index of one of supported 32 PHY devices.
+  *   This parameter can be one of the following values:
+  * @param  NewState: new state of the PHY loopBack mode.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval ETH_ERROR: in case of bad PHY configuration
+  *         ETH_SUCCESS: for correct PHY configuration
+  */
+uint32_t ETH_PHYLoopBackCmd(uint16_t PHYAddress, FunctionalState NewState)
+{
+  uint16_t tmpreg = 0;
+  /* Check the parameters */
+  assert_param(IS_ETH_PHY_ADDRESS(PHYAddress));
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  /* Get the PHY configuration to update it */
+  tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_BCR);
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the PHY loopback mode */
+    tmpreg |= PHY_Loopback;
+  }
+  else
+  {
+    /* Disable the PHY loopback mode: normal mode */
+    tmpreg &= (uint16_t)(~(uint16_t)PHY_Loopback);
+  }
+  /* Update the PHY control register with the new configuration */
+  if(ETH_WritePHYRegister(PHYAddress, PHY_BCR, tmpreg) != (uint32_t)RESET)
+  {
+    return ETH_SUCCESS;
+  }
+  else
+  {
+    /* Return SUCCESS */
+    return ETH_ERROR;
+  }
+}
+
+/*---------------------------------  MAC  ------------------------------------*/
+/**
+  * @brief  Enables or disables the MAC transmission.
+  * @param  NewState: new state of the MAC transmission.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_MACTransmissionCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the MAC transmission */
+    ETH->MACCR |= ETH_MACCR_TE;
+  }
+  else
+  {
+    /* Disable the MAC transmission */
+    ETH->MACCR &= ~ETH_MACCR_TE;
+  }
+}
+
+/**
+  * @brief  Enables or disables the MAC reception.
+  * @param  NewState: new state of the MAC reception.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_MACReceptionCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the MAC reception */
+    ETH->MACCR |= ETH_MACCR_RE;
+  }
+  else
+  {
+    /* Disable the MAC reception */
+    ETH->MACCR &= ~ETH_MACCR_RE;
+  }
+}
+
+/**
+  * @brief  Checks whether the ETHERNET flow control busy bit is set or not.
+  * @param  None
+  * @retval The new state of flow control busy status bit (SET or RESET).
+  */
+FlagStatus ETH_GetFlowControlBusyStatus(void)
+{
+  FlagStatus bitstatus = RESET;
+  /* The Flow Control register should not be written to until this bit is cleared */
+  if ((ETH->MACFCR & ETH_MACFCR_FCBBPA) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Initiate a Pause Control Frame (Full-duplex only).
+  * @param  None
+  * @retval None
+  */
+void ETH_InitiatePauseControlFrame(void)
+{
+  /* When Set In full duplex MAC initiates pause control frame */
+  ETH->MACFCR |= ETH_MACFCR_FCBBPA;
+}
+
+/**
+  * @brief  Enables or disables the MAC BackPressure operation activation (Half-duplex only).
+  * @param  NewState: new state of the MAC BackPressure operation activation.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_BackPressureActivationCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Activate the MAC BackPressure operation */
+    /* In Half duplex: during backpressure, when the MAC receives a new frame,
+    the transmitter starts sending a JAM pattern resulting in a collision */
+    ETH->MACFCR |= ETH_MACFCR_FCBBPA;
+  }
+  else
+  {
+    /* Desactivate the MAC BackPressure operation */
+    ETH->MACFCR &= ~ETH_MACFCR_FCBBPA;
+  }
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET MAC flag is set or not.
+  * @param  ETH_MAC_FLAG: specifies the flag to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MAC_FLAG_TST  : Time stamp trigger flag
+  *     @arg ETH_MAC_FLAG_MMCT : MMC transmit flag
+  *     @arg ETH_MAC_FLAG_MMCR : MMC receive flag
+  *     @arg ETH_MAC_FLAG_MMC  : MMC flag
+  *     @arg ETH_MAC_FLAG_PMT  : PMT flag
+  * @retval The new state of ETHERNET MAC flag (SET or RESET).
+  */
+FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG)
+{
+  FlagStatus bitstatus = RESET;
+  /* Check the parameters */
+  assert_param(IS_ETH_MAC_GET_FLAG(ETH_MAC_FLAG));
+  if ((ETH->MACSR & ETH_MAC_FLAG) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET MAC interrupt has occurred or not.
+  * @param  ETH_MAC_IT: specifies the interrupt source to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MAC_IT_TST   : Time stamp trigger interrupt
+  *     @arg ETH_MAC_IT_MMCT : MMC transmit interrupt
+  *     @arg ETH_MAC_IT_MMCR : MMC receive interrupt
+  *     @arg ETH_MAC_IT_MMC  : MMC interrupt
+  *     @arg ETH_MAC_IT_PMT  : PMT interrupt
+  * @retval The new state of ETHERNET MAC interrupt (SET or RESET).
+  */
+ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT)
+{
+  ITStatus bitstatus = RESET;
+  /* Check the parameters */
+  assert_param(IS_ETH_MAC_GET_IT(ETH_MAC_IT));
+  if ((ETH->MACSR & ETH_MAC_IT) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Enables or disables the specified ETHERNET MAC interrupts.
+  * @param  ETH_MAC_IT: specifies the ETHERNET MAC interrupt sources to be
+  *   enabled or disabled.
+  *   This parameter can be any combination of the following values:
+  *     @arg ETH_MAC_IT_TST : Time stamp trigger interrupt
+  *     @arg ETH_MAC_IT_PMT : PMT interrupt
+  * @param  NewState: new state of the specified ETHERNET MAC interrupts.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_MAC_IT(ETH_MAC_IT));
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected ETHERNET MAC interrupts */
+    ETH->MACIMR &= (~(uint32_t)ETH_MAC_IT);
+  }
+  else
+  {
+    /* Disable the selected ETHERNET MAC interrupts */
+    ETH->MACIMR |= ETH_MAC_IT;
+  }
+}
+
+/**
+  * @brief  configures the selected MAC address.
+  * @param  MacAddr: The MAC addres to configure.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MAC_Address0 : MAC Address0
+  *     @arg ETH_MAC_Address1 : MAC Address1
+  *     @arg ETH_MAC_Address2 : MAC Address2
+  *     @arg ETH_MAC_Address3 : MAC Address3
+  * @param  Addr: Pointer on MAC address buffer data (6 bytes).
+  * @retval None
+  */
+void ETH_MACAddressConfig(uint32_t MacAddr, uint8_t *Addr)
+{
+  uint32_t tmpreg;
+  /* Check the parameters */
+  assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr));
+
+  /* Calculate the selectecd MAC address high register */
+  tmpreg = ((uint32_t)Addr[5] << 8) | (uint32_t)Addr[4];
+  /* Load the selectecd MAC address high register */
+  (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) = tmpreg;
+  /* Calculate the selectecd MAC address low register */
+  tmpreg = ((uint32_t)Addr[3] << 24) | ((uint32_t)Addr[2] << 16) | ((uint32_t)Addr[1] << 8) | Addr[0];
+
+  /* Load the selectecd MAC address low register */
+  (*(__IO uint32_t *) (ETH_MAC_ADDR_LBASE + MacAddr)) = tmpreg;
+}
+
+/**
+  * @brief  Get the selected MAC address.
+  * @param  MacAddr: The MAC addres to return.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MAC_Address0 : MAC Address0
+  *     @arg ETH_MAC_Address1 : MAC Address1
+  *     @arg ETH_MAC_Address2 : MAC Address2
+  *     @arg ETH_MAC_Address3 : MAC Address3
+  * @param  Addr: Pointer on MAC address buffer data (6 bytes).
+  * @retval None
+  */
+void ETH_GetMACAddress(uint32_t MacAddr, uint8_t *Addr)
+{
+  uint32_t tmpreg;
+  /* Check the parameters */
+  assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr));
+
+  /* Get the selectecd MAC address high register */
+  tmpreg =(*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr));
+
+  /* Calculate the selectecd MAC address buffer */
+  Addr[5] = ((tmpreg >> 8) & (uint8_t)0xFF);
+  Addr[4] = (tmpreg & (uint8_t)0xFF);
+  /* Load the selectecd MAC address low register */
+  tmpreg =(*(__IO uint32_t *) (ETH_MAC_ADDR_LBASE + MacAddr));
+  /* Calculate the selectecd MAC address buffer */
+  Addr[3] = ((tmpreg >> 24) & (uint8_t)0xFF);
+  Addr[2] = ((tmpreg >> 16) & (uint8_t)0xFF);
+  Addr[1] = ((tmpreg >> 8 ) & (uint8_t)0xFF);
+  Addr[0] = (tmpreg & (uint8_t)0xFF);
+}
+
+/**
+  * @brief  Enables or disables the Address filter module uses the specified
+  *   ETHERNET MAC address for perfect filtering
+  * @param  MacAddr: specifies the ETHERNET MAC address to be used for prfect filtering.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MAC_Address1 : MAC Address1
+  *     @arg ETH_MAC_Address2 : MAC Address2
+  *     @arg ETH_MAC_Address3 : MAC Address3
+  * @param  NewState: new state of the specified ETHERNET MAC address use.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_MAC_ADDRESS123(MacAddr));
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected ETHERNET MAC address for perfect filtering */
+    (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) |= ETH_MACA1HR_AE;
+  }
+  else
+  {
+    /* Disable the selected ETHERNET MAC address for perfect filtering */
+    (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_AE);
+  }
+}
+
+/**
+  * @brief  Set the filter type for the specified ETHERNET MAC address
+  * @param  MacAddr: specifies the ETHERNET MAC address
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MAC_Address1 : MAC Address1
+  *     @arg ETH_MAC_Address2 : MAC Address2
+  *     @arg ETH_MAC_Address3 : MAC Address3
+  * @param  Filter: specifies the used frame received field for comparaison
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MAC_AddressFilter_SA : MAC Address is used to compare with the
+  *                                     SA fields of the received frame.
+  *     @arg ETH_MAC_AddressFilter_DA : MAC Address is used to compare with the
+  *                                     DA fields of the received frame.
+  * @retval None
+  */
+void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_MAC_ADDRESS123(MacAddr));
+  assert_param(IS_ETH_MAC_ADDRESS_FILTER(Filter));
+
+  if (Filter != ETH_MAC_AddressFilter_DA)
+  {
+    /* The selected ETHERNET MAC address is used to compare with the SA fields of the
+       received frame. */
+    (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) |= ETH_MACA1HR_SA;
+  }
+  else
+  {
+    /* The selected ETHERNET MAC address is used to compare with the DA fields of the
+       received frame. */
+    (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_SA);
+  }
+}
+
+/**
+  * @brief  Set the filter type for the specified ETHERNET MAC address
+  * @param  MacAddr: specifies the ETHERNET MAC address
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MAC_Address1 : MAC Address1
+  *     @arg ETH_MAC_Address2 : MAC Address2
+  *     @arg ETH_MAC_Address3 : MAC Address3
+  * @param  MaskByte: specifies the used address bytes for comparaison
+  *   This parameter can be any combination of the following values:
+  *     @arg ETH_MAC_AddressMask_Byte6 : Mask MAC Address high reg bits [15:8].
+  *     @arg ETH_MAC_AddressMask_Byte5 : Mask MAC Address high reg bits [7:0].
+  *     @arg ETH_MAC_AddressMask_Byte4 : Mask MAC Address low reg bits [31:24].
+  *     @arg ETH_MAC_AddressMask_Byte3 : Mask MAC Address low reg bits [23:16].
+  *     @arg ETH_MAC_AddressMask_Byte2 : Mask MAC Address low reg bits [15:8].
+  *     @arg ETH_MAC_AddressMask_Byte1 : Mask MAC Address low reg bits [7:0].
+  * @retval None
+  */
+void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_MAC_ADDRESS123(MacAddr));
+  assert_param(IS_ETH_MAC_ADDRESS_MASK(MaskByte));
+
+  /* Clear MBC bits in the selected MAC address  high register */
+  (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_MBC);
+  /* Set the selected Filetr mask bytes */
+  (*(__IO uint32_t *) (ETH_MAC_ADDR_HBASE + MacAddr)) |= MaskByte;
+}
+/*------------------------  DMA Tx/Rx Desciptors -----------------------------*/
+
+/**
+  * @brief  Initializes the DMA Tx descriptors in chain mode.
+  * @param  DMATxDescTab: Pointer on the first Tx desc list
+  * @param  TxBuff: Pointer on the first TxBuffer list
+  * @param  TxBuffCount: Number of the used Tx desc in the list
+  * @retval None
+  */
+void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount)
+{
+  uint32_t i = 0;
+  ETH_DMADESCTypeDef *DMATxDesc;
+
+  /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
+  DMATxDescToSet = DMATxDescTab;
+  /* Fill each DMATxDesc descriptor with the right values */
+  for(i=0; i < TxBuffCount; i++)
+  {
+    /* Get the pointer on the ith member of the Tx Desc list */
+    DMATxDesc = DMATxDescTab + i;
+    /* Set Second Address Chained bit */
+    DMATxDesc->Status = ETH_DMATxDesc_TCH;
+
+    /* Set Buffer1 address pointer */
+    DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]);
+
+    /* Initialize the next descriptor with the Next Desciptor Polling Enable */
+    if(i < (TxBuffCount-1))
+    {
+      /* Set next descriptor address register with next descriptor base address */
+      DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1);
+    }
+    else
+    {
+      /* For last descriptor, set next descriptor address register equal to the first descriptor base address */
+      DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab;
+    }
+  }
+
+  /* Set Transmit Desciptor List Address Register */
+  ETH->DMATDLAR = (uint32_t) DMATxDescTab;
+}
+
+/**
+  * @brief  Initializes the DMA Tx descriptors in ring mode.
+  * @param  DMATxDescTab: Pointer on the first Tx desc list
+  * @param  TxBuff1: Pointer on the first TxBuffer1 list
+  * @param  TxBuff2: Pointer on the first TxBuffer2 list
+  * @param  TxBuffCount: Number of the used Tx desc in the list
+  *   Note: see decriptor skip length defined in ETH_DMA_InitStruct
+  *   for the number of Words to skip between two unchained descriptors.
+  * @retval None
+  */
+void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff1, uint8_t *TxBuff2, uint32_t TxBuffCount)
+{
+  uint32_t i = 0;
+  ETH_DMADESCTypeDef *DMATxDesc;
+
+  /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */
+  DMATxDescToSet = DMATxDescTab;
+  /* Fill each DMATxDesc descriptor with the right values */
+  for(i=0; i < TxBuffCount; i++)
+  {
+    /* Get the pointer on the ith member of the Tx Desc list */
+    DMATxDesc = DMATxDescTab + i;
+    /* Set Buffer1 address pointer */
+    DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff1[i*ETH_MAX_PACKET_SIZE]);
+
+    /* Set Buffer2 address pointer */
+    DMATxDesc->Buffer2NextDescAddr = (uint32_t)(&TxBuff2[i*ETH_MAX_PACKET_SIZE]);
+
+    /* Set Transmit End of Ring bit for last descriptor: The DMA returns to the base
+       address of the list, creating a Desciptor Ring */
+    if(i == (TxBuffCount-1))
+    {
+      /* Set Transmit End of Ring bit */
+      DMATxDesc->Status = ETH_DMATxDesc_TER;
+    }
+  }
+
+  /* Set Transmit Desciptor List Address Register */
+  ETH->DMATDLAR =  (uint32_t) DMATxDescTab;
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET DMA Tx Desc flag is set or not.
+  * @param  DMATxDesc: pointer on a DMA Tx descriptor
+  * @param  ETH_DMATxDescFlag: specifies the flag to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_DMATxDesc_OWN : OWN bit: descriptor is owned by DMA engine
+  *     @arg ETH_DMATxDesc_IC  : Interrupt on completetion
+  *     @arg ETH_DMATxDesc_LS  : Last Segment
+  *     @arg ETH_DMATxDesc_FS  : First Segment
+  *     @arg ETH_DMATxDesc_DC  : Disable CRC
+  *     @arg ETH_DMATxDesc_DP  : Disable Pad
+  *     @arg ETH_DMATxDesc_TTSE: Transmit Time Stamp Enable
+  *     @arg ETH_DMATxDesc_CIC : Checksum insertion control
+  *     @arg ETH_DMATxDesc_TER : Transmit End of Ring
+  *     @arg ETH_DMATxDesc_TCH : Second Address Chained
+  *     @arg ETH_DMATxDesc_TTSS: Tx Time Stamp Status
+  *     @arg ETH_DMATxDesc_IHE : IP Header Error
+  *     @arg ETH_DMATxDesc_ES  : Error summary
+  *     @arg ETH_DMATxDesc_JT  : Jabber Timeout
+  *     @arg ETH_DMATxDesc_FF  : Frame Flushed: DMA/MTL flushed the frame due to SW flush
+  *     @arg ETH_DMATxDesc_PCE : Payload Checksum Error
+  *     @arg ETH_DMATxDesc_LCA : Loss of Carrier: carrier lost during tramsmission
+  *     @arg ETH_DMATxDesc_NC  : No Carrier: no carrier signal from the tranceiver
+  *     @arg ETH_DMATxDesc_LCO : Late Collision: transmission aborted due to collision
+  *     @arg ETH_DMATxDesc_EC  : Excessive Collision: transmission aborted after 16 collisions
+  *     @arg ETH_DMATxDesc_VF  : VLAN Frame
+  *     @arg ETH_DMATxDesc_CC  : Collision Count
+  *     @arg ETH_DMATxDesc_ED  : Excessive Deferral
+  *     @arg ETH_DMATxDesc_UF  : Underflow Error: late data arrival from the memory
+  *     @arg ETH_DMATxDesc_DB  : Deferred Bit
+  * @retval The new state of ETH_DMATxDescFlag (SET or RESET).
+  */
+FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag)
+{
+  FlagStatus bitstatus = RESET;
+  /* Check the parameters */
+  assert_param(IS_ETH_DMATxDESC_GET_FLAG(ETH_DMATxDescFlag));
+
+  if ((DMATxDesc->Status & ETH_DMATxDescFlag) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Returns the specified ETHERNET DMA Tx Desc collision count.
+  * @param  DMATxDesc: pointer on a DMA Tx descriptor
+  * @retval The Transmit descriptor collision counter value.
+  */
+uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc)
+{
+  /* Return the Receive descriptor frame length */
+  return ((DMATxDesc->Status & ETH_DMATxDesc_CC) >> ETH_DMATXDESC_COLLISION_COUNTSHIFT);
+}
+
+/**
+  * @brief  Set the specified DMA Tx Desc Own bit.
+  * @param  DMATxDesc: Pointer on a Tx desc
+  * @retval None
+  */
+void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc)
+{
+  /* Set the DMA Tx Desc Own bit */
+  DMATxDesc->Status |= ETH_DMATxDesc_OWN;
+}
+
+/**
+  * @brief  Enables or disables the specified DMA Tx Desc Transmit interrupt.
+  * @param  DMATxDesc: Pointer on a Tx desc
+  * @param  NewState: new state of the DMA Tx Desc transmit interrupt.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the DMA Tx Desc Transmit interrupt */
+    DMATxDesc->Status |= ETH_DMATxDesc_IC;
+  }
+  else
+  {
+    /* Disable the DMA Tx Desc Transmit interrupt */
+    DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_IC);
+  }
+}
+
+/**
+  * @brief  Enables or disables the specified DMA Tx Desc Transmit interrupt.
+  * @param  DMATxDesc: Pointer on a Tx desc
+  * @param  DMATxDesc_FrameSegment: specifies is the actual Tx desc contain last or first segment.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_DMATxDesc_LastSegment  : actual Tx desc contain last segment
+  *     @arg ETH_DMATxDesc_FirstSegment : actual Tx desc contain first segment
+  * @retval None
+  */
+void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_DMA_TXDESC_SEGMENT(DMATxDesc_FrameSegment));
+
+  /* Selects the DMA Tx Desc Frame segment */
+  DMATxDesc->Status |= DMATxDesc_FrameSegment;
+}
+
+/**
+  * @brief  Selects the specified ETHERNET DMA Tx Desc Checksum Insertion.
+  * @param  DMATxDesc: pointer on a DMA Tx descriptor
+  * @param  DMATxDesc_Checksum: specifies is the DMA Tx desc checksum insertion.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_DMATxDesc_ChecksumByPass : Checksum bypass
+  *     @arg ETH_DMATxDesc_ChecksumIPV4Header : IPv4 header checksum
+  *     @arg ETH_DMATxDesc_ChecksumTCPUDPICMPSegment : TCP/UDP/ICMP checksum. Pseudo header checksum is assumed to be present
+  *     @arg ETH_DMATxDesc_ChecksumTCPUDPICMPFull : TCP/UDP/ICMP checksum fully in hardware including pseudo header
+  * @retval None
+  */
+void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_DMA_TXDESC_CHECKSUM(DMATxDesc_Checksum));
+
+  /* Set the selected DMA Tx desc checksum insertion control */
+  DMATxDesc->Status |= DMATxDesc_Checksum;
+}
+
+/**
+  * @brief  Enables or disables the DMA Tx Desc CRC.
+  * @param  DMATxDesc: pointer on a DMA Tx descriptor
+  * @param  NewState: new state of the specified DMA Tx Desc CRC.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected DMA Tx Desc CRC */
+    DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DC);
+  }
+  else
+  {
+    /* Disable the selected DMA Tx Desc CRC */
+    DMATxDesc->Status |= ETH_DMATxDesc_DC;
+  }
+}
+
+/**
+  * @brief  Enables or disables the DMA Tx Desc end of ring.
+  * @param  DMATxDesc: pointer on a DMA Tx descriptor
+  * @param  NewState: new state of the specified DMA Tx Desc end of ring.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected DMA Tx Desc end of ring */
+    DMATxDesc->Status |= ETH_DMATxDesc_TER;
+  }
+  else
+  {
+    /* Disable the selected DMA Tx Desc end of ring */
+    DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_TER);
+  }
+}
+
+/**
+  * @brief  Enables or disables the DMA Tx Desc second address chained.
+  * @param  DMATxDesc: pointer on a DMA Tx descriptor
+  * @param  NewState: new state of the specified DMA Tx Desc second address chained.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected DMA Tx Desc second address chained */
+    DMATxDesc->Status |= ETH_DMATxDesc_TCH;
+  }
+  else
+  {
+    /* Disable the selected DMA Tx Desc second address chained */
+    DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TCH);
+  }
+}
+
+/**
+  * @brief  Enables or disables the DMA Tx Desc padding for frame shorter than 64 bytes.
+  * @param  DMATxDesc: pointer on a DMA Tx descriptor
+  * @param  NewState: new state of the specified DMA Tx Desc padding for frame shorter than 64 bytes.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected DMA Tx Desc padding for frame shorter than 64 bytes */
+    DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DP);
+  }
+  else
+  {
+    /* Disable the selected DMA Tx Desc padding for frame shorter than 64 bytes*/
+    DMATxDesc->Status |= ETH_DMATxDesc_DP;
+  }
+}
+
+/**
+  * @brief  Enables or disables the DMA Tx Desc time stamp.
+  * @param  DMATxDesc: pointer on a DMA Tx descriptor
+  * @param  NewState: new state of the specified DMA Tx Desc time stamp.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected DMA Tx Desc time stamp */
+    DMATxDesc->Status |= ETH_DMATxDesc_TTSE;
+  }
+  else
+  {
+    /* Disable the selected DMA Tx Desc time stamp */
+    DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TTSE);
+  }
+}
+
+/**
+  * @brief  configures the specified DMA Tx Desc buffer1 and buffer2 sizes.
+  * @param  DMATxDesc: Pointer on a Tx desc
+  * @param  BufferSize1: specifies the Tx desc buffer1 size.
+  * @param  BufferSize2: specifies the Tx desc buffer2 size (put "0" if not used).
+  * @retval None
+  */
+void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize1));
+  assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize2));
+
+  /* Set the DMA Tx Desc buffer1 and buffer2 sizes values */
+  DMATxDesc->ControlBufferSize |= (BufferSize1 | (BufferSize2 << ETH_DMATXDESC_BUFFER2_SIZESHIFT));
+}
+
+/**
+  * @brief  Initializes the DMA Rx descriptors in chain mode.
+  * @param  DMARxDescTab: Pointer on the first Rx desc list
+  * @param  RxBuff: Pointer on the first RxBuffer list
+  * @param  RxBuffCount: Number of the used Rx desc in the list
+  * @retval None
+  */
+void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount)
+{
+  uint32_t i = 0;
+  ETH_DMADESCTypeDef *DMARxDesc;
+
+  /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
+  DMARxDescToGet = DMARxDescTab;
+  /* Fill each DMARxDesc descriptor with the right values */
+  for(i=0; i < RxBuffCount; i++)
+  {
+    /* Get the pointer on the ith member of the Rx Desc list */
+    DMARxDesc = DMARxDescTab+i;
+    /* Set Own bit of the Rx descriptor Status */
+    DMARxDesc->Status = ETH_DMARxDesc_OWN;
+
+    /* Set Buffer1 size and Second Address Chained bit */
+    DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE;
+    /* Set Buffer1 address pointer */
+    DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]);
+
+    /* Initialize the next descriptor with the Next Desciptor Polling Enable */
+    if(i < (RxBuffCount-1))
+    {
+      /* Set next descriptor address register with next descriptor base address */
+      DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1);
+    }
+    else
+    {
+      /* For last descriptor, set next descriptor address register equal to the first descriptor base address */
+      DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab);
+    }
+  }
+
+  /* Set Receive Desciptor List Address Register */
+  ETH->DMARDLAR = (uint32_t) DMARxDescTab;
+}
+
+/**
+  * @brief  Initializes the DMA Rx descriptors in ring mode.
+  * @param  DMARxDescTab: Pointer on the first Rx desc list
+  * @param  RxBuff1: Pointer on the first RxBuffer1 list
+  * @param  RxBuff2: Pointer on the first RxBuffer2 list
+  * @param  RxBuffCount: Number of the used Rx desc in the list
+  *   Note: see decriptor skip length defined in ETH_DMA_InitStruct
+  *   for the number of Words to skip between two unchained descriptors.
+  * @retval None
+  */
+void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff1, uint8_t *RxBuff2, uint32_t RxBuffCount)
+{
+  uint32_t i = 0;
+  ETH_DMADESCTypeDef *DMARxDesc;
+  /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */
+  DMARxDescToGet = DMARxDescTab;
+  /* Fill each DMARxDesc descriptor with the right values */
+  for(i=0; i < RxBuffCount; i++)
+  {
+    /* Get the pointer on the ith member of the Rx Desc list */
+    DMARxDesc = DMARxDescTab+i;
+    /* Set Own bit of the Rx descriptor Status */
+    DMARxDesc->Status = ETH_DMARxDesc_OWN;
+    /* Set Buffer1 size */
+    DMARxDesc->ControlBufferSize = ETH_MAX_PACKET_SIZE;
+    /* Set Buffer1 address pointer */
+    DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff1[i*ETH_MAX_PACKET_SIZE]);
+
+    /* Set Buffer2 address pointer */
+    DMARxDesc->Buffer2NextDescAddr = (uint32_t)(&RxBuff2[i*ETH_MAX_PACKET_SIZE]);
+
+    /* Set Receive End of Ring bit for last descriptor: The DMA returns to the base
+       address of the list, creating a Desciptor Ring */
+    if(i == (RxBuffCount-1))
+    {
+      /* Set Receive End of Ring bit */
+      DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER;
+    }
+  }
+
+  /* Set Receive Desciptor List Address Register */
+  ETH->DMARDLAR = (uint32_t) DMARxDescTab;
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET Rx Desc flag is set or not.
+  * @param  DMARxDesc: pointer on a DMA Rx descriptor
+  * @param  ETH_DMARxDescFlag: specifies the flag to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_DMARxDesc_OWN:         OWN bit: descriptor is owned by DMA engine
+  *     @arg ETH_DMARxDesc_AFM:         DA Filter Fail for the rx frame
+  *     @arg ETH_DMARxDesc_ES:          Error summary
+  *     @arg ETH_DMARxDesc_DE:          Desciptor error: no more descriptors for receive frame
+  *     @arg ETH_DMARxDesc_SAF:         SA Filter Fail for the received frame
+  *     @arg ETH_DMARxDesc_LE:          Frame size not matching with length field
+  *     @arg ETH_DMARxDesc_OE:          Overflow Error: Frame was damaged due to buffer overflow
+  *     @arg ETH_DMARxDesc_VLAN:        VLAN Tag: received frame is a VLAN frame
+  *     @arg ETH_DMARxDesc_FS:          First descriptor of the frame
+  *     @arg ETH_DMARxDesc_LS:          Last descriptor of the frame
+  *     @arg ETH_DMARxDesc_IPV4HCE:     IPC Checksum Error/Giant Frame: Rx Ipv4 header checksum error
+  *     @arg ETH_DMARxDesc_LC:          Late collision occurred during reception
+  *     @arg ETH_DMARxDesc_FT:          Frame type - Ethernet, otherwise 802.3
+  *     @arg ETH_DMARxDesc_RWT:         Receive Watchdog Timeout: watchdog timer expired during reception
+  *     @arg ETH_DMARxDesc_RE:          Receive error: error reported by MII interface
+  *     @arg ETH_DMARxDesc_DE:          Dribble bit error: frame contains non int multiple of 8 bits
+  *     @arg ETH_DMARxDesc_CE:          CRC error
+  *     @arg ETH_DMARxDesc_MAMPCE:      Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error
+  * @retval The new state of ETH_DMARxDescFlag (SET or RESET).
+  */
+FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag)
+{
+  FlagStatus bitstatus = RESET;
+  /* Check the parameters */
+  assert_param(IS_ETH_DMARxDESC_GET_FLAG(ETH_DMARxDescFlag));
+  if ((DMARxDesc->Status & ETH_DMARxDescFlag) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+#ifdef USE_ENHANCED_DMA_DESCRIPTORS
+/**
+  * @brief  Checks whether the specified ETHERNET PTP Rx Desc extended flag is set or not.
+  * @param  DMAPTPRxDesc: pointer on a DMA PTP Rx descriptor
+  * @param  ETH_DMAPTPRxDescFlag: specifies the extended flag to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_DMAPTPRxDesc_PTPV:   PTP version
+  *     @arg ETH_DMAPTPRxDesc_PTPFT:  PTP frame type
+  *     @arg ETH_DMAPTPRxDesc_PTPMT:  PTP message type
+  *     @arg ETH_DMAPTPRxDesc_IPV6PR: IPv6 packet received
+  *     @arg ETH_DMAPTPRxDesc_IPV4PR: IPv4 packet received
+  *     @arg ETH_DMAPTPRxDesc_IPCB:   IP checksum bypassed
+  *     @arg ETH_DMAPTPRxDesc_IPPE:   IP payload error
+  *     @arg ETH_DMAPTPRxDesc_IPHE:   IP header error
+  *     @arg ETH_DMAPTPRxDesc_IPPT:   IP payload type
+  * @retval The new state of ETH_DMAPTPRxDescExtendedFlag (SET or RESET).
+  */
+FlagStatus ETH_GetDMAPTPRxDescExtendedFlagStatus(ETH_DMADESCTypeDef *DMAPTPRxDesc, uint32_t ETH_DMAPTPRxDescExtendedFlag)
+{
+  FlagStatus bitstatus = RESET;
+
+  /* Check the parameters */
+  assert_param(IS_ETH_DMAPTPRxDESC_GET_EXTENDED_FLAG(ETH_DMAPTPRxDescExtendedFlag));
+
+  if ((DMAPTPRxDesc->ExtendedStatus & ETH_DMAPTPRxDescExtendedFlag) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+#endif /* USE_ENHANCED_DMA_DESCRIPTORS */
+
+/**
+  * @brief  Set the specified DMA Rx Desc Own bit.
+  * @param  DMARxDesc: Pointer on a Rx desc
+  * @retval None
+  */
+void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc)
+{
+  /* Set the DMA Rx Desc Own bit */
+  DMARxDesc->Status |= ETH_DMARxDesc_OWN;
+}
+
+/**
+  * @brief  Returns the specified DMA Rx Desc frame length.
+  * @param  DMARxDesc: pointer on a DMA Rx descriptor
+  * @retval The Rx descriptor received frame length.
+  */
+uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc)
+{
+  /* Return the Receive descriptor frame length */
+  return ((DMARxDesc->Status & ETH_DMARxDesc_FL) >> ETH_DMARXDESC_FRAME_LENGTHSHIFT);
+}
+
+/**
+  * @brief  Enables or disables the specified DMA Rx Desc receive interrupt.
+  * @param  DMARxDesc: Pointer on a Rx desc
+  * @param  NewState: new state of the specified DMA Rx Desc interrupt.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the DMA Rx Desc receive interrupt */
+    DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_DIC);
+  }
+  else
+  {
+    /* Disable the DMA Rx Desc receive interrupt */
+    DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_DIC;
+  }
+}
+
+/**
+  * @brief  Enables or disables the DMA Rx Desc end of ring.
+  * @param  DMARxDesc: pointer on a DMA Rx descriptor
+  * @param  NewState: new state of the specified DMA Rx Desc end of ring.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected DMA Rx Desc end of ring */
+    DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER;
+  }
+  else
+  {
+    /* Disable the selected DMA Rx Desc end of ring */
+    DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RER);
+  }
+}
+
+/**
+  * @brief  Enables or disables the DMA Rx Desc second address chained.
+  * @param  DMARxDesc: pointer on a DMA Rx descriptor
+  * @param  NewState: new state of the specified DMA Rx Desc second address chained.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected DMA Rx Desc second address chained */
+    DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RCH;
+  }
+  else
+  {
+    /* Disable the selected DMA Rx Desc second address chained */
+    DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RCH);
+  }
+}
+
+/**
+  * @brief  Returns the specified ETHERNET DMA Rx Desc buffer size.
+  * @param  DMARxDesc: pointer on a DMA Rx descriptor
+  * @param  DMARxDesc_Buffer: specifies the DMA Rx Desc buffer.
+  *   This parameter can be any one of the following values:
+  *     @arg ETH_DMARxDesc_Buffer1 : DMA Rx Desc Buffer1
+  *     @arg ETH_DMARxDesc_Buffer2 : DMA Rx Desc Buffer2
+  * @retval The Receive descriptor frame length.
+  */
+uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_DMA_RXDESC_BUFFER(DMARxDesc_Buffer));
+
+  if(DMARxDesc_Buffer != ETH_DMARxDesc_Buffer1)
+  {
+    /* Return the DMA Rx Desc buffer2 size */
+    return ((DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS2) >> ETH_DMARXDESC_BUFFER2_SIZESHIFT);
+  }
+  else
+  {
+    /* Return the DMA Rx Desc buffer1 size */
+    return (DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS1);
+  }
+}
+
+/*---------------------------------  DMA  ------------------------------------*/
+/**
+  * @brief  Resets all MAC subsystem internal registers and logic.
+  * @param  None
+  * @retval None
+  */
+void ETH_SoftwareReset(void)
+{
+  /* Set the SWR bit: resets all MAC subsystem internal registers and logic */
+  /* After reset all the registers holds their respective reset values */
+  ETH->DMABMR |= ETH_DMABMR_SR;
+}
+
+/**
+  * @brief  Checks whether the ETHERNET software reset bit is set or not.
+  * @param  None
+  * @retval The new state of DMA Bus Mode register SR bit (SET or RESET).
+  */
+FlagStatus ETH_GetSoftwareResetStatus(void)
+{
+  FlagStatus bitstatus = RESET;
+  if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET DMA flag is set or not.
+  * @param  ETH_DMA_FLAG: specifies the flag to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_DMA_FLAG_TST : Time-stamp trigger flag
+  *     @arg ETH_DMA_FLAG_PMT : PMT flag
+  *     @arg ETH_DMA_FLAG_MMC : MMC flag
+  *     @arg ETH_DMA_FLAG_DataTransferError : Error bits 0-data buffer, 1-desc. access
+  *     @arg ETH_DMA_FLAG_ReadWriteError    : Error bits 0-write trnsf, 1-read transfr
+  *     @arg ETH_DMA_FLAG_AccessError       : Error bits 0-Rx DMA, 1-Tx DMA
+  *     @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag
+  *     @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag
+  *     @arg ETH_DMA_FLAG_ER  : Early receive flag
+  *     @arg ETH_DMA_FLAG_FBE : Fatal bus error flag
+  *     @arg ETH_DMA_FLAG_ET  : Early transmit flag
+  *     @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag
+  *     @arg ETH_DMA_FLAG_RPS : Receive process stopped flag
+  *     @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag
+  *     @arg ETH_DMA_FLAG_R   : Receive flag
+  *     @arg ETH_DMA_FLAG_TU  : Underflow flag
+  *     @arg ETH_DMA_FLAG_RO  : Overflow flag
+  *     @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag
+  *     @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag
+  *     @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag
+  *     @arg ETH_DMA_FLAG_T   : Transmit flag
+  * @retval The new state of ETH_DMA_FLAG (SET or RESET).
+  */
+FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG)
+{
+  FlagStatus bitstatus = RESET;
+  /* Check the parameters */
+  assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_FLAG));
+  if ((ETH->DMASR & ETH_DMA_FLAG) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Clears the ETHERNET¡¯s DMA pending flag.
+  * @param  ETH_DMA_FLAG: specifies the flag to clear.
+  *   This parameter can be any combination of the following values:
+  *     @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag
+  *     @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag
+  *     @arg ETH_DMA_FLAG_ER  : Early receive flag
+  *     @arg ETH_DMA_FLAG_FBE : Fatal bus error flag
+  *     @arg ETH_DMA_FLAG_ETI : Early transmit flag
+  *     @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag
+  *     @arg ETH_DMA_FLAG_RPS : Receive process stopped flag
+  *     @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag
+  *     @arg ETH_DMA_FLAG_R   : Receive flag
+  *     @arg ETH_DMA_FLAG_TU  : Transmit Underflow flag
+  *     @arg ETH_DMA_FLAG_RO  : Receive Overflow flag
+  *     @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag
+  *     @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag
+  *     @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag
+  *     @arg ETH_DMA_FLAG_T   : Transmit flag
+  * @retval None
+  */
+void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_DMA_FLAG(ETH_DMA_FLAG));
+
+  /* Clear the selected ETHERNET DMA FLAG */
+  ETH->DMASR = (uint32_t) ETH_DMA_FLAG;
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET DMA interrupt has occured or not.
+  * @param  ETH_DMA_IT: specifies the interrupt source to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_DMA_IT_TST : Time-stamp trigger interrupt
+  *     @arg ETH_DMA_IT_PMT : PMT interrupt
+  *     @arg ETH_DMA_IT_MMC : MMC interrupt
+  *     @arg ETH_DMA_IT_NIS : Normal interrupt summary
+  *     @arg ETH_DMA_IT_AIS : Abnormal interrupt summary
+  *     @arg ETH_DMA_IT_ER  : Early receive interrupt
+  *     @arg ETH_DMA_IT_FBE : Fatal bus error interrupt
+  *     @arg ETH_DMA_IT_ET  : Early transmit interrupt
+  *     @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt
+  *     @arg ETH_DMA_IT_RPS : Receive process stopped interrupt
+  *     @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt
+  *     @arg ETH_DMA_IT_R   : Receive interrupt
+  *     @arg ETH_DMA_IT_TU  : Underflow interrupt
+  *     @arg ETH_DMA_IT_RO  : Overflow interrupt
+  *     @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt
+  *     @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt
+  *     @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt
+  *     @arg ETH_DMA_IT_T   : Transmit interrupt
+  * @retval The new state of ETH_DMA_IT (SET or RESET).
+  */
+ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT)
+{
+  ITStatus bitstatus = RESET;
+  /* Check the parameters */
+  assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_IT));
+  if ((ETH->DMASR & ETH_DMA_IT) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Clears the ETHERNET¡¯s DMA IT pending bit.
+  * @param  ETH_DMA_IT: specifies the interrupt pending bit to clear.
+  *   This parameter can be any combination of the following values:
+  *     @arg ETH_DMA_IT_NIS : Normal interrupt summary
+  *     @arg ETH_DMA_IT_AIS : Abnormal interrupt summary
+  *     @arg ETH_DMA_IT_ER  : Early receive interrupt
+  *     @arg ETH_DMA_IT_FBE : Fatal bus error interrupt
+  *     @arg ETH_DMA_IT_ETI : Early transmit interrupt
+  *     @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt
+  *     @arg ETH_DMA_IT_RPS : Receive process stopped interrupt
+  *     @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt
+  *     @arg ETH_DMA_IT_R   : Receive interrupt
+  *     @arg ETH_DMA_IT_TU  : Transmit Underflow interrupt
+  *     @arg ETH_DMA_IT_RO  : Receive Overflow interrupt
+  *     @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt
+  *     @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt
+  *     @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt
+  *     @arg ETH_DMA_IT_T   : Transmit interrupt
+  * @retval None
+  */
+void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_DMA_IT(ETH_DMA_IT));
+
+  /* Clear the selected ETHERNET DMA IT */
+  ETH->DMASR = (uint32_t) ETH_DMA_IT;
+}
+
+/**
+  * @brief  Returns the ETHERNET DMA Transmit Process State.
+  * @param  None
+  * @retval The new ETHERNET DMA Transmit Process State:
+  *   This can be one of the following values:
+  *     - ETH_DMA_TransmitProcess_Stopped   : Stopped - Reset or Stop Tx Command issued
+  *     - ETH_DMA_TransmitProcess_Fetching  : Running - fetching the Tx descriptor
+  *     - ETH_DMA_TransmitProcess_Waiting   : Running - waiting for status
+  *     - ETH_DMA_TransmitProcess_Reading   : unning - reading the data from host memory
+  *     - ETH_DMA_TransmitProcess_Suspended : Suspended - Tx Desciptor unavailabe
+  *     - ETH_DMA_TransmitProcess_Closing   : Running - closing Rx descriptor
+  */
+uint32_t ETH_GetTransmitProcessState(void)
+{
+  return ((uint32_t)(ETH->DMASR & ETH_DMASR_TS));
+}
+
+/**
+  * @brief  Returns the ETHERNET DMA Receive Process State.
+  * @param  None
+  * @retval The new ETHERNET DMA Receive Process State:
+  *   This can be one of the following values:
+  *     - ETH_DMA_ReceiveProcess_Stopped   : Stopped - Reset or Stop Rx Command issued
+  *     - ETH_DMA_ReceiveProcess_Fetching  : Running - fetching the Rx descriptor
+  *     - ETH_DMA_ReceiveProcess_Waiting   : Running - waiting for packet
+  *     - ETH_DMA_ReceiveProcess_Suspended : Suspended - Rx Desciptor unavailable
+  *     - ETH_DMA_ReceiveProcess_Closing   : Running - closing descriptor
+  *     - ETH_DMA_ReceiveProcess_Queuing   : Running - queuing the recieve frame into host memory
+  */
+uint32_t ETH_GetReceiveProcessState(void)
+{
+  return ((uint32_t)(ETH->DMASR & ETH_DMASR_RS));
+}
+
+/**
+  * @brief  Clears the ETHERNET transmit FIFO.
+  * @param  None
+  * @retval None
+  */
+void ETH_FlushTransmitFIFO(void)
+{
+  /* Set the Flush Transmit FIFO bit */
+  ETH->DMAOMR |= ETH_DMAOMR_FTF;
+}
+
+/**
+  * @brief  Checks whether the ETHERNET transmit FIFO bit is cleared or not.
+  * @param  None
+  * @retval The new state of ETHERNET flush transmit FIFO bit (SET or RESET).
+  */
+FlagStatus ETH_GetFlushTransmitFIFOStatus(void)
+{
+  FlagStatus bitstatus = RESET;
+  if ((ETH->DMAOMR & ETH_DMAOMR_FTF) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Enables or disables the DMA transmission.
+  * @param  NewState: new state of the DMA transmission.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMATransmissionCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the DMA transmission */
+    ETH->DMAOMR |= ETH_DMAOMR_ST;
+  }
+  else
+  {
+    /* Disable the DMA transmission */
+    ETH->DMAOMR &= ~ETH_DMAOMR_ST;
+  }
+}
+
+/**
+  * @brief  Enables or disables the DMA reception.
+  * @param  NewState: new state of the DMA reception.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMAReceptionCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the DMA reception */
+    ETH->DMAOMR |= ETH_DMAOMR_SR;
+  }
+  else
+  {
+    /* Disable the DMA reception */
+    ETH->DMAOMR &= ~ETH_DMAOMR_SR;
+  }
+}
+
+/**
+  * @brief  Enables or disables the specified ETHERNET DMA interrupts.
+  * @param  ETH_DMA_IT: specifies the ETHERNET DMA interrupt sources to be
+  *   enabled or disabled.
+  *   This parameter can be any combination of the following values:
+  *     @arg ETH_DMA_IT_NIS : Normal interrupt summary
+  *     @arg ETH_DMA_IT_AIS : Abnormal interrupt summary
+  *     @arg ETH_DMA_IT_ER  : Early receive interrupt
+  *     @arg ETH_DMA_IT_FBE : Fatal bus error interrupt
+  *     @arg ETH_DMA_IT_ET  : Early transmit interrupt
+  *     @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt
+  *     @arg ETH_DMA_IT_RPS : Receive process stopped interrupt
+  *     @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt
+  *     @arg ETH_DMA_IT_R   : Receive interrupt
+  *     @arg ETH_DMA_IT_TU  : Underflow interrupt
+  *     @arg ETH_DMA_IT_RO  : Overflow interrupt
+  *     @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt
+  *     @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt
+  *     @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt
+  *     @arg ETH_DMA_IT_T   : Transmit interrupt
+  * @param  NewState: new state of the specified ETHERNET DMA interrupts.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_DMA_IT(ETH_DMA_IT));
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected ETHERNET DMA interrupts */
+    ETH->DMAIER |= ETH_DMA_IT;
+  }
+  else
+  {
+    /* Disable the selected ETHERNET DMA interrupts */
+    ETH->DMAIER &=(~(uint32_t)ETH_DMA_IT);
+  }
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET DMA overflow flag is set or not.
+  * @param  ETH_DMA_Overflow: specifies the DMA overflow flag to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_DMA_Overflow_RxFIFOCounter : Overflow for FIFO Overflow Counter
+  *     @arg ETH_DMA_Overflow_MissedFrameCounter : Overflow for Missed Frame Counter
+  * @retval The new state of ETHERNET DMA overflow Flag (SET or RESET).
+  */
+FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow)
+{
+  FlagStatus bitstatus = RESET;
+  /* Check the parameters */
+  assert_param(IS_ETH_DMA_GET_OVERFLOW(ETH_DMA_Overflow));
+
+  if ((ETH->DMAMFBOCR & ETH_DMA_Overflow) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Get the ETHERNET DMA Rx Overflow Missed Frame Counter value.
+  * @param  None
+  * @retval The value of Rx overflow Missed Frame Counter.
+  */
+uint32_t ETH_GetRxOverflowMissedFrameCounter(void)
+{
+  return ((uint32_t)((ETH->DMAMFBOCR & ETH_DMAMFBOCR_MFA)>>ETH_DMA_RX_OVERFLOW_MISSEDFRAMES_COUNTERSHIFT));
+}
+
+/**
+  * @brief  Get the ETHERNET DMA Buffer Unavailable Missed Frame Counter value.
+  * @param  None
+  * @retval The value of Buffer unavailable Missed Frame Counter.
+  */
+uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void)
+{
+  return ((uint32_t)(ETH->DMAMFBOCR) & ETH_DMAMFBOCR_MFC);
+}
+
+/**
+  * @brief  Get the ETHERNET DMA DMACHTDR register value.
+  * @param  None
+  * @retval The value of the current Tx desc start address.
+  */
+uint32_t ETH_GetCurrentTxDescStartAddress(void)
+{
+  return ((uint32_t)(ETH->DMACHTDR));
+}
+
+/**
+  * @brief  Get the ETHERNET DMA DMACHRDR register value.
+  * @param  None
+  * @retval The value of the current Rx desc start address.
+  */
+uint32_t ETH_GetCurrentRxDescStartAddress(void)
+{
+  return ((uint32_t)(ETH->DMACHRDR));
+}
+
+/**
+  * @brief  Get the ETHERNET DMA DMACHTBAR register value.
+  * @param  None
+  * @retval The value of the current Tx buffer address.
+  */
+uint32_t ETH_GetCurrentTxBufferAddress(void)
+{
+  return ((uint32_t)(ETH->DMACHTBAR));
+}
+
+/**
+  * @brief  Get the ETHERNET DMA DMACHRBAR register value.
+  * @param  None
+  * @retval The value of the current Rx buffer address.
+  */
+uint32_t ETH_GetCurrentRxBufferAddress(void)
+{
+  return ((uint32_t)(ETH->DMACHRBAR));
+}
+
+/**
+  * @brief  Resumes the DMA Transmission by writing to the DmaTxPollDemand register
+  *   (the data written could be anything). This forces  the DMA to resume transmission.
+  * @param  None
+  * @retval None.
+  */
+void ETH_ResumeDMATransmission(void)
+{
+  ETH->DMATPDR = 0;
+}
+
+/**
+  * @brief  Resumes the DMA Transmission by writing to the DmaRxPollDemand register
+  *   (the data written could be anything). This forces the DMA to resume reception.
+  * @param  None
+  * @retval None.
+  */
+void ETH_ResumeDMAReception(void)
+{
+  ETH->DMARPDR = 0;
+}
+
+/**
+  * @brief  Set the DMA Receive status watchdog timer register value
+  * @param  Value: DMA Receive status watchdog timer register value
+  * @retval None
+  */
+void ETH_SetReceiveWatchdogTimer(uint8_t Value)
+{
+  /* Set the DMA Receive status watchdog timer register */
+  ETH->DMARSWTR = Value;
+}
+
+/*---------------------------------  PMT  ------------------------------------*/
+/**
+  * @brief  Reset Wakeup frame filter register pointer.
+  * @param  None
+  * @retval None
+  */
+void ETH_ResetWakeUpFrameFilterRegisterPointer(void)
+{
+  /* Resets the Remote Wake-up Frame Filter register pointer to 0x0000 */
+  ETH->MACPMTCSR |= ETH_MACPMTCSR_WFFRPR;
+}
+
+/**
+  * @brief  Populates the remote wakeup frame registers.
+  * @param  Buffer: Pointer on remote WakeUp Frame Filter Register buffer data (8 words).
+  * @retval None
+  */
+void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer)
+{
+  uint32_t i = 0;
+
+  /* Fill Remote Wake-up Frame Filter register with Buffer data */
+  for(i =0; i<ETH_WAKEUP_REGISTER_LENGTH; i++)
+  {
+    /* Write each time to the same register */
+    ETH->MACRWUFFR = Buffer[i];
+  }
+}
+
+/**
+  * @brief  Enables or disables any unicast packet filtered by the MAC address
+  *   recognition to be a wake-up frame.
+  * @param  NewState: new state of the MAC Global Unicast Wake-Up.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the MAC Global Unicast Wake-Up */
+    ETH->MACPMTCSR |= ETH_MACPMTCSR_GU;
+  }
+  else
+  {
+    /* Disable the MAC Global Unicast Wake-Up */
+    ETH->MACPMTCSR &= ~ETH_MACPMTCSR_GU;
+  }
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET PMT flag is set or not.
+  * @param  ETH_PMT_FLAG: specifies the flag to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_PMT_FLAG_WUFFRPR : Wake-Up Frame Filter Register Poniter Reset
+  *     @arg ETH_PMT_FLAG_WUFR    : Wake-Up Frame Received
+  *     @arg ETH_PMT_FLAG_MPR     : Magic Packet Received
+  * @retval The new state of ETHERNET PMT Flag (SET or RESET).
+  */
+FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG)
+{
+  FlagStatus bitstatus = RESET;
+  /* Check the parameters */
+  assert_param(IS_ETH_PMT_GET_FLAG(ETH_PMT_FLAG));
+
+  if ((ETH->MACPMTCSR & ETH_PMT_FLAG) != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+  return bitstatus;
+}
+
+/**
+  * @brief  Enables or disables the MAC Wake-Up Frame Detection.
+  * @param  NewState: new state of the MAC Wake-Up Frame Detection.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the MAC Wake-Up Frame Detection */
+    ETH->MACPMTCSR |= ETH_MACPMTCSR_WFE;
+  }
+  else
+  {
+    /* Disable the MAC Wake-Up Frame Detection */
+    ETH->MACPMTCSR &= ~ETH_MACPMTCSR_WFE;
+  }
+}
+
+/**
+  * @brief  Enables or disables the MAC Magic Packet Detection.
+  * @param  NewState: new state of the MAC Magic Packet Detection.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_MagicPacketDetectionCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the MAC Magic Packet Detection */
+    ETH->MACPMTCSR |= ETH_MACPMTCSR_MPE;
+  }
+  else
+  {
+    /* Disable the MAC Magic Packet Detection */
+    ETH->MACPMTCSR &= ~ETH_MACPMTCSR_MPE;
+  }
+}
+
+/**
+  * @brief  Enables or disables the MAC Power Down.
+  * @param  NewState: new state of the MAC Power Down.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_PowerDownCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the MAC Power Down */
+    /* This puts the MAC in power down mode */
+    ETH->MACPMTCSR |= ETH_MACPMTCSR_PD;
+  }
+  else
+  {
+    /* Disable the MAC Power Down */
+    ETH->MACPMTCSR &= ~ETH_MACPMTCSR_PD;
+  }
+}
+
+/*---------------------------------  MMC  ------------------------------------*/
+/**
+  * @brief  Preset and Initialize the MMC counters to almost-full value: 0xFFFF_FFF0 (full - 16)
+  * @param  None
+  * @retval None
+  */
+void ETH_MMCCounterFullPreset(void)
+{
+  /* Preset and Initialize the MMC counters to almost-full value */
+  ETH->MMCCR |= ETH_MMCCR_MCFHP | ETH_MMCCR_MCP;
+}
+
+/**
+  * @brief  Preset and Initialize the MMC counters to almost-hal value: 0x7FFF_FFF0 (half - 16).
+  * @param  None
+  * @retval None
+  */
+void ETH_MMCCounterHalfPreset(void)
+{
+  /* Preset the MMC counters to almost-full value */
+  ETH->MMCCR &= ~ETH_MMCCR_MCFHP;
+  /* Initialize the MMC counters to almost-half value */
+  ETH->MMCCR |= ETH_MMCCR_MCP;
+}
+
+/**
+  * @brief  Enables or disables the MMC Counter Freeze.
+  * @param  NewState: new state of the MMC Counter Freeze.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_MMCCounterFreezeCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the MMC Counter Freeze */
+    ETH->MMCCR |= ETH_MMCCR_MCF;
+  }
+  else
+  {
+    /* Disable the MMC Counter Freeze */
+    ETH->MMCCR &= ~ETH_MMCCR_MCF;
+  }
+}
+
+/**
+  * @brief  Enables or disables the MMC Reset On Read.
+  * @param  NewState: new state of the MMC Reset On Read.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_MMCResetOnReadCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the MMC Counter reset on read */
+    ETH->MMCCR |= ETH_MMCCR_ROR;
+  }
+  else
+  {
+    /* Disable the MMC Counter reset on read */
+    ETH->MMCCR &= ~ETH_MMCCR_ROR;
+  }
+}
+
+/**
+  * @brief  Enables or disables the MMC Counter Stop Rollover.
+  * @param  NewState: new state of the MMC Counter Stop Rollover.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_MMCCounterRolloverCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Disable the MMC Counter Stop Rollover  */
+    ETH->MMCCR &= ~ETH_MMCCR_CSR;
+  }
+  else
+  {
+    /* Enable the MMC Counter Stop Rollover */
+    ETH->MMCCR |= ETH_MMCCR_CSR;
+  }
+}
+
+/**
+  * @brief  Resets the MMC Counters.
+  * @param  None
+  * @retval None
+  */
+void ETH_MMCCountersReset(void)
+{
+  /* Resets the MMC Counters */
+  ETH->MMCCR |= ETH_MMCCR_CR;
+}
+
+/**
+  * @brief  Enables or disables the specified ETHERNET MMC interrupts.
+  * @param  ETH_MMC_IT: specifies the ETHERNET MMC interrupt sources to be enabled or disabled.
+  *   This parameter can be any combination of Tx interrupt or
+  *   any combination of Rx interrupt (but not both)of the following values:
+  *     @arg ETH_MMC_IT_TGF   : When Tx good frame counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_TGFMSC: When Tx good multi col counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_TGFSC : When Tx good single col counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_RGUF  : When Rx good unicast frames counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_RFAE  : When Rx alignment error counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_RFCE  : When Rx crc error counter reaches half the maximum value
+  * @param  NewState: new state of the specified ETHERNET MMC interrupts.
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_MMC_IT(ETH_MMC_IT));
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET)
+  {
+    /* Remove register mak from IT */
+    ETH_MMC_IT &= 0xEFFFFFFF;
+
+    /* ETHERNET MMC Rx interrupts selected */
+    if (NewState != DISABLE)
+    {
+      /* Enable the selected ETHERNET MMC interrupts */
+      ETH->MMCRIMR &=(~(uint32_t)ETH_MMC_IT);
+    }
+    else
+    {
+      /* Disable the selected ETHERNET MMC interrupts */
+      ETH->MMCRIMR |= ETH_MMC_IT;
+    }
+  }
+  else
+  {
+    /* ETHERNET MMC Tx interrupts selected */
+    if (NewState != DISABLE)
+    {
+      /* Enable the selected ETHERNET MMC interrupts */
+      ETH->MMCTIMR &=(~(uint32_t)ETH_MMC_IT);
+    }
+    else
+    {
+      /* Disable the selected ETHERNET MMC interrupts */
+      ETH->MMCTIMR |= ETH_MMC_IT;
+    }
+  }
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET MMC IT is set or not.
+  * @param  ETH_MMC_IT: specifies the ETHERNET MMC interrupt.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MMC_IT_TxFCGC: When Tx good frame counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_TxMCGC: When Tx good multi col counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_TxSCGC: When Tx good single col counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_RxUGFC: When Rx good unicast frames counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_RxAEC : When Rx alignment error counter reaches half the maximum value
+  *     @arg ETH_MMC_IT_RxCEC : When Rx crc error counter reaches half the maximum value
+  * @retval The value of ETHERNET MMC IT (SET or RESET).
+  */
+ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT)
+{
+  ITStatus bitstatus = RESET;
+  /* Check the parameters */
+  assert_param(IS_ETH_MMC_GET_IT(ETH_MMC_IT));
+
+  if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET)
+  {
+    /* ETHERNET MMC Rx interrupts selected */
+    /* Check if the ETHERNET MMC Rx selected interrupt is enabled and occured */
+    if ((((ETH->MMCRIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) == (uint32_t)RESET))
+    {
+      bitstatus = SET;
+    }
+    else
+    {
+      bitstatus = RESET;
+    }
+  }
+  else
+  {
+    /* ETHERNET MMC Tx interrupts selected */
+    /* Check if the ETHERNET MMC Tx selected interrupt is enabled and occured */
+    if ((((ETH->MMCTIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCTIMR & ETH_MMC_IT) == (uint32_t)RESET))
+    {
+      bitstatus = SET;
+    }
+    else
+    {
+      bitstatus = RESET;
+    }
+  }
+
+  return bitstatus;
+}
+
+/**
+  * @brief  Get the specified ETHERNET MMC register value.
+  * @param  ETH_MMCReg: specifies the ETHERNET MMC register.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_MMCCR      : MMC CR register
+  *     @arg ETH_MMCRIR     : MMC RIR register
+  *     @arg ETH_MMCTIR     : MMC TIR register
+  *     @arg ETH_MMCRIMR    : MMC RIMR register
+  *     @arg ETH_MMCTIMR    : MMC TIMR register
+  *     @arg ETH_MMCTGFSCCR : MMC TGFSCCR register
+  *     @arg ETH_MMCTGFMSCCR: MMC TGFMSCCR register
+  *     @arg ETH_MMCTGFCR   : MMC TGFCR register
+  *     @arg ETH_MMCRFCECR  : MMC RFCECR register
+  *     @arg ETH_MMCRFAECR  : MMC RFAECR register
+  *     @arg ETH_MMCRGUFCR  : MMC RGUFCRregister
+  * @retval The value of ETHERNET MMC Register value.
+  */
+uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_MMC_REGISTER(ETH_MMCReg));
+
+  /* Return the selected register value */
+  return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_MMCReg));
+}
+/*---------------------------------  PTP  ------------------------------------*/
+/**
+  * @brief  Sets the PTP node clock type.
+  * @param  ClockType: specifies the PTP node clock type.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_PTP_OrdinaryClock : Ordinary Clock.
+  *     @arg ETH_PTP_BoundaryClock : Boundary Clock.
+  *     @arg ETH_PTP_EndToEndTransparentClock : End To End Transparent Clock.
+  *     @arg ETH_PTP_PeerToPeerTransparentClock : Peer To Peer Transparent Clock.
+  * @retval None
+  */
+void ETH_PTPNodeClockTypeConfig(uint32_t ClockType)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_PTP_TYPE_CLOCK(ClockType));
+
+  /* Clear the PTP node clock type */
+  ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSCNT);
+
+  /* Set the new PTP node clock type */
+  ETH->PTPTSCR |= ClockType;
+}
+
+/**
+  * @brief  Enables or disables the selected PTP snapshot method.
+  * @param  SnapshotMethod: specifies the PTP snapshot method.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_PTP_SnapshotMasterMessage  : snapshot for message relevant to master.
+  *     @arg ETH_PTP_SnapshotEventMessage   : snapshot for event message.
+  *     @arg ETH_PTP_SnapshotIPV4Frames     : snapshot for IPv4 frames.
+  *     @arg ETH_PTP_SnapshotIPV6Frames     : snapshot for IPv6 frames.
+  *     @arg ETH_PTP_SnapshotPTPOverEthernetFrames : snapshot for PTP over ethernet frames.
+  *     @arg ETH_PTP_SnapshotAllReceivedFrames      : snapshot for all received frames.
+  * @param  NewState: new state of the PTP snapshot method
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_PTPSnapshotCmd(uint32_t SnapshotMethod, FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_PTP_SNAPSHOT(SnapshotMethod));
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the selected PTP snapshot method */
+    ETH->PTPTSCR |= SnapshotMethod;
+  }
+  else
+  {
+    /* Disable the selected PTP snapshot method */
+    ETH->PTPTSCR &= (~(uint32_t)SnapshotMethod);
+  }
+}
+
+/**
+  * @brief  Enables or disables the PTP packet snooping version 2 format.
+  * @param  NewState: new state of the PTP packet snooping version 2 format
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_PTPPacketSnoopingV2FormatCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the PTP packet snooping version 2 format */
+    ETH->PTPTSCR |= ETH_PTPTSSR_TSPTPPSV2E;
+  }
+  else
+  {
+    /* Disable the PTP packet snooping version 2 format */
+    ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSSR_TSPTPPSV2E);
+  }
+}
+
+/**
+  * @brief  Enables or disables the PTP Subsecond rollover.
+  * @param  NewState: new state of the PTP Subsecond rollover
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_PTPSubSecondRolloverCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the PTP Subsecond rollover */
+    ETH->PTPTSCR |= ETH_PTPTSSR_TSSSR;
+  }
+  else
+  {
+    /* Disable the PTP Subsecond rollover */
+    ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSSR_TSSSR);
+  }
+}
+
+/**
+  * @brief  Updated the PTP block for fine correction with the Time Stamp Addend register value.
+  * @param  None
+  * @retval None
+  */
+void ETH_EnablePTPTimeStampAddend(void)
+{
+  /* Enable the PTP block update with the Time Stamp Addend register value */
+  ETH->PTPTSCR |= ETH_PTPTSCR_TSARU;
+}
+
+/**
+  * @brief  Enable the PTP Time Stamp interrupt trigger
+  * @param  None
+  * @retval None
+  */
+void ETH_EnablePTPTimeStampInterruptTrigger(void)
+{
+  /* Enable the PTP target time interrupt */
+  ETH->PTPTSCR |= ETH_PTPTSCR_TSITE;
+}
+
+/**
+  * @brief  Updated the PTP system time with the Time Stamp Update register value.
+  * @param  None
+  * @retval None
+  */
+void ETH_EnablePTPTimeStampUpdate(void)
+{
+  /* Enable the PTP system time update with the Time Stamp Update register value */
+  ETH->PTPTSCR |= ETH_PTPTSCR_TSSTU;
+}
+
+/**
+  * @brief  Initialize the PTP Time Stamp
+  * @param  None
+  * @retval None
+  */
+void ETH_InitializePTPTimeStamp(void)
+{
+  /* Initialize the PTP Time Stamp */
+  ETH->PTPTSCR |= ETH_PTPTSCR_TSSTI;
+}
+
+/**
+  * @brief  Selects the PTP Update method
+  * @param  UpdateMethod: the PTP Update method
+  *   This parameter can be one of the following values:
+  *     @arg ETH_PTP_FineUpdate   : Fine Update method
+  *     @arg ETH_PTP_CoarseUpdate : Coarse Update method
+  * @retval None
+  */
+void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_PTP_UPDATE(UpdateMethod));
+
+  if (UpdateMethod != ETH_PTP_CoarseUpdate)
+  {
+    /* Enable the PTP Fine Update method */
+    ETH->PTPTSCR |= ETH_PTPTSCR_TSFCU;
+  }
+  else
+  {
+    /* Disable the PTP Coarse Update method */
+    ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSFCU);
+  }
+}
+
+/**
+  * @brief  Enables or disables the PTP time stamp for transmit and receive frames.
+  * @param  NewState: new state of the PTP time stamp for transmit and receive frames
+  *   This parameter can be: ENABLE or DISABLE.
+  * @retval None
+  */
+void ETH_PTPTimeStampCmd(FunctionalState NewState)
+{
+  /* Check the parameters */
+  assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+  if (NewState != DISABLE)
+  {
+    /* Enable the PTP time stamp for transmit and receive frames */
+    ETH->PTPTSCR |= ETH_PTPTSCR_TSE;
+  }
+  else
+  {
+    /* Disable the PTP time stamp for transmit and receive frames */
+    ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSE);
+  }
+}
+
+/**
+  * @brief  Checks whether the specified ETHERNET PTP flag is set or not.
+  * @param  ETH_PTP_FLAG: specifies the flag to check.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_PTP_FLAG_TSARU : Addend Register Update
+  *     @arg ETH_PTP_FLAG_TSITE : Time Stamp Interrupt Trigger Enable
+  *     @arg ETH_PTP_FLAG_TSSTU : Time Stamp Update
+  *     @arg ETH_PTP_FLAG_TSSTI  : Time Stamp Initialize
+  * @retval The new state of ETHERNET PTP Flag (SET or RESET).
+  */
+FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG)
+{
+  uint32_t flagpos = 0x0;
+  FlagStatus bitstatus = RESET;
+  uint32_t ethernetreg = 0x0;
+
+  /* Check the parameters */
+  assert_param(IS_ETH_PTP_GET_FLAG(ETH_PTP_FLAG));
+
+  /* Get the Flag position */
+  flagpos &= 0xEFFFFFFF;
+
+  /* Get the Ethernet register index */
+  ethernetreg = (((uint32_t)ETH_PTP_FLAG) & 0x10000000);
+
+  if (ethernetreg != (uint32_t)RESET) /* The flag is in PTPTSCR register */
+  {
+    flagpos &= ETH->PTPTSCR;
+  }
+  else /* The IT  is in PTPTSSR register */
+  {
+    flagpos &= ETH->PTPTSSR;
+  }
+
+  if (flagpos != (uint32_t)RESET)
+  {
+    bitstatus = SET;
+  }
+  else
+  {
+    bitstatus = RESET;
+  }
+
+  return bitstatus;
+}
+
+/**
+  * @brief  Sets the system time Sub-Second Increment value.
+  * @param  SubSecondValue: specifies the PTP Sub-Second Increment Register value.
+  * @retval None
+  */
+void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_PTP_SUBSECOND_INCREMENT(SubSecondValue));
+  /* Set the PTP Sub-Second Increment Register */
+  ETH->PTPSSIR = SubSecondValue;
+}
+
+/**
+  * @brief  Sets the Time Stamp update sign and values.
+  * @param  Sign: specifies the PTP Time update value sign.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_PTP_PositiveTime : positive time value.
+  *     @arg ETH_PTP_NegativeTime : negative time value.
+  * @param  SecondValue: specifies the PTP Time update second value.
+  * @param  SubSecondValue: specifies the PTP Time update sub-second value.
+  *   This parameter is a 31 bit value, bit32 correspond to the sign.
+  * @retval None
+  */
+void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_PTP_TIME_SIGN(Sign));
+  assert_param(IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SubSecondValue));
+  /* Set the PTP Time Update High Register */
+  ETH->PTPTSHUR = SecondValue;
+
+  /* Set the PTP Time Update Low Register with sign */
+  ETH->PTPTSLUR = Sign | SubSecondValue;
+}
+
+/**
+  * @brief  Sets the Time Stamp Addend value.
+  * @param  Value: specifies the PTP Time Stamp Addend Register value.
+  * @retval None
+  */
+void ETH_SetPTPTimeStampAddend(uint32_t Value)
+{
+  /* Set the PTP Time Stamp Addend Register */
+  ETH->PTPTSAR = Value;
+}
+
+/**
+  * @brief  Sets the Target Time registers values.
+  * @param  HighValue: specifies the PTP Target Time High Register value.
+  * @param  LowValue: specifies the PTP Target Time Low Register value.
+  * @retval None
+  */
+void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue)
+{
+  /* Set the PTP Target Time High Register */
+  ETH->PTPTTHR = HighValue;
+  /* Set the PTP Target Time Low Register */
+  ETH->PTPTTLR = LowValue;
+}
+
+/**
+  * @brief  Get the specified ETHERNET PTP register value.
+  * @param  ETH_PTPReg: specifies the ETHERNET PTP register.
+  *   This parameter can be one of the following values:
+  *     @arg ETH_PTPTSCR  : Sub-Second Increment Register
+  *     @arg ETH_PTPSSIR  : Sub-Second Increment Register
+  *     @arg ETH_PTPTSHR  : Time Stamp High Register
+  *     @arg ETH_PTPTSLR  : Time Stamp Low Register
+  *     @arg ETH_PTPTSHUR : Time Stamp High Update Register
+  *     @arg ETH_PTPTSLUR : Time Stamp Low Update Register
+  *     @arg ETH_PTPTSAR  : Time Stamp Addend Register
+  *     @arg ETH_PTPTTHR  : Target Time High Register
+  *     @arg ETH_PTPTTLR  : Target Time Low Register
+  * @retval The value of ETHERNET PTP Register value.
+  */
+uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg)
+{
+  /* Check the parameters */
+  assert_param(IS_ETH_PTP_REGISTER(ETH_PTPReg));
+
+  /* Return the selected register value */
+  return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_PTPReg));
+}
+
+#ifdef USE_ENHANCED_DMA_DESCRIPTORS
+/**
+  * @brief  Initializes the DMA Tx descriptors in chain mode with PTP.
+  * @param  DMAPTPTxDescTab: Pointer on the first Tx desc list
+  * @param  TxBuff: Pointer on the first TxBuffer list
+  * @param  TxBuffCount: Number of the used Tx desc in the list
+  * @retval None
+  */
+void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMAPTPTxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount)
+{
+  uint32_t i = 0;
+  ETH_DMADESCTypeDef *DMAPTPTxDesc;
+
+  /* Set the DMAPTPTxDescToSet pointer with the first one of the DMAPTPTxDescTab list */
+  DMAPTPTxDescToSet = DMAPTPTxDescTab;
+
+  /* Fill each DMAPTPTxDesc descriptor with the right values */
+  for(i=0; i < TxBuffCount; i++)
+  {
+    /* Get the pointer on the ith member of the Tx Desc list */
+    DMAPTPTxDesc = DMAPTPTxDescTab + i;
+
+    /* Set Second Address Chained bit */
+    DMAPTPTxDesc->Status = ETH_DMATxDesc_TCH | ETH_DMATxDesc_TTSE;
+
+    /* Set Buffer1 address pointer */
+    DMAPTPTxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]);
+
+    /* Initialize the next descriptor with the Next Desciptor Polling Enable */
+    if(i < (TxBuffCount-1))
+    {
+      /* Set next descriptor address register with next descriptor base address */
+      DMAPTPTxDesc->Buffer2NextDescAddr = (uint32_t)(DMAPTPTxDescTab+i+1);
+    }
+    else
+    {
+      /* For last descriptor, set next descriptor address register equal to the first descriptor base address */
+      DMAPTPTxDesc->Buffer2NextDescAddr = (uint32_t) DMAPTPTxDescTab;
+    }
+  }
+
+  /* Set Transmit Desciptor List Address Register */
+  ETH->DMATDLAR = (uint32_t) DMAPTPTxDescTab;
+}
+
+/**
+  * @brief  Initializes the DMA Rx descriptors in chain mode.
+  * @param  DMAPTPRxDescTab: Pointer on the first Rx desc list
+  * @param  RxBuff: Pointer on the first RxBuffer list
+  * @param  RxBuffCount: Number of the used Rx desc in the list
+  * @retval None
+  */
+void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMAPTPRxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount)
+{
+  uint32_t i = 0;
+  ETH_DMADESCTypeDef *DMAPTPRxDesc;
+
+  /* Set the DMAPTPRxDescToGet pointer with the first one of the DMAPTPRxDescTab list */
+  DMAPTPRxDescToGet = DMAPTPRxDescTab;
+
+  /* Fill each DMAPTPRxDesc descriptor with the right values */
+  for(i=0; i < RxBuffCount; i++)
+  {
+    /* Get the pointer on the ith member of the Rx Desc list */
+    DMAPTPRxDesc = DMAPTPRxDescTab+i;
+
+    /* Set Own bit of the Rx descriptor Status */
+    DMAPTPRxDesc->Status = ETH_DMARxDesc_OWN;
+
+    /* Set Buffer1 size and Second Address Chained bit */
+    DMAPTPRxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE;
+
+    /* Set Buffer1 address pointer */
+    DMAPTPRxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]);
+
+    /* Initialize the next descriptor with the Next Desciptor Polling Enable */
+    if(i < (RxBuffCount-1))
+    {
+      /* Set next descriptor address register with next descriptor base address */
+      DMAPTPRxDesc->Buffer2NextDescAddr = (uint32_t)(DMAPTPRxDescTab+i+1);
+    }
+    else
+    {
+      /* For last descriptor, set next descriptor address register equal to the first descriptor base address */
+      DMAPTPRxDesc->Buffer2NextDescAddr = (uint32_t)(DMAPTPRxDescTab);
+    }
+  }
+
+  /* Set Receive Desciptor List Address Register */
+  ETH->DMARDLAR = (uint32_t) DMAPTPRxDescTab;
+}
+#endif /* USE_ENHANCED_DMA_DESCRIPTORS */
+
+/**
+  * @brief  Transmits a packet, from application buffer, pointed by ppkt with Time Stamp values.
+  * @param  ppkt: pointer to application packet buffer to transmit.
+  * @param  FrameLength: Tx Packet size.
+  * @param  PTPTxTab: Pointer on the first PTP Tx table to store Time stamp values.
+  * @retval ETH_ERROR: in case of Tx desc owned by DMA
+  *         ETH_SUCCESS: for correct transmission
+  */
+uint32_t ETH_HandlePTPTxPkt(uint8_t *ppkt, uint16_t FrameLength, uint32_t *PTPTxTab)
+{
+  uint32_t offset = 0, timeout = 0;
+
+  /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
+  if((DMAPTPTxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET)
+  {
+    /* Return ERROR: OWN bit set */
+    return ETH_ERROR;
+  }
+
+  /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */
+  for(offset=0; offset<FrameLength; offset++)
+  {
+    (*(__IO uint8_t *)((DMAPTPTxDescToSet->Buffer1Addr) + offset)) = (*(ppkt + offset));
+  }
+
+  /* Setting the Frame Length: bits[12:0] */
+  DMAPTPTxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1);
+
+  /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */
+  DMAPTPTxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS;
+
+  /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
+  DMAPTPTxDescToSet->Status |= ETH_DMATxDesc_OWN;
+
+  /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
+  if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET)
+  {
+    /* Clear TBUS ETHERNET DMA flag */
+    ETH->DMASR = ETH_DMASR_TBUS;
+    /* Resume DMA transmission*/
+    ETH->DMATPDR = 0;
+  }
+
+  /* Wait for ETH_DMATxDesc_TTSS flag to be set */
+  do
+  {
+    timeout++;
+  } while (!(DMAPTPTxDescToSet->Status & ETH_DMATxDesc_TTSS) && (timeout < 0xFFFF));
+
+  /* Return ERROR in case of timeout */
+  if(timeout == PHY_READ_TO)
+  {
+    return ETH_ERROR;
+  }
+
+  /* Clear the DMATxDescToSet status register TTSS flag */
+  DMATxDescToSet->Status &= ~ETH_DMATxDesc_TTSS;
+
+  *PTPTxTab++ = DMAPTPTxDescToSet->TimeStampLow;
+  *PTPTxTab = DMAPTPTxDescToSet->TimeStampHigh;
+
+  /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */
+  /* Chained Mode */
+  if((DMAPTPTxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET)
+  {
+    /* Selects the next DMA Tx descriptor list for next buffer to send */
+    DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (DMAPTPTxDescToSet->Buffer2NextDescAddr);
+  }
+  else /* Ring Mode */
+  {
+    if((DMAPTPTxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET)
+    {
+      /* Selects the first DMA Tx descriptor for next buffer to send: last Tx descriptor was used */
+      DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR);
+    }
+    else
+    {
+      /* Selects the next DMA Tx descriptor list for next buffer to send */
+      DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMAPTPTxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2));
+    }
+  }
+
+  /* Return SUCCESS */
+  return ETH_SUCCESS;
+}
+
+/**
+  * @brief  Receives a packet and copies it to memory pointed by ppkt with Time Stamp values.
+  * @param  ppkt: pointer to application packet receive buffer.
+  * @param  PTPRxTab: Pointer on the first PTP Rx table to store Time stamp values.
+  * @retval ETH_ERROR: if there is error in reception
+  *         framelength: received packet size if packet reception is correct
+  */
+uint32_t ETH_HandlePTPRxPkt(uint8_t *ppkt, uint32_t *PTPRxTab)
+{
+  uint32_t offset = 0, framelength = 0;
+
+  /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
+  if((DMAPTPRxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET)
+  {
+    /* Return error: OWN bit set */
+    return ETH_ERROR;
+  }
+
+  if(((DMAPTPRxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) &&
+     ((DMAPTPRxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) &&
+     ((DMAPTPRxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET))
+  {
+    /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
+    framelength = ((DMAPTPRxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARXDESC_FRAME_LENGTHSHIFT) - 4;
+
+    /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */
+    for(offset=0; offset<framelength; offset++)
+    {
+      (*(ppkt + offset)) = (*(__IO uint8_t *)((DMAPTPRxDescToGet->Buffer1Addr) + offset));
+    }
+  }
+  else
+  {
+    /* Return ERROR */
+    framelength = ETH_ERROR;
+  }
+
+  *PTPRxTab++ = DMAPTPRxDescToGet->TimeStampLow;
+  *PTPRxTab = DMAPTPRxDescToGet->TimeStampHigh;
+
+  /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */
+  DMAPTPRxDescToGet->Status = ETH_DMARxDesc_OWN;
+
+  /* When Rx Buffer unavailable flag is set: clear it and resume reception */
+  if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET)
+  {
+    /* Clear RBUS ETHERNET DMA flag */
+    ETH->DMASR = ETH_DMASR_RBUS;
+    /* Resume DMA reception */
+    ETH->DMARPDR = 0;
+  }
+
+  /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */
+  /* Chained Mode */
+  if((DMAPTPRxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET)
+  {
+    /* Selects the next DMA Rx descriptor list for next buffer to read */
+    DMAPTPRxDescToGet = (ETH_DMADESCTypeDef*) (DMAPTPRxDescToGet->Buffer2NextDescAddr);
+  }
+  else /* Ring Mode */
+  {
+    if((DMAPTPRxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET)
+    {
+      /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */
+      DMAPTPRxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR);
+    }
+    else
+    {
+      /* Selects the next DMA Rx descriptor list for next buffer to read */
+      DMAPTPRxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMAPTPRxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2));
+    }
+  }
+
+  /* Return Frame Length/ERROR */
+  return (framelength);
+}
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/
+/*
+ * STM32 Eth Driver for RT-Thread
+ * Change Logs:
+ * Date           Author       Notes
+ * 2009-10-05     Bernard      eth interface driver for STM32F107 CL
+ */
+#include <rtthread.h>
+#include <netif/ethernetif.h>
+#include "lwipopts.h"
+
+/* debug option */
+//#define ETH_DEBUG
+//#define ETH_RX_DUMP
+//#define ETH_TX_DUMP
+
+#ifdef ETH_DEBUG
+#define STM32_ETH_PRINTF          rt_kprintf
+#else
+#define STM32_ETH_PRINTF(...)
+#endif
+
+#define ETH_RXBUFNB        	4
+#define ETH_TXBUFNB        	2
+static ETH_DMADESCTypeDef  DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB];
+static rt_uint8_t Rx_Buff[ETH_RXBUFNB][ETH_MAX_PACKET_SIZE], Tx_Buff[ETH_TXBUFNB][ETH_MAX_PACKET_SIZE];
+
+#define MAX_ADDR_LEN 6
+struct rt_stm32_eth
+{
+	/* inherit from ethernet device */
+	struct eth_device parent;
+
+	/* interface address info. */
+	rt_uint8_t  dev_addr[MAX_ADDR_LEN];			/* hw address	*/
+
+	uint32_t    ETH_Speed; /*!< @ref ETH_Speed */
+	uint32_t    ETH_Mode;  /*!< @ref ETH_Duplex_Mode */
+};
+static struct rt_stm32_eth stm32_eth_device;
+static struct rt_semaphore tx_wait;
+static rt_bool_t tx_is_waiting = RT_FALSE;
+
+/* interrupt service routine */
+void ETH_IRQHandler(void)
+{
+    rt_uint32_t status, ier;
+
+    /* enter interrupt */
+    rt_interrupt_enter();
+
+    status = ETH->DMASR;
+    ier = ETH->DMAIER;
+
+    if(status & ETH_DMA_IT_MMC)
+    {
+        STM32_ETH_PRINTF("ETH_DMA_IT_MMC\r\n");
+        ETH_DMAClearITPendingBit(ETH_DMA_IT_MMC);
+    }
+
+    if(status & ETH_DMA_IT_NIS)
+    {
+        rt_uint32_t nis_clear = ETH_DMA_IT_NIS;
+
+        /* [0]:Transmit Interrupt. */
+        if((status & ier) & ETH_DMA_IT_T) /* packet transmission */
+        {
+            STM32_ETH_PRINTF("ETH_DMA_IT_T\r\n");
+
+            if (tx_is_waiting == RT_TRUE)
+            {
+                tx_is_waiting = RT_FALSE;
+                rt_sem_release(&tx_wait);
+            }
+
+            nis_clear |= ETH_DMA_IT_T;
+        }
+
+        /* [2]:Transmit Buffer Unavailable. */
+
+        /* [6]:Receive Interrupt. */
+        if((status & ier) & ETH_DMA_IT_R) /* packet reception */
+        {
+            STM32_ETH_PRINTF("ETH_DMA_IT_R\r\n");
+            /* a frame has been received */
+            eth_device_ready(&(stm32_eth_device.parent));
+
+            nis_clear |= ETH_DMA_IT_R;
+        }
+
+        /* [14]:Early Receive Interrupt. */
+
+        ETH_DMAClearITPendingBit(nis_clear);
+    }
+
+    if(status & ETH_DMA_IT_AIS)
+    {
+        rt_uint32_t ais_clear = ETH_DMA_IT_AIS;
+        STM32_ETH_PRINTF("ETH_DMA_IT_AIS\r\n");
+
+        /* [1]:Transmit Process Stopped. */
+        if(status & ETH_DMA_IT_TPS)
+        {
+            STM32_ETH_PRINTF("AIS ETH_DMA_IT_TPS\r\n");
+            ais_clear |= ETH_DMA_IT_TPS;
+        }
+
+        /* [3]:Transmit Jabber Timeout. */
+        if(status & ETH_DMA_IT_TJT)
+        {
+            STM32_ETH_PRINTF("AIS ETH_DMA_IT_TJT\r\n");
+            ais_clear |= ETH_DMA_IT_TJT;
+        }
+
+        /* [4]: Receive FIFO Overflow. */
+        if(status & ETH_DMA_IT_RO)
+        {
+            STM32_ETH_PRINTF("AIS ETH_DMA_IT_RO\r\n");
+            ais_clear |= ETH_DMA_IT_RO;
+        }
+
+        /* [5]: Transmit Underflow. */
+        if(status & ETH_DMA_IT_TU)
+        {
+            STM32_ETH_PRINTF("AIS ETH_DMA_IT_TU\r\n");
+            ais_clear |= ETH_DMA_IT_TU;
+        }
+
+        /* [7]: Receive Buffer Unavailable. */
+        if(status & ETH_DMA_IT_RBU)
+        {
+            STM32_ETH_PRINTF("AIS ETH_DMA_IT_RBU\r\n");
+            ais_clear |= ETH_DMA_IT_RBU;
+        }
+
+        /* [8]: Receive Process Stopped. */
+        if(status & ETH_DMA_IT_RPS)
+        {
+            STM32_ETH_PRINTF("AIS ETH_DMA_IT_RPS\r\n");
+            ais_clear |= ETH_DMA_IT_RPS;
+        }
+
+        /* [9]: Receive Watchdog Timeout. */
+        if(status & ETH_DMA_IT_RWT)
+        {
+            STM32_ETH_PRINTF("AIS ETH_DMA_IT_RWT\r\n");
+            ais_clear |= ETH_DMA_IT_RWT;
+        }
+
+        /* [10]: Early Transmit Interrupt. */
+
+        /* [13]: Fatal Bus Error. */
+        if(status & ETH_DMA_IT_FBE)
+        {
+            STM32_ETH_PRINTF("AIS ETH_DMA_IT_FBE\r\n");
+            ais_clear |= ETH_DMA_IT_FBE;
+        }
+
+        ETH_DMAClearITPendingBit(ais_clear);
+    }
+
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+
+/* RT-Thread Device Interface */
+#include <rtthread.h>
+#include <netif/ethernetif.h>
+#include <netif/etharp.h>
+#include <lwip/icmp.h>
+#include "lwipopts.h"
+
+/* initialize the interface */
+static rt_err_t rt_stm32_eth_init(rt_device_t dev)
+{
+    struct rt_stm32_eth * stm32_eth = (struct rt_stm32_eth *)dev;
+    ETH_InitTypeDef ETH_InitStructure;
+
+    /* Enable ETHERNET clock  */
+    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
+                           RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
+
+    SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
+
+    /* Reset ETHERNET on AHB Bus */
+    ETH_DeInit();
+
+    /* Software reset */
+    ETH_SoftwareReset();
+
+    /* Wait for software reset */
+    while (ETH_GetSoftwareResetStatus() == SET);
+
+    /* ETHERNET Configuration --------------------------------------------------*/
+    /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
+    ETH_StructInit(&ETH_InitStructure);
+
+    /* Fill ETH_InitStructure parametrs */
+    /*------------------------   MAC   -----------------------------------*/
+    ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
+    ETH_InitStructure.ETH_Speed = stm32_eth->ETH_Speed;
+    ETH_InitStructure.ETH_Mode  = stm32_eth->ETH_Mode;
+
+    ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
+    ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
+    ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
+    ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;
+    ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;
+    ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
+    ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
+    ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
+#ifdef CHECKSUM_BY_HARDWARE
+    ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;
+#endif
+
+    /*------------------------   DMA   -----------------------------------*/
+
+    /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:
+    the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum,
+    if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */
+    ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
+    ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
+    ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
+
+    ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
+    ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
+    ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
+    ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
+    ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
+    ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
+    ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
+    ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
+
+    /* configure Ethernet */
+    ETH_Init(&ETH_InitStructure);
+
+    /* Enable DMA Receive interrupt (need to enable in this case Normal interrupt) */
+    ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R | ETH_DMA_IT_T, ENABLE);
+
+    /* Initialize Tx Descriptors list: Chain Mode */
+    ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
+    /* Initialize Rx Descriptors list: Chain Mode  */
+    ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
+
+    /* MAC address configuration */
+    ETH_MACAddressConfig(ETH_MAC_Address0, (u8*)&stm32_eth_device.dev_addr[0]);
+
+    /* Enable MAC and DMA transmission and reception */
+    ETH_Start();
+
+    return RT_EOK;
+}
+
+static rt_err_t rt_stm32_eth_open(rt_device_t dev, rt_uint16_t oflag)
+{
+	return RT_EOK;
+}
+
+static rt_err_t rt_stm32_eth_close(rt_device_t dev)
+{
+	return RT_EOK;
+}
+
+static rt_size_t rt_stm32_eth_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
+{
+	rt_set_errno(-RT_ENOSYS);
+	return 0;
+}
+
+static rt_size_t rt_stm32_eth_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
+{
+	rt_set_errno(-RT_ENOSYS);
+	return 0;
+}
+
+static rt_err_t rt_stm32_eth_control(rt_device_t dev, rt_uint8_t cmd, void *args)
+{
+	switch(cmd)
+	{
+	case NIOCTL_GADDR:
+		/* get mac address */
+		if(args) rt_memcpy(args, stm32_eth_device.dev_addr, 6);
+		else return -RT_ERROR;
+		break;
+
+	default :
+		break;
+	}
+
+	return RT_EOK;
+}
+
+/* ethernet device interface */
+/* transmit packet. */
+rt_err_t rt_stm32_eth_tx( rt_device_t dev, struct pbuf* p)
+{
+    struct pbuf* q;
+    rt_uint32_t offset;
+
+    /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
+    while ((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET)
+    {
+        rt_err_t result;
+        rt_uint32_t level;
+
+        level = rt_hw_interrupt_disable();
+        tx_is_waiting = RT_TRUE;
+        rt_hw_interrupt_enable(level);
+
+        /* it's own bit set, wait it */
+        result = rt_sem_take(&tx_wait, RT_WAITING_FOREVER);
+        if (result == RT_EOK) break;
+        if (result == -RT_ERROR) return -RT_ERROR;
+    }
+
+    offset = 0;
+    for (q = p; q != NULL; q = q->next)
+    {
+        uint8_t *to;
+
+        /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */
+        to = (uint8_t*)((DMATxDescToSet->Buffer1Addr) + offset);
+        memcpy(to, q->payload, q->len);
+        offset += q->len;
+    }
+#ifdef ETH_TX_DUMP
+    {
+        rt_uint32_t i;
+        rt_uint8_t *ptr = (rt_uint8_t*)(DMATxDescToSet->Buffer1Addr);
+
+        STM32_ETH_PRINTF("tx_dump, len:%d\r\n", p->tot_len);
+        for(i=0; i<p->tot_len; i++)
+        {
+            STM32_ETH_PRINTF("%02x ",*ptr);
+            ptr++;
+
+            if(((i+1)%8) == 0)
+            {
+                STM32_ETH_PRINTF("  ");
+            }
+            if(((i+1)%16) == 0)
+            {
+                STM32_ETH_PRINTF("\r\n");
+            }
+        }
+        STM32_ETH_PRINTF("\r\ndump done!\r\n");
+    }
+#endif
+
+    /* Setting the Frame Length: bits[12:0] */
+    DMATxDescToSet->ControlBufferSize = (p->tot_len & ETH_DMATxDesc_TBS1);
+    /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */
+    DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS;
+    /* Enable TX Completion Interrupt */
+    DMATxDescToSet->Status |= ETH_DMATxDesc_IC;
+#ifdef CHECKSUM_BY_HARDWARE
+    DMATxDescToSet->Status |= ETH_DMATxDesc_ChecksumTCPUDPICMPFull;
+    /* clean ICMP checksum STM32F need */
+    {
+        struct eth_hdr *ethhdr = (struct eth_hdr *)(DMATxDescToSet->Buffer1Addr);
+        /* is IP ? */
+        if( ethhdr->type == htons(ETHTYPE_IP) )
+        {
+            struct ip_hdr *iphdr = (struct ip_hdr *)(DMATxDescToSet->Buffer1Addr + SIZEOF_ETH_HDR);
+            /* is ICMP ? */
+            if( IPH_PROTO(iphdr) == IP_PROTO_ICMP )
+            {
+                struct icmp_echo_hdr *iecho = (struct icmp_echo_hdr *)(DMATxDescToSet->Buffer1Addr + SIZEOF_ETH_HDR + sizeof(struct ip_hdr) );
+                iecho->chksum = 0;
+            }
+        }
+    }
+#endif
+    /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
+    DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
+    /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
+    if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET)
+    {
+        /* Clear TBUS ETHERNET DMA flag */
+        ETH->DMASR = ETH_DMASR_TBUS;
+        /* Transmit Poll Demand to resume DMA transmission*/
+        ETH->DMATPDR = 0;
+    }
+
+    /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */
+    /* Chained Mode */
+    /* Selects the next DMA Tx descriptor list for next buffer to send */
+    DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr);
+
+    /* Return SUCCESS */
+    return RT_EOK;
+}
+
+/* reception packet. */
+struct pbuf *rt_stm32_eth_rx(rt_device_t dev)
+{
+    struct pbuf* p;
+    rt_uint32_t offset = 0, framelength = 0;
+
+    /* init p pointer */
+    p = RT_NULL;
+
+    /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
+    if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET))
+        return p;
+
+    if (((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) &&
+            ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) &&
+            ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET))
+    {
+        /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
+        framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARXDESC_FRAME_LENGTHSHIFT) - 4;
+
+        /* allocate buffer */
+        p = pbuf_alloc(PBUF_LINK, framelength, PBUF_RAM);
+        if (p != RT_NULL)
+        {
+            struct pbuf* q;
+
+            for (q = p; q != RT_NULL; q= q->next)
+            {
+                /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */
+                memcpy(q->payload, (uint8_t *)((DMARxDescToGet->Buffer1Addr) + offset), q->len);
+                offset += q->len;
+            }
+#ifdef ETH_RX_DUMP
+            {
+                rt_uint32_t i;
+                rt_uint8_t *ptr = (rt_uint8_t*)(DMARxDescToGet->Buffer1Addr);
+
+                STM32_ETH_PRINTF("rx_dump, len:%d\r\n", p->tot_len);
+                for(i=0; i<p->tot_len; i++)
+                {
+                    STM32_ETH_PRINTF("%02x ", *ptr);
+                    ptr++;
+
+                    if(((i+1)%8) == 0)
+                    {
+                        STM32_ETH_PRINTF("  ");
+                    }
+                    if(((i+1)%16) == 0)
+                    {
+                        STM32_ETH_PRINTF("\r\n");
+                    }
+                }
+                STM32_ETH_PRINTF("\r\ndump done!\r\n");
+            }
+#endif
+        }
+    }
+
+    /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */
+    DMARxDescToGet->Status = ETH_DMARxDesc_OWN;
+
+    /* When Rx Buffer unavailable flag is set: clear it and resume reception */
+    if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET)
+    {
+        /* Clear RBUS ETHERNET DMA flag */
+        ETH->DMASR = ETH_DMASR_RBUS;
+        /* Resume DMA reception */
+        ETH->DMARPDR = 0;
+    }
+
+    /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */
+    /* Chained Mode */
+    if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET)
+    {
+        /* Selects the next DMA Rx descriptor list for next buffer to read */
+        DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
+    }
+    else /* Ring Mode */
+    {
+        if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET)
+        {
+            /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */
+            DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR);
+        }
+        else
+        {
+            /* Selects the next DMA Rx descriptor list for next buffer to read */
+            DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2));
+        }
+    }
+
+    return p;
+}
+
+static void NVIC_Configuration(void)
+{
+    NVIC_InitTypeDef NVIC_InitStructure;
+
+    /* Enable the Ethernet global Interrupt */
+    NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+}
+
+/*
+ * GPIO Configuration for ETH
+ */
+static void GPIO_Configuration(void)
+{
+    GPIO_InitTypeDef GPIO_InitStructure;
+
+    /* Enable SYSCFG clock */
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
+    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC, ENABLE);
+
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
+    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
+    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
+
+    /* config MDIO and MDC. */
+    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); /* config ETH_MDIO */
+    GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); /* config ETH_MDC */
+    /* config PA2: MDIO */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
+    GPIO_Init(GPIOA, &GPIO_InitStructure);
+    /* config PC1: MDC */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
+    GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+    /* Ethernet pins configuration ************************************************/
+#if defined(MII_MODE)
+/*
+    ETH_MDIO ------------> PA2
+    ETH_MDC -------------> PC1
+
+    ETH_MII_CRS ---------> PA0
+    ETH_MII_COL ---------> PA3
+
+    ETH_MII_RX_CLK ------> PA1
+    ETH_MII_RX_ER -------> PB10
+    ETH_MII_RX_ER -------> PI10
+    ETH_MII_RX_DV -------> PA7
+    ETH_MII_RXD0 --------> PC4
+    ETH_MII_RXD1 --------> PC5
+    ETH_MII_RXD2 --------> PB0
+    ETH_MII_RXD3 --------> PB1
+
+    ETH_MII_TX_EN -------> PB11
+    ETH_MII_TX_EN -------> PG11
+    ETH_MII_TX_CLK ------> PC3
+    ETH_MII_TXD0 --------> PB12
+    ETH_MII_TXD0 --------> PG13
+    ETH_MII_TXD1 --------> PB13
+    ETH_MII_TXD1 --------> PG14
+    ETH_MII_TXD2 --------> PC2
+    ETH_MII_TXD3 --------> PB8
+    ETH_MII_TXD3  -------> PE2
+*/
+
+#error insert MII GPIO initial.
+#elif defined(RMII_MODE)
+/*
+    ETH_MDIO ------------> PA2
+    ETH_MDC -------------> PC1
+
+    ETH_RMII_REF_CLK ----> PA1
+
+    ETH_RMII_CRS_DV -----> PA7
+    ETH_RMII_RXD0 -------> PC4
+    ETH_RMII_RXD1 -------> PC5
+
+    ETH_RMII_TX_EN ------> PG11
+    ETH_RMII_TXD0 -------> PG13
+    ETH_RMII_TXD1 -------> PG14
+
+    ETH_RMII_TX_EN ------> PB11
+    ETH_RMII_TXD0 -------> PB12
+    ETH_RMII_TXD1 -------> PB13
+*/
+    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); /* RMII_REF_CLK */
+    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); /* RMII_CRS_DV */
+
+    /* configure PA1:RMII_REF_CLK, PA7:RMII_CRS_DV. */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7;
+    GPIO_Init(GPIOA, &GPIO_InitStructure);
+
+    GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); /* RMII_RXD0 */
+    GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); /* RMII_RXD1 */
+
+    /* configure PC4:RMII_RXD0, PC5:RMII_RXD1. */
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
+    GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+#   if RMII_TX_GPIO_GROUP == 1
+    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
+
+    GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH); /* RMII_TX_EN */
+    GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH); /* RMII_TXD0 */
+    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH); /* RMII_TXD1 */
+
+    /* configure PB11:RMII_TX_EN, PB12:RMII_TXD0, PB13:RMII_TXD1 */
+    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
+#   elif RMII_TX_GPIO_GROUP == 2
+    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
+
+    GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH); /* RMII_TX_EN */
+    GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH); /* RMII_TXD0 */
+    GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH); /* RMII_TXD1 */
+
+    /* configure PG11:RMII_TX_EN, PG13:RMII_TXD0, PG14:RMII_TXD1 */
+    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14;
+    GPIO_Init(GPIOG, &GPIO_InitStructure);
+#   else
+#   error RMII_TX_GPIO_GROUP setting error!
+#   endif /*RMII_TX_GPIO_GROUP */
+#endif /* RMII_MODE */
+}
+
+/* PHY: LAN8720 */
+static uint8_t phy_speed = 0;
+#define PHY_LINK_MASK       (1<<0)
+#define PHY_100M_MASK       (1<<1)
+#define PHY_DUPLEX_MASK     (1<<2)
+static void phy_monitor_thread_entry(void *parameter)
+{
+    uint8_t phy_addr = 0xFF;
+    uint8_t phy_speed_new = 0;
+
+    /* phy search */
+    {
+        rt_uint32_t i;
+        rt_uint16_t temp;
+
+        for(i=0; i<=0x1F; i++)
+        {
+            temp = ETH_ReadPHYRegister(i, 0x02);
+
+            if( temp != 0xFFFF )
+            {
+                phy_addr = i;
+                break;
+            }
+        }
+    } /* phy search */
+
+    if(phy_addr == 0xFF)
+    {
+        STM32_ETH_PRINTF("phy not probe!\r\n");
+        return;
+    }
+    else
+    {
+        STM32_ETH_PRINTF("found a phy, address:0x%02X\r\n", phy_addr);
+    }
+
+    /* RESET PHY */
+    STM32_ETH_PRINTF("RESET PHY!\r\n");
+    ETH_WritePHYRegister(phy_addr, PHY_BCR, PHY_Reset);
+    rt_thread_delay(RT_TICK_PER_SECOND * 2);
+    ETH_WritePHYRegister(phy_addr, PHY_BCR, PHY_AutoNegotiation);
+
+    while(1)
+    {
+        uint16_t status  = ETH_ReadPHYRegister(phy_addr, PHY_BSR);
+        STM32_ETH_PRINTF("LAN8720 status:0x%04X\r\n", status);
+
+        phy_speed_new = 0;
+
+        if(status & (PHY_AutoNego_Complete | PHY_Linked_Status))
+        {
+            uint16_t SR;
+
+            SR = ETH_ReadPHYRegister(phy_addr, 31);
+            STM32_ETH_PRINTF("LAN8720 REG 31:0x%04X\r\n", SR);
+
+            SR = (SR >> 2) & 0x07; /* LAN8720, REG31[4:2], Speed Indication. */
+            phy_speed_new = PHY_LINK_MASK;
+
+            if((SR & 0x03) == 2)
+            {
+                phy_speed_new |= PHY_100M_MASK;
+            }
+
+            if(SR & 0x04)
+            {
+                phy_speed_new |= PHY_DUPLEX_MASK;
+            }
+        }
+
+        /* linkchange */
+        if(phy_speed_new != phy_speed)
+        {
+            if(phy_speed_new & PHY_LINK_MASK)
+            {
+                STM32_ETH_PRINTF("link up ");
+
+                if(phy_speed_new & PHY_100M_MASK)
+                {
+                    STM32_ETH_PRINTF("100Mbps");
+                    stm32_eth_device.ETH_Speed = ETH_Speed_100M;
+                }
+                else
+                {
+                    stm32_eth_device.ETH_Speed = ETH_Speed_10M;
+                    STM32_ETH_PRINTF("10Mbps");
+                }
+
+                if(phy_speed_new & PHY_DUPLEX_MASK)
+                {
+                    STM32_ETH_PRINTF(" full-duplex\r\n");
+                    stm32_eth_device.ETH_Mode = ETH_Mode_FullDuplex;
+                }
+                else
+                {
+                    STM32_ETH_PRINTF(" half-duplex\r\n");
+                    stm32_eth_device.ETH_Mode = ETH_Mode_HalfDuplex;
+                }
+                rt_stm32_eth_init((rt_device_t)&stm32_eth_device);
+
+                /* send link up. */
+                eth_device_linkchange(&stm32_eth_device.parent, RT_TRUE);
+            } /* link up. */
+            else
+            {
+                STM32_ETH_PRINTF("link down\r\n");
+                /* send link down. */
+                eth_device_linkchange(&stm32_eth_device.parent, RT_FALSE);
+            } /* link down. */
+
+            phy_speed = phy_speed_new;
+        } /* linkchange */
+
+        rt_thread_delay(RT_TICK_PER_SECOND);
+    } /* while(1) */
+}
+
+void rt_hw_stm32_eth_init(void)
+{
+    /* PHY RESET: PC0 */
+    {
+        GPIO_InitTypeDef GPIO_InitStructure;
+
+        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
+        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
+        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
+
+        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
+
+        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
+        GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+        GPIO_ResetBits(GPIOC, GPIO_Pin_0);
+        rt_thread_delay(2);
+        GPIO_SetBits(GPIOC, GPIO_Pin_0);
+        rt_thread_delay(2);
+    }
+
+    GPIO_Configuration();
+    NVIC_Configuration();
+
+    stm32_eth_device.ETH_Speed = ETH_Speed_100M;
+    stm32_eth_device.ETH_Mode  = ETH_Mode_FullDuplex;
+
+    /* OUI 00-80-E1 STMICROELECTRONICS. */
+    stm32_eth_device.dev_addr[0] = 0x00;
+    stm32_eth_device.dev_addr[1] = 0x80;
+    stm32_eth_device.dev_addr[2] = 0xE1;
+    /* generate MAC addr from 96bit unique ID (only for test). */
+    stm32_eth_device.dev_addr[3] = *(rt_uint8_t*)(0x1FFF7A10+4);
+    stm32_eth_device.dev_addr[4] = *(rt_uint8_t*)(0x1FFF7A10+2);
+    stm32_eth_device.dev_addr[5] = *(rt_uint8_t*)(0x1FFF7A10+0);
+
+    stm32_eth_device.parent.parent.init       = rt_stm32_eth_init;
+    stm32_eth_device.parent.parent.open       = rt_stm32_eth_open;
+    stm32_eth_device.parent.parent.close      = rt_stm32_eth_close;
+    stm32_eth_device.parent.parent.read       = rt_stm32_eth_read;
+    stm32_eth_device.parent.parent.write      = rt_stm32_eth_write;
+    stm32_eth_device.parent.parent.control    = rt_stm32_eth_control;
+    stm32_eth_device.parent.parent.user_data  = RT_NULL;
+
+    stm32_eth_device.parent.eth_rx     = rt_stm32_eth_rx;
+    stm32_eth_device.parent.eth_tx     = rt_stm32_eth_tx;
+
+    /* init tx semaphore */
+    rt_sem_init(&tx_wait, "tx_wait", 0, RT_IPC_FLAG_FIFO);
+
+    /* register eth device */
+    eth_device_init(&(stm32_eth_device.parent), "e0");
+
+    /* start phy monitor */
+    {
+        rt_thread_t tid;
+        tid = rt_thread_create("phy",
+                               phy_monitor_thread_entry,
+                               RT_NULL,
+                               512,
+                               RT_THREAD_PRIORITY_MAX - 2,
+                               2);
+        if (tid != RT_NULL)
+            rt_thread_startup(tid);
+    }
+}

+ 1874 - 0
bsp/stm32f40x/drivers/stm32f4xx_eth.h

@@ -0,0 +1,1874 @@
+/**
+  ******************************************************************************
+  * @file    stm32f2xx_eth.h
+  * @author  MCD Application Team
+  * @version V0.0.1
+  * @date    10/21/2010
+  * @brief   This file contains all the functions prototypes for the Ethernet
+  *          firmware library.
+  ******************************************************************************
+  * @copy
+  *
+  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+  *
+  * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>
+  */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F2XX_ETH_H
+#define __STM32F2XX_ETH_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f4xx.h"
+
+/* Uncomment this line when using time stamping and/or IPv4 checksum offload */
+#define USE_ENHANCED_DMA_DESCRIPTORS
+
+/**
+ * @brief Uncomment the line below if you want to use user defined Delay function
+ *        (for precise timing), otherwise default _eth_delay_ function defined within
+ *        this driver is used (less precise timing).
+ */
+/* #define USE_Delay */
+
+#ifdef USE_Delay
+#include "main.h"
+  #define _eth_delay_    Delay     /*!< User can provide more timing precise _eth_delay_ function */
+#else
+  #define _eth_delay_    ETH_Delay /*!< Default _eth_delay_ function with less precise timing */
+#endif
+
+/** @addtogroup STM32F2XX_ETH_Driver
+  * @{
+  */
+
+/** @defgroup ETH_Exported_Types
+  * @{
+  */
+
+/**
+  * @brief  ETH MAC Init structure definition
+  * @note   The user should not configure all the ETH_InitTypeDef structure's fields.
+  *   By calling the ETH_StructInit function the structure’s fields are set to their default values.
+  *   Only the parameters that will be set to a non-default value should be configured.
+  */
+typedef struct {
+/**
+  * @brief / * MAC
+  */
+  uint32_t             ETH_AutoNegotiation;           /*!< Selects or not the AutoNegotiation mode for the external PHY
+                                                           The AutoNegotiation allows an automatic setting of the Speed (10/100Mbps)
+                                                           and the mode (half/full-duplex).
+                                                           This parameter can be a value of @ref ETH_AutoNegotiation */
+
+  uint32_t             ETH_Watchdog;                  /*!< Selects or not the Watchdog timer
+                                                           When enabled, the MAC allows no more then 2048 bytes to be received.
+                                                           When disabled, the MAC can receive up to 16384 bytes.
+                                                           This parameter can be a value of @ref ETH_watchdog */
+
+  uint32_t             ETH_Jabber;                    /*!< Selects or not Jabber timer
+                                                           When enabled, the MAC allows no more then 2048 bytes to be sent.
+                                                           When disabled, the MAC can send up to 16384 bytes.
+                                                           This parameter can be a value of @ref ETH_Jabber */
+
+  uint32_t             ETH_InterFrameGap;             /*!< Selects the minimum IFG between frames during transmission
+                                                           This parameter can be a value of @ref ETH_Inter_Frame_Gap */
+
+  uint32_t             ETH_CarrierSense;              /*!< Selects or not the Carrier Sense
+                                                           This parameter can be a value of @ref ETH_Carrier_Sense */
+
+  uint32_t             ETH_Speed;                     /*!< Sets the Ethernet speed: 10/100 Mbps
+                                                           This parameter can be a value of @ref ETH_Speed */
+
+  uint32_t             ETH_ReceiveOwn;                /*!< Selects or not the ReceiveOwn
+                                                           ReceiveOwn allows the reception of frames when the TX_EN signal is asserted
+                                                           in Half-Duplex mode
+                                                           This parameter can be a value of @ref ETH_Receive_Own */
+
+  uint32_t             ETH_LoopbackMode;              /*!< Selects or not the internal MAC MII Loopback mode
+                                                           This parameter can be a value of @ref ETH_Loop_Back_Mode */
+
+  uint32_t             ETH_Mode;                      /*!< Selects the MAC duplex mode: Half-Duplex or Full-Duplex mode
+                                                           This parameter can be a value of @ref ETH_Duplex_Mode */
+
+  uint32_t             ETH_ChecksumOffload;           /*!< Selects or not the IPv4 checksum checking for received frame payloads' TCP/UDP/ICMP headers.
+                                                           This parameter can be a value of @ref ETH_Checksum_Offload */
+
+  uint32_t             ETH_RetryTransmission;         /*!< Selects or not the MAC attempt retries transmission, based on the settings of BL,
+                                                           when a colision occurs (Half-Duplex mode)
+                                                           This parameter can be a value of @ref ETH_Retry_Transmission */
+
+  uint32_t             ETH_AutomaticPadCRCStrip;      /*!< Selects or not the Automatic MAC Pad/CRC Stripping
+                                                           This parameter can be a value of @ref ETH_Automatic_Pad_CRC_Strip */
+
+  uint32_t             ETH_BackOffLimit;              /*!< Selects the BackOff limit value
+                                                           This parameter can be a value of @ref ETH_Back_Off_Limit */
+
+  uint32_t             ETH_DeferralCheck;             /*!< Selects or not the deferral check function (Half-Duplex mode)
+                                                           This parameter can be a value of @ref ETH_Deferral_Check */
+
+  uint32_t             ETH_ReceiveAll;                /*!< Selects or not all frames reception by the MAC (No fitering)
+                                                           This parameter can be a value of @ref ETH_Receive_All */
+
+  uint32_t             ETH_SourceAddrFilter;          /*!< Selects the Source Address Filter mode
+                                                           This parameter can be a value of @ref ETH_Source_Addr_Filter */
+
+  uint32_t             ETH_PassControlFrames;         /*!< Sets the forwarding mode of the control frames (including unicast and multicast PAUSE frames)
+                                                           This parameter can be a value of @ref ETH_Pass_Control_Frames */
+
+  uint32_t             ETH_BroadcastFramesReception;  /*!< Selects or not the reception of Broadcast Frames
+                                                           This parameter can be a value of @ref ETH_Broadcast_Frames_Reception */
+
+  uint32_t             ETH_DestinationAddrFilter;     /*!< Sets the destination filter mode for both unicast and multicast frames
+                                                           This parameter can be a value of @ref ETH_Destination_Addr_Filter */
+
+  uint32_t             ETH_PromiscuousMode;           /*!< Selects or not the Promiscuous Mode
+                                                           This parameter can be a value of @ref ETH_Promiscuous_Mode */
+
+  uint32_t             ETH_MulticastFramesFilter;     /*!< Selects the Multicast Frames filter mode: None/HashTableFilter/PerfectFilter/PerfectHashTableFilter
+                                                           This parameter can be a value of @ref ETH_Multicast_Frames_Filter */
+
+  uint32_t             ETH_UnicastFramesFilter;       /*!< Selects the Unicast Frames filter mode: HashTableFilter/PerfectFilter/PerfectHashTableFilter
+                                                           This parameter can be a value of @ref ETH_Unicast_Frames_Filter */
+
+  uint32_t             ETH_HashTableHigh;             /*!< This field holds the higher 32 bits of Hash table.  */
+
+  uint32_t             ETH_HashTableLow;              /*!< This field holds the lower 32 bits of Hash table.  */
+
+  uint32_t             ETH_PauseTime;                 /*!< This field holds the value to be used in the Pause Time field in the
+                                                           transmit control frame */
+
+  uint32_t             ETH_ZeroQuantaPause;           /*!< Selects or not the automatic generation of Zero-Quanta Pause Control frames
+                                                           This parameter can be a value of @ref ETH_Zero_Quanta_Pause */
+
+  uint32_t             ETH_PauseLowThreshold;         /*!< This field configures the threshold of the PAUSE to be checked for
+                                                           automatic retransmission of PAUSE Frame
+                                                           This parameter can be a value of @ref ETH_Pause_Low_Threshold */
+
+  uint32_t             ETH_UnicastPauseFrameDetect;   /*!< Selects or not the MAC detection of the Pause frames (with MAC Address0
+                                                           unicast address and unique multicast address)
+                                                           This parameter can be a value of @ref ETH_Unicast_Pause_Frame_Detect */
+
+  uint32_t             ETH_ReceiveFlowControl;        /*!< Enables or disables the MAC to decode the received Pause frame and
+                                                           disable its transmitter for a specified time (Pause Time)
+                                                           This parameter can be a value of @ref ETH_Receive_Flow_Control */
+
+  uint32_t             ETH_TransmitFlowControl;       /*!< Enables or disables the MAC to transmit Pause frames (Full-Duplex mode)
+                                                           or the MAC back-pressure operation (Half-Duplex mode)
+                                                           This parameter can be a value of @ref ETH_Transmit_Flow_Control */
+
+  uint32_t             ETH_VLANTagComparison;         /*!< Selects the 12-bit VLAN identifier or the complete 16-bit VLAN tag for
+                                                           comparison and filtering
+                                                           This parameter can be a value of @ref ETH_VLAN_Tag_Comparison */
+
+  uint32_t             ETH_VLANTagIdentifier;         /*!< Holds the VLAN tag identifier for receive frames */
+
+/**
+  * @brief / * DMA
+  */
+
+  uint32_t             ETH_DropTCPIPChecksumErrorFrame; /*!< Selects or not the Dropping of TCP/IP Checksum Error Frames
+                                                             This parameter can be a value of @ref ETH_Drop_TCP_IP_Checksum_Error_Frame */
+
+  uint32_t             ETH_ReceiveStoreForward;         /*!< Enables or disables the Receive store and forward mode
+                                                             This parameter can be a value of @ref ETH_Receive_Store_Forward */
+
+  uint32_t             ETH_FlushReceivedFrame;          /*!< Enables or disables the flushing of received frames
+                                                             This parameter can be a value of @ref ETH_Flush_Received_Frame */
+
+  uint32_t             ETH_TransmitStoreForward;        /*!< Enables or disables Transmit store and forward mode
+                                                             This parameter can be a value of @ref ETH_Transmit_Store_Forward */
+
+  uint32_t             ETH_TransmitThresholdControl;    /*!< Selects or not the Transmit Threshold Control
+                                                             This parameter can be a value of @ref ETH_Transmit_Threshold_Control */
+
+  uint32_t             ETH_ForwardErrorFrames;          /*!< Selects or not the forward to the DMA of erroneous frames
+                                                             This parameter can be a value of @ref ETH_Forward_Error_Frames */
+
+  uint32_t             ETH_ForwardUndersizedGoodFrames; /*!< Enables or disables the Rx FIFO to forward Undersized frames (frames with no Error
+                                                             and length less than 64 bytes) including pad-bytes and CRC)
+                                                             This parameter can be a value of @ref ETH_Forward_Undersized_Good_Frames */
+
+  uint32_t             ETH_ReceiveThresholdControl;     /*!< Selects the threshold level of the Receive FIFO
+                                                             This parameter can be a value of @ref ETH_Receive_Threshold_Control */
+
+  uint32_t             ETH_SecondFrameOperate;          /*!< Selects or not the Operate on second frame mode, which allows the DMA to process a second
+                                                             frame of Transmit data even before obtaining the status for the first frame.
+                                                             This parameter can be a value of @ref ETH_Second_Frame_Operate */
+
+  uint32_t             ETH_AddressAlignedBeats;         /*!< Enables or disables the Address Aligned Beats
+                                                             This parameter can be a value of @ref ETH_Address_Aligned_Beats */
+
+  uint32_t             ETH_FixedBurst;                  /*!< Enables or disables the AHB Master interface fixed burst transfers
+                                                             This parameter can be a value of @ref ETH_Fixed_Burst */
+
+  uint32_t             ETH_RxDMABurstLength;            /*!< Indicates the maximum number of beats to be transferred in one Rx DMA transaction
+                                                             This parameter can be a value of @ref ETH_Rx_DMA_Burst_Length */
+
+  uint32_t             ETH_TxDMABurstLength;            /*!< Indicates sthe maximum number of beats to be transferred in one Tx DMA transaction
+                                                             This parameter can be a value of @ref ETH_Tx_DMA_Burst_Length */
+
+  uint32_t             ETH_DescriptorSkipLength;        /*!< Specifies the number of word to skip between two unchained descriptors (Ring mode) */
+
+  uint32_t             ETH_DMAArbitration;              /*!< Selects the DMA Tx/Rx arbitration
+                                                             This parameter can be a value of @ref ETH_DMA_Arbitration */
+}ETH_InitTypeDef;
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                           DMA descriptors types
+  */
+/**--------------------------------------------------------------------------**/
+
+/**
+  * @brief  ETH DMA Desciptors data structure definition
+  */
+typedef struct  {
+  uint32_t   Status;                /*!< Status */
+  uint32_t   ControlBufferSize;     /*!< Control and Buffer1, Buffer2 lengths */
+  uint32_t   Buffer1Addr;           /*!< Buffer1 address pointer */
+  uint32_t   Buffer2NextDescAddr;   /*!< Buffer2 or next descriptor address pointer */
+/* Enhanced ETHERNET DMA PTP Desciptors */
+#ifdef USE_ENHANCED_DMA_DESCRIPTORS
+  uint32_t   ExtendedStatus;        /* Extended status for PTP receive descriptor */
+  uint32_t   Reserved1;             /* Reserved */
+  uint32_t   TimeStampLow;          /* Time Stamp Low value for transmit and receive */
+  uint32_t   TimeStampHigh;         /* Time Stamp High value for transmit and receive */
+#endif /* USE_ENHANCED_DMA_DESCRIPTORS */
+} ETH_DMADESCTypeDef;
+
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Exported_Constants
+  * @{
+  */
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                          ETH Frames defines
+  */
+/**--------------------------------------------------------------------------**/
+
+/** @defgroup ENET_Buffers_setting
+  * @{
+  */
+#define ETH_MAX_PACKET_SIZE    1520    /*!< ETH_HEADER + ETH_EXTRA + MAX_ETH_PAYLOAD + ETH_CRC */
+#define ETH_HEADER               14    /*!< 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */
+#define ETH_CRC                   4    /*!< Ethernet CRC */
+#define ETH_EXTRA                 2    /*!< Extra bytes in some cases */
+#define VLAN_TAG                  4    /*!< optional 802.1q VLAN Tag */
+#define MIN_ETH_PAYLOAD          46    /*!< Minimum Ethernet payload size */
+#define MAX_ETH_PAYLOAD        1500    /*!< Maximum Ethernet payload size */
+#define JUMBO_FRAME_PAYLOAD    9000    /*!< Jumbo frame payload size */
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                 Ethernet DMA descriptors registers bits definition
+  */
+/**--------------------------------------------------------------------------**/
+
+/**
+@code
+   DMA Tx Desciptor
+  -----------------------------------------------------------------------------------------------
+  TDES0 | OWN(31) | CTRL[30:26] | Reserved[25:24] | CTRL[23:20] | Reserved[19:17] | Status[16:0] |
+  -----------------------------------------------------------------------------------------------
+  TDES1 | Reserved[31:29] | Buffer2 ByteCount[28:16] | Reserved[15:13] | Buffer1 ByteCount[12:0] |
+  -----------------------------------------------------------------------------------------------
+  TDES2 |                         Buffer1 Address [31:0]                                         |
+  -----------------------------------------------------------------------------------------------
+  TDES3 |                   Buffer2 Address [31:0] / Next Desciptor Address [31:0]               |
+  -----------------------------------------------------------------------------------------------
+@endcode
+*/
+
+/**
+  * @brief  Bit definition of TDES0 register: DMA Tx descriptor status register
+  */
+#define ETH_DMATxDesc_OWN                     ((uint32_t)0x80000000)  /*!< OWN bit: descriptor is owned by DMA engine */
+#define ETH_DMATxDesc_IC                      ((uint32_t)0x40000000)  /*!< Interrupt on Completion */
+#define ETH_DMATxDesc_LS                      ((uint32_t)0x20000000)  /*!< Last Segment */
+#define ETH_DMATxDesc_FS                      ((uint32_t)0x10000000)  /*!< First Segment */
+#define ETH_DMATxDesc_DC                      ((uint32_t)0x08000000)  /*!< Disable CRC */
+#define ETH_DMATxDesc_DP                      ((uint32_t)0x04000000)  /*!< Disable Padding */
+#define ETH_DMATxDesc_TTSE                    ((uint32_t)0x02000000)  /*!< Transmit Time Stamp Enable */
+#define ETH_DMATxDesc_CIC                     ((uint32_t)0x00C00000)  /*!< Checksum Insertion Control: 4 cases */
+#define ETH_DMATxDesc_CIC_ByPass              ((uint32_t)0x00000000)  /*!< Do Nothing: Checksum Engine is bypassed */
+#define ETH_DMATxDesc_CIC_IPV4Header          ((uint32_t)0x00400000)  /*!< IPV4 header Checksum Insertion */
+#define ETH_DMATxDesc_CIC_TCPUDPICMP_Segment  ((uint32_t)0x00800000)  /*!< TCP/UDP/ICMP Checksum Insertion calculated over segment only */
+#define ETH_DMATxDesc_CIC_TCPUDPICMP_Full     ((uint32_t)0x00C00000)  /*!< TCP/UDP/ICMP Checksum Insertion fully calculated */
+#define ETH_DMATxDesc_TER                     ((uint32_t)0x00200000)  /*!< Transmit End of Ring */
+#define ETH_DMATxDesc_TCH                     ((uint32_t)0x00100000)  /*!< Second Address Chained */
+#define ETH_DMATxDesc_TTSS                    ((uint32_t)0x00020000)  /*!< Tx Time Stamp Status */
+#define ETH_DMATxDesc_IHE                     ((uint32_t)0x00010000)  /*!< IP Header Error */
+#define ETH_DMATxDesc_ES                      ((uint32_t)0x00008000)  /*!< Error summary: OR of the following bits: UE || ED || EC || LCO || NC || LCA || FF || JT */
+#define ETH_DMATxDesc_JT                      ((uint32_t)0x00004000)  /*!< Jabber Timeout */
+#define ETH_DMATxDesc_FF                      ((uint32_t)0x00002000)  /*!< Frame Flushed: DMA/MTL flushed the frame due to SW flush */
+#define ETH_DMATxDesc_PCE                     ((uint32_t)0x00001000)  /*!< Payload Checksum Error */
+#define ETH_DMATxDesc_LCA                     ((uint32_t)0x00000800)  /*!< Loss of Carrier: carrier lost during tramsmission */
+#define ETH_DMATxDesc_NC                      ((uint32_t)0x00000400)  /*!< No Carrier: no carrier signal from the tranceiver */
+#define ETH_DMATxDesc_LCO                     ((uint32_t)0x00000200)  /*!< Late Collision: transmission aborted due to collision */
+#define ETH_DMATxDesc_EC                      ((uint32_t)0x00000100)  /*!< Excessive Collision: transmission aborted after 16 collisions */
+#define ETH_DMATxDesc_VF                      ((uint32_t)0x00000080)  /*!< VLAN Frame */
+#define ETH_DMATxDesc_CC                      ((uint32_t)0x00000078)  /*!< Collision Count */
+#define ETH_DMATxDesc_ED                      ((uint32_t)0x00000004)  /*!< Excessive Deferral */
+#define ETH_DMATxDesc_UF                      ((uint32_t)0x00000002)  /*!< Underflow Error: late data arrival from the memory */
+#define ETH_DMATxDesc_DB                      ((uint32_t)0x00000001)  /*!< Deferred Bit */
+
+/**
+  * @brief  Bit definition of TDES1 register
+  */
+#define ETH_DMATxDesc_TBS2  ((uint32_t)0x1FFF0000)  /*!< Transmit Buffer2 Size */
+#define ETH_DMATxDesc_TBS1  ((uint32_t)0x00001FFF)  /*!< Transmit Buffer1 Size */
+
+/**
+  * @brief  Bit definition of TDES2 register
+  */
+#define ETH_DMATxDesc_B1AP  ((uint32_t)0xFFFFFFFF)  /*!< Buffer1 Address Pointer */
+
+/**
+  * @brief  Bit definition of TDES3 register
+  */
+#define ETH_DMATxDesc_B2AP  ((uint32_t)0xFFFFFFFF)  /*!< Buffer2 Address Pointer */
+
+  /*---------------------------------------------------------------------------------------------
+  TDES6 |                         Transmit Time Stmap Low [31:0]                                 |
+  -----------------------------------------------------------------------------------------------
+  TDES7 |                         Transmit Time Stmap High [31:0]                                |
+  ----------------------------------------------------------------------------------------------*/
+
+/* Bit definition of TDES6 register */
+ #define ETH_DMAPTPTxDesc_TTSL  ((uint32_t)0xFFFFFFFF)  /* Transmit Time Stmap Low */
+
+/* Bit definition of TDES7 register */
+ #define ETH_DMAPTPTxDesc_TTSH  ((uint32_t)0xFFFFFFFF)  /* Transmit Time Stmap High */
+
+/**
+  * @}
+  */
+
+
+/** @defgroup DMA_Rx_descriptor
+  * @{
+  */
+
+/**
+@code
+  DMA Rx Desciptor
+  --------------------------------------------------------------------------------------------------------------------
+  RDES0 | OWN(31) |                                             Status [30:0]                                          |
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES1 | CTRL(31) | Reserved[30:29] | Buffer2 ByteCount[28:16] | CTRL[15:14] | Reserved(13) | Buffer1 ByteCount[12:0] |
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES2 |                                       Buffer1 Address [31:0]                                                 |
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES3 |                          Buffer2 Address [31:0] / Next Desciptor Address [31:0]                              |
+  ---------------------------------------------------------------------------------------------------------------------
+@endcode
+*/
+
+/**
+  * @brief  Bit definition of RDES0 register: DMA Rx descriptor status register
+  */
+#define ETH_DMARxDesc_OWN         ((uint32_t)0x80000000)  /*!< OWN bit: descriptor is owned by DMA engine  */
+#define ETH_DMARxDesc_AFM         ((uint32_t)0x40000000)  /*!< DA Filter Fail for the rx frame  */
+#define ETH_DMARxDesc_FL          ((uint32_t)0x3FFF0000)  /*!< Receive descriptor frame length  */
+#define ETH_DMARxDesc_ES          ((uint32_t)0x00008000)  /*!< Error summary: OR of the following bits: DE || OE || IPC || LC || RWT || RE || CE */
+#define ETH_DMARxDesc_DE          ((uint32_t)0x00004000)  /*!< Desciptor error: no more descriptors for receive frame  */
+#define ETH_DMARxDesc_SAF         ((uint32_t)0x00002000)  /*!< SA Filter Fail for the received frame */
+#define ETH_DMARxDesc_LE          ((uint32_t)0x00001000)  /*!< Frame size not matching with length field */
+#define ETH_DMARxDesc_OE          ((uint32_t)0x00000800)  /*!< Overflow Error: Frame was damaged due to buffer overflow */
+#define ETH_DMARxDesc_VLAN        ((uint32_t)0x00000400)  /*!< VLAN Tag: received frame is a VLAN frame */
+#define ETH_DMARxDesc_FS          ((uint32_t)0x00000200)  /*!< First descriptor of the frame  */
+#define ETH_DMARxDesc_LS          ((uint32_t)0x00000100)  /*!< Last descriptor of the frame  */
+#define ETH_DMARxDesc_IPV4HCE     ((uint32_t)0x00000080)  /*!< IPC Checksum Error: Rx Ipv4 header checksum error   */
+#define ETH_DMARxDesc_LC          ((uint32_t)0x00000040)  /*!< Late collision occurred during reception   */
+#define ETH_DMARxDesc_FT          ((uint32_t)0x00000020)  /*!< Frame type - Ethernet, otherwise 802.3    */
+#define ETH_DMARxDesc_RWT         ((uint32_t)0x00000010)  /*!< Receive Watchdog Timeout: watchdog timer expired during reception    */
+#define ETH_DMARxDesc_RE          ((uint32_t)0x00000008)  /*!< Receive error: error reported by MII interface  */
+#define ETH_DMARxDesc_DBE         ((uint32_t)0x00000004)  /*!< Dribble bit error: frame contains non int multiple of 8 bits  */
+#define ETH_DMARxDesc_CE          ((uint32_t)0x00000002)  /*!< CRC error */
+#define ETH_DMARxDesc_MAMPCE      ((uint32_t)0x00000001)  /*!< Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error */
+
+/**
+  * @brief  Bit definition of RDES1 register
+  */
+#define ETH_DMARxDesc_DIC   ((uint32_t)0x80000000)  /*!< Disable Interrupt on Completion */
+#define ETH_DMARxDesc_RBS2  ((uint32_t)0x1FFF0000)  /*!< Receive Buffer2 Size */
+#define ETH_DMARxDesc_RER   ((uint32_t)0x00008000)  /*!< Receive End of Ring */
+#define ETH_DMARxDesc_RCH   ((uint32_t)0x00004000)  /*!< Second Address Chained */
+#define ETH_DMARxDesc_RBS1  ((uint32_t)0x00001FFF)  /*!< Receive Buffer1 Size */
+
+/**
+  * @brief  Bit definition of RDES2 register
+  */
+#define ETH_DMARxDesc_B1AP  ((uint32_t)0xFFFFFFFF)  /*!< Buffer1 Address Pointer */
+
+/**
+  * @brief  Bit definition of RDES3 register
+  */
+#define ETH_DMARxDesc_B2AP  ((uint32_t)0xFFFFFFFF)  /*!< Buffer2 Address Pointer */
+
+/*---------------------------------------------------------------------------------------------------------------------
+  RDES4 |                   Reserved[31:15]              |             Extended Status [14:0]                          |
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES5 |                                            Reserved[31:0]                                                    |
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES6 |                                       Receive Time Stmap Low [31:0]                                          |
+  ---------------------------------------------------------------------------------------------------------------------
+  RDES7 |                                       Receive Time Stmap High [31:0]                                         |
+  --------------------------------------------------------------------------------------------------------------------*/
+
+/* Bit definition of RDES4 register */
+#define ETH_DMAPTPRxDesc_PTPV     ((uint32_t)0x00002000)  /* PTP Version */
+#define ETH_DMAPTPRxDesc_PTPFT    ((uint32_t)0x00001000)  /* PTP Frame Type */
+#define ETH_DMAPTPRxDesc_PTPMT    ((uint32_t)0x00000F00)  /* PTP Message Type */
+  #define ETH_DMAPTPRxDesc_PTPMT_Sync                      ((uint32_t)0x00000100)  /* SYNC message (all clock types) */
+  #define ETH_DMAPTPRxDesc_PTPMT_FollowUp                  ((uint32_t)0x00000200)  /* FollowUp message (all clock types) */
+  #define ETH_DMAPTPRxDesc_PTPMT_DelayReq                  ((uint32_t)0x00000300)  /* DelayReq message (all clock types) */
+  #define ETH_DMAPTPRxDesc_PTPMT_DelayResp                 ((uint32_t)0x00000400)  /* DelayResp message (all clock types) */
+  #define ETH_DMAPTPRxDesc_PTPMT_PdelayReq_Announce        ((uint32_t)0x00000500)  /* PdelayReq message (peer-to-peer transparent clock) or Announce message (Ordinary or Boundary clock) */
+  #define ETH_DMAPTPRxDesc_PTPMT_PdelayResp_Manag          ((uint32_t)0x00000600)  /* PdelayResp message (peer-to-peer transparent clock) or Management message (Ordinary or Boundary clock)  */
+  #define ETH_DMAPTPRxDesc_PTPMT_PdelayRespFollowUp_Signal ((uint32_t)0x00000700)  /* PdelayRespFollowUp message (peer-to-peer transparent clock) or Signaling message (Ordinary or Boundary clock) */
+#define ETH_DMAPTPRxDesc_IPV6PR   ((uint32_t)0x00000080)  /* IPv6 Packet Received */
+#define ETH_DMAPTPRxDesc_IPV4PR   ((uint32_t)0x00000040)  /* IPv4 Packet Received */
+#define ETH_DMAPTPRxDesc_IPCB  ((uint32_t)0x00000020)  /* IP Checksum Bypassed */
+#define ETH_DMAPTPRxDesc_IPPE  ((uint32_t)0x00000010)  /* IP Payload Error */
+#define ETH_DMAPTPRxDesc_IPHE  ((uint32_t)0x00000008)  /* IP Header Error */
+#define ETH_DMAPTPRxDesc_IPPT  ((uint32_t)0x00000007)  /* IP Payload Type */
+  #define ETH_DMAPTPRxDesc_IPPT_UDP                 ((uint32_t)0x00000001)  /* UDP payload encapsulated in the IP datagram */
+  #define ETH_DMAPTPRxDesc_IPPT_TCP                 ((uint32_t)0x00000002)  /* TCP payload encapsulated in the IP datagram */
+  #define ETH_DMAPTPRxDesc_IPPT_ICMP                ((uint32_t)0x00000003)  /* ICMP payload encapsulated in the IP datagram */
+
+/* Bit definition of RDES6 register */
+#define ETH_DMAPTPRxDesc_RTSL  ((uint32_t)0xFFFFFFFF)  /* Receive Time Stmap Low */
+
+/* Bit definition of RDES7 register */
+#define ETH_DMAPTPRxDesc_RTSH  ((uint32_t)0xFFFFFFFF)  /* Receive Time Stmap High */
+
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                     Desciption of common PHY registers
+  */
+/**--------------------------------------------------------------------------**/
+
+/**
+  * @}
+  */
+
+/** @defgroup PHY_Read_write_Timeouts
+  * @{
+  */
+#define PHY_READ_TO                     ((uint32_t)0x0004FFFF)
+#define PHY_WRITE_TO                    ((uint32_t)0x0004FFFF)
+
+/**
+  * @}
+  */
+
+/** @defgroup PHY_Reset_Delay
+  * @{
+  */
+#define PHY_ResetDelay                  ((uint32_t)0x000FFFFF)
+
+/**
+  * @}
+  */
+
+/** @defgroup PHY_Config_Delay
+  * @{
+  */
+#define PHY_ConfigDelay                 ((uint32_t)0x00FFFFFF)
+
+/**
+  * @}
+  */
+
+/** @defgroup PHY_Register_address
+  * @{
+  */
+#define PHY_BCR                          0          /*!< Tranceiver Basic Control Register */
+#define PHY_BSR                          1          /*!< Tranceiver Basic Status Register */
+
+/**
+  * @}
+  */
+
+/** @defgroup PHY_basic_Control_register
+  * @{
+  */
+#define PHY_Reset                       ((uint16_t)0x8000)      /*!< PHY Reset */
+#define PHY_Loopback                    ((uint16_t)0x4000)      /*!< Select loop-back mode */
+#define PHY_FULLDUPLEX_100M             ((uint16_t)0x2100)      /*!< Set the full-duplex mode at 100 Mb/s */
+#define PHY_HALFDUPLEX_100M             ((uint16_t)0x2000)      /*!< Set the half-duplex mode at 100 Mb/s */
+#define PHY_FULLDUPLEX_10M              ((uint16_t)0x0100)      /*!< Set the full-duplex mode at 10 Mb/s */
+#define PHY_HALFDUPLEX_10M              ((uint16_t)0x0000)      /*!< Set the half-duplex mode at 10 Mb/s */
+#define PHY_AutoNegotiation             ((uint16_t)0x1000)      /*!< Enable auto-negotiation function */
+#define PHY_Restart_AutoNegotiation     ((uint16_t)0x0200)      /*!< Restart auto-negotiation function */
+#define PHY_Powerdown                   ((uint16_t)0x0800)      /*!< Select the power down mode */
+#define PHY_Isolate                     ((uint16_t)0x0400)      /*!< Isolate PHY from MII */
+
+/**
+  * @}
+  */
+
+/** @defgroup PHY_basic_status_register
+  * @{
+  */
+#define PHY_AutoNego_Complete           ((uint16_t)0x0020)      /*!< Auto-Negotioation process completed */
+#define PHY_Linked_Status               ((uint16_t)0x0004)      /*!< Valid link established */
+#define PHY_Jabber_detection            ((uint16_t)0x0002)      /*!< Jabber condition detected */
+
+/**
+  * @}
+  */
+
+/** @defgroup PHY_status_register
+  * @{
+  */
+/* The PHY status register value change from a PHY to another so the user have
+   to update this value depending on the used external PHY */
+/**
+  * @brief  For LAN8700
+  */
+/*#define PHY_SR                           31 */        /*!< Tranceiver Status Register */
+
+/**
+  * @brief  For DP83848
+  */
+#define PHY_SR                           16     /*!< Tranceiver Status Register */
+
+/* The Speed and Duplex mask values change from a PHY to another so the user have to update
+   this value depending on the used external PHY */
+/**
+  * @brief  For LAN8700
+  */
+/*#define PHY_Speed_Status            ((uint16_t)0x0004)*/      /*!< Configured information of Speed: 10Mbps */
+/*#define PHY_Duplex_Status           ((uint16_t)0x0010)*/      /*!< Configured information of Duplex: Full-duplex */
+
+/**
+  * @brief  For DP83848
+  */
+#define PHY_Speed_Status            ((uint16_t)0x0002)    /*!< Configured information of Speed: 10Mbps */
+#define PHY_Duplex_Status           ((uint16_t)0x0004)    /*!< Configured information of Duplex: Full-duplex */
+#define IS_ETH_PHY_ADDRESS(ADDRESS) ((ADDRESS) <= 0x20)
+#define IS_ETH_PHY_REG(REG) ((REG) <= 0x1F)
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                                  MAC defines
+  */
+/**--------------------------------------------------------------------------**/
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_AutoNegotiation
+  * @{
+  */
+#define ETH_AutoNegotiation_Enable     ((uint32_t)0x00000001)
+#define ETH_AutoNegotiation_Disable    ((uint32_t)0x00000000)
+#define IS_ETH_AUTONEGOTIATION(CMD) (((CMD) == ETH_AutoNegotiation_Enable) || \
+                                     ((CMD) == ETH_AutoNegotiation_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_watchdog
+  * @{
+  */
+#define ETH_Watchdog_Enable       ((uint32_t)0x00000000)
+#define ETH_Watchdog_Disable      ((uint32_t)0x00800000)
+#define IS_ETH_WATCHDOG(CMD) (((CMD) == ETH_Watchdog_Enable) || \
+                              ((CMD) == ETH_Watchdog_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Jabber
+  * @{
+  */
+#define ETH_Jabber_Enable    ((uint32_t)0x00000000)
+#define ETH_Jabber_Disable   ((uint32_t)0x00400000)
+#define IS_ETH_JABBER(CMD) (((CMD) == ETH_Jabber_Enable) || \
+                            ((CMD) == ETH_Jabber_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Inter_Frame_Gap
+  * @{
+  */
+#define ETH_InterFrameGap_96Bit   ((uint32_t)0x00000000)  /*!< minimum IFG between frames during transmission is 96Bit */
+#define ETH_InterFrameGap_88Bit   ((uint32_t)0x00020000)  /*!< minimum IFG between frames during transmission is 88Bit */
+#define ETH_InterFrameGap_80Bit   ((uint32_t)0x00040000)  /*!< minimum IFG between frames during transmission is 80Bit */
+#define ETH_InterFrameGap_72Bit   ((uint32_t)0x00060000)  /*!< minimum IFG between frames during transmission is 72Bit */
+#define ETH_InterFrameGap_64Bit   ((uint32_t)0x00080000)  /*!< minimum IFG between frames during transmission is 64Bit */
+#define ETH_InterFrameGap_56Bit   ((uint32_t)0x000A0000)  /*!< minimum IFG between frames during transmission is 56Bit */
+#define ETH_InterFrameGap_48Bit   ((uint32_t)0x000C0000)  /*!< minimum IFG between frames during transmission is 48Bit */
+#define ETH_InterFrameGap_40Bit   ((uint32_t)0x000E0000)  /*!< minimum IFG between frames during transmission is 40Bit */
+#define IS_ETH_INTER_FRAME_GAP(GAP) (((GAP) == ETH_InterFrameGap_96Bit) || \
+                                     ((GAP) == ETH_InterFrameGap_88Bit) || \
+                                     ((GAP) == ETH_InterFrameGap_80Bit) || \
+                                     ((GAP) == ETH_InterFrameGap_72Bit) || \
+                                     ((GAP) == ETH_InterFrameGap_64Bit) || \
+                                     ((GAP) == ETH_InterFrameGap_56Bit) || \
+                                     ((GAP) == ETH_InterFrameGap_48Bit) || \
+                                     ((GAP) == ETH_InterFrameGap_40Bit))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Carrier_Sense
+  * @{
+  */
+#define ETH_CarrierSense_Enable   ((uint32_t)0x00000000)
+#define ETH_CarrierSense_Disable  ((uint32_t)0x00010000)
+#define IS_ETH_CARRIER_SENSE(CMD) (((CMD) == ETH_CarrierSense_Enable) || \
+                                   ((CMD) == ETH_CarrierSense_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Speed
+  * @{
+  */
+#define ETH_Speed_10M        ((uint32_t)0x00000000)
+#define ETH_Speed_100M       ((uint32_t)0x00004000)
+#define IS_ETH_SPEED(SPEED) (((SPEED) == ETH_Speed_10M) || \
+                             ((SPEED) == ETH_Speed_100M))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Receive_Own
+  * @{
+  */
+#define ETH_ReceiveOwn_Enable     ((uint32_t)0x00000000)
+#define ETH_ReceiveOwn_Disable    ((uint32_t)0x00002000)
+#define IS_ETH_RECEIVE_OWN(CMD) (((CMD) == ETH_ReceiveOwn_Enable) || \
+                                 ((CMD) == ETH_ReceiveOwn_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Loop_Back_Mode
+  * @{
+  */
+#define ETH_LoopbackMode_Enable        ((uint32_t)0x00001000)
+#define ETH_LoopbackMode_Disable       ((uint32_t)0x00000000)
+#define IS_ETH_LOOPBACK_MODE(CMD) (((CMD) == ETH_LoopbackMode_Enable) || \
+                                   ((CMD) == ETH_LoopbackMode_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Duplex_Mode
+  * @{
+  */
+#define ETH_Mode_FullDuplex       ((uint32_t)0x00000800)
+#define ETH_Mode_HalfDuplex       ((uint32_t)0x00000000)
+#define IS_ETH_DUPLEX_MODE(MODE) (((MODE) == ETH_Mode_FullDuplex) || \
+                                  ((MODE) == ETH_Mode_HalfDuplex))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Checksum_Offload
+  * @{
+  */
+#define ETH_ChecksumOffload_Enable     ((uint32_t)0x00000400)
+#define ETH_ChecksumOffload_Disable    ((uint32_t)0x00000000)
+#define IS_ETH_CHECKSUM_OFFLOAD(CMD) (((CMD) == ETH_ChecksumOffload_Enable) || \
+                                      ((CMD) == ETH_ChecksumOffload_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Retry_Transmission
+  * @{
+  */
+#define ETH_RetryTransmission_Enable   ((uint32_t)0x00000000)
+#define ETH_RetryTransmission_Disable  ((uint32_t)0x00000200)
+#define IS_ETH_RETRY_TRANSMISSION(CMD) (((CMD) == ETH_RetryTransmission_Enable) || \
+                                        ((CMD) == ETH_RetryTransmission_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Automatic_Pad_CRC_Strip
+  * @{
+  */
+#define ETH_AutomaticPadCRCStrip_Enable     ((uint32_t)0x00000080)
+#define ETH_AutomaticPadCRCStrip_Disable    ((uint32_t)0x00000000)
+#define IS_ETH_AUTOMATIC_PADCRC_STRIP(CMD) (((CMD) == ETH_AutomaticPadCRCStrip_Enable) || \
+                                            ((CMD) == ETH_AutomaticPadCRCStrip_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Back_Off_Limit
+  * @{
+  */
+#define ETH_BackOffLimit_10  ((uint32_t)0x00000000)
+#define ETH_BackOffLimit_8   ((uint32_t)0x00000020)
+#define ETH_BackOffLimit_4   ((uint32_t)0x00000040)
+#define ETH_BackOffLimit_1   ((uint32_t)0x00000060)
+#define IS_ETH_BACKOFF_LIMIT(LIMIT) (((LIMIT) == ETH_BackOffLimit_10) || \
+                                     ((LIMIT) == ETH_BackOffLimit_8) || \
+                                     ((LIMIT) == ETH_BackOffLimit_4) || \
+                                     ((LIMIT) == ETH_BackOffLimit_1))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Deferral_Check
+  * @{
+  */
+#define ETH_DeferralCheck_Enable       ((uint32_t)0x00000010)
+#define ETH_DeferralCheck_Disable      ((uint32_t)0x00000000)
+#define IS_ETH_DEFERRAL_CHECK(CMD) (((CMD) == ETH_DeferralCheck_Enable) || \
+                                    ((CMD) == ETH_DeferralCheck_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Receive_All
+  * @{
+  */
+#define ETH_ReceiveAll_Enable     ((uint32_t)0x80000000)
+#define ETH_ReceiveAll_Disable    ((uint32_t)0x00000000)
+#define IS_ETH_RECEIVE_ALL(CMD) (((CMD) == ETH_ReceiveAll_Enable) || \
+                                 ((CMD) == ETH_ReceiveAll_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Source_Addr_Filter
+  * @{
+  */
+#define ETH_SourceAddrFilter_Normal_Enable       ((uint32_t)0x00000200)
+#define ETH_SourceAddrFilter_Inverse_Enable      ((uint32_t)0x00000300)
+#define ETH_SourceAddrFilter_Disable             ((uint32_t)0x00000000)
+#define IS_ETH_SOURCE_ADDR_FILTER(CMD) (((CMD) == ETH_SourceAddrFilter_Normal_Enable) || \
+                                        ((CMD) == ETH_SourceAddrFilter_Inverse_Enable) || \
+                                        ((CMD) == ETH_SourceAddrFilter_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Pass_Control_Frames
+  * @{
+  */
+#define ETH_PassControlFrames_BlockAll                ((uint32_t)0x00000040)  /*!< MAC filters all control frames from reaching the application */
+#define ETH_PassControlFrames_ForwardAll              ((uint32_t)0x00000080)  /*!< MAC forwards all control frames to application even if they fail the Address Filter */
+#define ETH_PassControlFrames_ForwardPassedAddrFilter ((uint32_t)0x000000C0)  /*!< MAC forwards control frames that pass the Address Filter. */
+#define IS_ETH_CONTROL_FRAMES(PASS) (((PASS) == ETH_PassControlFrames_BlockAll) || \
+                                     ((PASS) == ETH_PassControlFrames_ForwardAll) || \
+                                     ((PASS) == ETH_PassControlFrames_ForwardPassedAddrFilter))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Broadcast_Frames_Reception
+  * @{
+  */
+#define ETH_BroadcastFramesReception_Enable      ((uint32_t)0x00000000)
+#define ETH_BroadcastFramesReception_Disable     ((uint32_t)0x00000020)
+#define IS_ETH_BROADCAST_FRAMES_RECEPTION(CMD) (((CMD) == ETH_BroadcastFramesReception_Enable) || \
+                                                ((CMD) == ETH_BroadcastFramesReception_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Destination_Addr_Filter
+  * @{
+  */
+#define ETH_DestinationAddrFilter_Normal    ((uint32_t)0x00000000)
+#define ETH_DestinationAddrFilter_Inverse   ((uint32_t)0x00000008)
+#define IS_ETH_DESTINATION_ADDR_FILTER(FILTER) (((FILTER) == ETH_DestinationAddrFilter_Normal) || \
+                                                ((FILTER) == ETH_DestinationAddrFilter_Inverse))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Promiscuous_Mode
+  * @{
+  */
+#define ETH_PromiscuousMode_Enable     ((uint32_t)0x00000001)
+#define ETH_PromiscuousMode_Disable    ((uint32_t)0x00000000)
+#define IS_ETH_PROMISCUOUS_MODE(CMD) (((CMD) == ETH_PromiscuousMode_Enable) || \
+                                      ((CMD) == ETH_PromiscuousMode_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Multicast_Frames_Filter
+  * @{
+  */
+#define ETH_MulticastFramesFilter_PerfectHashTable    ((uint32_t)0x00000404)
+#define ETH_MulticastFramesFilter_HashTable           ((uint32_t)0x00000004)
+#define ETH_MulticastFramesFilter_Perfect             ((uint32_t)0x00000000)
+#define ETH_MulticastFramesFilter_None                ((uint32_t)0x00000010)
+#define IS_ETH_MULTICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_MulticastFramesFilter_PerfectHashTable) || \
+                                                ((FILTER) == ETH_MulticastFramesFilter_HashTable) || \
+                                                ((FILTER) == ETH_MulticastFramesFilter_Perfect) || \
+                                                ((FILTER) == ETH_MulticastFramesFilter_None))
+
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Unicast_Frames_Filter
+  * @{
+  */
+#define ETH_UnicastFramesFilter_PerfectHashTable ((uint32_t)0x00000402)
+#define ETH_UnicastFramesFilter_HashTable        ((uint32_t)0x00000002)
+#define ETH_UnicastFramesFilter_Perfect          ((uint32_t)0x00000000)
+#define IS_ETH_UNICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_UnicastFramesFilter_PerfectHashTable) || \
+                                              ((FILTER) == ETH_UnicastFramesFilter_HashTable) || \
+                                              ((FILTER) == ETH_UnicastFramesFilter_Perfect))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Pause_Time
+  * @{
+  */
+#define IS_ETH_PAUSE_TIME(TIME) ((TIME) <= 0xFFFF)
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Zero_Quanta_Pause
+  * @{
+  */
+#define ETH_ZeroQuantaPause_Enable     ((uint32_t)0x00000000)
+#define ETH_ZeroQuantaPause_Disable    ((uint32_t)0x00000080)
+#define IS_ETH_ZEROQUANTA_PAUSE(CMD)   (((CMD) == ETH_ZeroQuantaPause_Enable) || \
+                                        ((CMD) == ETH_ZeroQuantaPause_Disable))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Pause_Low_Threshold
+  * @{
+  */
+#define ETH_PauseLowThreshold_Minus4        ((uint32_t)0x00000000)  /*!< Pause time minus 4 slot times */
+#define ETH_PauseLowThreshold_Minus28       ((uint32_t)0x00000010)  /*!< Pause time minus 28 slot times */
+#define ETH_PauseLowThreshold_Minus144      ((uint32_t)0x00000020)  /*!< Pause time minus 144 slot times */
+#define ETH_PauseLowThreshold_Minus256      ((uint32_t)0x00000030)  /*!< Pause time minus 256 slot times */
+#define IS_ETH_PAUSE_LOW_THRESHOLD(THRESHOLD) (((THRESHOLD) == ETH_PauseLowThreshold_Minus4) || \
+                                               ((THRESHOLD) == ETH_PauseLowThreshold_Minus28) || \
+                                               ((THRESHOLD) == ETH_PauseLowThreshold_Minus144) || \
+                                               ((THRESHOLD) == ETH_PauseLowThreshold_Minus256))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Unicast_Pause_Frame_Detect
+  * @{
+  */
+#define ETH_UnicastPauseFrameDetect_Enable  ((uint32_t)0x00000008)
+#define ETH_UnicastPauseFrameDetect_Disable ((uint32_t)0x00000000)
+#define IS_ETH_UNICAST_PAUSE_FRAME_DETECT(CMD) (((CMD) == ETH_UnicastPauseFrameDetect_Enable) || \
+                                                ((CMD) == ETH_UnicastPauseFrameDetect_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Receive_Flow_Control
+  * @{
+  */
+#define ETH_ReceiveFlowControl_Enable       ((uint32_t)0x00000004)
+#define ETH_ReceiveFlowControl_Disable      ((uint32_t)0x00000000)
+#define IS_ETH_RECEIVE_FLOWCONTROL(CMD) (((CMD) == ETH_ReceiveFlowControl_Enable) || \
+                                         ((CMD) == ETH_ReceiveFlowControl_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Transmit_Flow_Control
+  * @{
+  */
+#define ETH_TransmitFlowControl_Enable      ((uint32_t)0x00000002)
+#define ETH_TransmitFlowControl_Disable     ((uint32_t)0x00000000)
+#define IS_ETH_TRANSMIT_FLOWCONTROL(CMD) (((CMD) == ETH_TransmitFlowControl_Enable) || \
+                                          ((CMD) == ETH_TransmitFlowControl_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_VLAN_Tag_Comparison
+  * @{
+  */
+#define ETH_VLANTagComparison_12Bit    ((uint32_t)0x00010000)
+#define ETH_VLANTagComparison_16Bit    ((uint32_t)0x00000000)
+#define IS_ETH_VLAN_TAG_COMPARISON(COMPARISON) (((COMPARISON) == ETH_VLANTagComparison_12Bit) || \
+                                                ((COMPARISON) == ETH_VLANTagComparison_16Bit))
+#define IS_ETH_VLAN_TAG_IDENTIFIER(IDENTIFIER) ((IDENTIFIER) <= 0xFFFF)
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_MAC_Flags
+  * @{
+  */
+#define ETH_MAC_FLAG_TST     ((uint32_t)0x00000200)  /*!< Time stamp trigger flag (on MAC) */
+#define ETH_MAC_FLAG_MMCT    ((uint32_t)0x00000040)  /*!< MMC transmit flag  */
+#define ETH_MAC_FLAG_MMCR    ((uint32_t)0x00000020)  /*!< MMC receive flag */
+#define ETH_MAC_FLAG_MMC     ((uint32_t)0x00000010)  /*!< MMC flag (on MAC) */
+#define ETH_MAC_FLAG_PMT     ((uint32_t)0x00000008)  /*!< PMT flag (on MAC) */
+#define IS_ETH_MAC_GET_FLAG(FLAG) (((FLAG) == ETH_MAC_FLAG_TST) || ((FLAG) == ETH_MAC_FLAG_MMCT) || \
+                                   ((FLAG) == ETH_MAC_FLAG_MMCR) || ((FLAG) == ETH_MAC_FLAG_MMC) || \
+                                   ((FLAG) == ETH_MAC_FLAG_PMT))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_MAC_Interrupts
+  * @{
+  */
+#define ETH_MAC_IT_TST       ((uint32_t)0x00000200)  /*!< Time stamp trigger interrupt (on MAC) */
+#define ETH_MAC_IT_MMCT      ((uint32_t)0x00000040)  /*!< MMC transmit interrupt */
+#define ETH_MAC_IT_MMCR      ((uint32_t)0x00000020)  /*!< MMC receive interrupt */
+#define ETH_MAC_IT_MMC       ((uint32_t)0x00000010)  /*!< MMC interrupt (on MAC) */
+#define ETH_MAC_IT_PMT       ((uint32_t)0x00000008)  /*!< PMT interrupt (on MAC) */
+#define IS_ETH_MAC_IT(IT) ((((IT) & (uint32_t)0xFFFFFDF7) == 0x00) && ((IT) != 0x00))
+#define IS_ETH_MAC_GET_IT(IT) (((IT) == ETH_MAC_IT_TST) || ((IT) == ETH_MAC_IT_MMCT) || \
+                               ((IT) == ETH_MAC_IT_MMCR) || ((IT) == ETH_MAC_IT_MMC) || \
+                               ((IT) == ETH_MAC_IT_PMT))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_MAC_addresses
+  * @{
+  */
+#define ETH_MAC_Address0     ((uint32_t)0x00000000)
+#define ETH_MAC_Address1     ((uint32_t)0x00000008)
+#define ETH_MAC_Address2     ((uint32_t)0x00000010)
+#define ETH_MAC_Address3     ((uint32_t)0x00000018)
+#define IS_ETH_MAC_ADDRESS0123(ADDRESS) (((ADDRESS) == ETH_MAC_Address0) || \
+                                         ((ADDRESS) == ETH_MAC_Address1) || \
+                                         ((ADDRESS) == ETH_MAC_Address2) || \
+                                         ((ADDRESS) == ETH_MAC_Address3))
+#define IS_ETH_MAC_ADDRESS123(ADDRESS) (((ADDRESS) == ETH_MAC_Address1) || \
+                                        ((ADDRESS) == ETH_MAC_Address2) || \
+                                        ((ADDRESS) == ETH_MAC_Address3))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_MAC_addresses_filter_SA_DA_filed_of_received_frames
+  * @{
+  */
+#define ETH_MAC_AddressFilter_SA       ((uint32_t)0x00000000)
+#define ETH_MAC_AddressFilter_DA       ((uint32_t)0x00000008)
+#define IS_ETH_MAC_ADDRESS_FILTER(FILTER) (((FILTER) == ETH_MAC_AddressFilter_SA) || \
+                                           ((FILTER) == ETH_MAC_AddressFilter_DA))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_MAC_addresses_filter_Mask_bytes
+  * @{
+  */
+#define ETH_MAC_AddressMask_Byte6      ((uint32_t)0x20000000)  /*!< Mask MAC Address high reg bits [15:8] */
+#define ETH_MAC_AddressMask_Byte5      ((uint32_t)0x10000000)  /*!< Mask MAC Address high reg bits [7:0] */
+#define ETH_MAC_AddressMask_Byte4      ((uint32_t)0x08000000)  /*!< Mask MAC Address low reg bits [31:24] */
+#define ETH_MAC_AddressMask_Byte3      ((uint32_t)0x04000000)  /*!< Mask MAC Address low reg bits [23:16] */
+#define ETH_MAC_AddressMask_Byte2      ((uint32_t)0x02000000)  /*!< Mask MAC Address low reg bits [15:8] */
+#define ETH_MAC_AddressMask_Byte1      ((uint32_t)0x01000000)  /*!< Mask MAC Address low reg bits [70] */
+#define IS_ETH_MAC_ADDRESS_MASK(MASK) (((MASK) == ETH_MAC_AddressMask_Byte6) || \
+                                       ((MASK) == ETH_MAC_AddressMask_Byte5) || \
+                                       ((MASK) == ETH_MAC_AddressMask_Byte4) || \
+                                       ((MASK) == ETH_MAC_AddressMask_Byte3) || \
+                                       ((MASK) == ETH_MAC_AddressMask_Byte2) || \
+                                       ((MASK) == ETH_MAC_AddressMask_Byte1))
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                      Ethernet DMA Desciptors defines
+  */
+/**--------------------------------------------------------------------------**/
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_Tx_descriptor_flags
+  * @{
+  */
+#define IS_ETH_DMATxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMATxDesc_OWN) || \
+                                         ((FLAG) == ETH_DMATxDesc_IC) || \
+                                         ((FLAG) == ETH_DMATxDesc_LS) || \
+                                         ((FLAG) == ETH_DMATxDesc_FS) || \
+                                         ((FLAG) == ETH_DMATxDesc_DC) || \
+                                         ((FLAG) == ETH_DMATxDesc_DP) || \
+                                         ((FLAG) == ETH_DMATxDesc_TTSE) || \
+                                         ((FLAG) == ETH_DMATxDesc_TER) || \
+                                         ((FLAG) == ETH_DMATxDesc_TCH) || \
+                                         ((FLAG) == ETH_DMATxDesc_TTSS) || \
+                                         ((FLAG) == ETH_DMATxDesc_IHE) || \
+                                         ((FLAG) == ETH_DMATxDesc_ES) || \
+                                         ((FLAG) == ETH_DMATxDesc_JT) || \
+                                         ((FLAG) == ETH_DMATxDesc_FF) || \
+                                         ((FLAG) == ETH_DMATxDesc_PCE) || \
+                                         ((FLAG) == ETH_DMATxDesc_LCA) || \
+                                         ((FLAG) == ETH_DMATxDesc_NC) || \
+                                         ((FLAG) == ETH_DMATxDesc_LCO) || \
+                                         ((FLAG) == ETH_DMATxDesc_EC) || \
+                                         ((FLAG) == ETH_DMATxDesc_VF) || \
+                                         ((FLAG) == ETH_DMATxDesc_CC) || \
+                                         ((FLAG) == ETH_DMATxDesc_ED) || \
+                                         ((FLAG) == ETH_DMATxDesc_UF) || \
+                                         ((FLAG) == ETH_DMATxDesc_DB))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_Tx_descriptor_segment
+  * @{
+  */
+#define ETH_DMATxDesc_LastSegment      ((uint32_t)0x40000000)  /*!< Last Segment */
+#define ETH_DMATxDesc_FirstSegment     ((uint32_t)0x20000000)  /*!< First Segment */
+#define IS_ETH_DMA_TXDESC_SEGMENT(SEGMENT) (((SEGMENT) == ETH_DMATxDesc_LastSegment) || \
+                                            ((SEGMENT) == ETH_DMATxDesc_FirstSegment))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_Tx_descriptor_Checksum_Insertion_Control
+  * @{
+  */
+#define ETH_DMATxDesc_ChecksumByPass             ((uint32_t)0x00000000)   /*!< Checksum engine bypass */
+#define ETH_DMATxDesc_ChecksumIPV4Header         ((uint32_t)0x00400000)   /*!< IPv4 header checksum insertion  */
+#define ETH_DMATxDesc_ChecksumTCPUDPICMPSegment  ((uint32_t)0x00800000)   /*!< TCP/UDP/ICMP checksum insertion. Pseudo header checksum is assumed to be present */
+#define ETH_DMATxDesc_ChecksumTCPUDPICMPFull     ((uint32_t)0x00C00000)   /*!< TCP/UDP/ICMP checksum fully in hardware including pseudo header */
+#define IS_ETH_DMA_TXDESC_CHECKSUM(CHECKSUM) (((CHECKSUM) == ETH_DMATxDesc_ChecksumByPass) || \
+                                              ((CHECKSUM) == ETH_DMATxDesc_ChecksumIPV4Header) || \
+                                              ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPSegment) || \
+                                              ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPFull))
+/**
+  * @brief  ETH DMA Tx Desciptor buffer size
+  */
+#define IS_ETH_DMATxDESC_BUFFER_SIZE(SIZE) ((SIZE) <= 0x1FFF)
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_Rx_descriptor_flags
+  * @{
+  */
+#define IS_ETH_DMARxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMARxDesc_OWN) || \
+                                         ((FLAG) == ETH_DMARxDesc_AFM) || \
+                                         ((FLAG) == ETH_DMARxDesc_ES) || \
+                                         ((FLAG) == ETH_DMARxDesc_DE) || \
+                                         ((FLAG) == ETH_DMARxDesc_SAF) || \
+                                         ((FLAG) == ETH_DMARxDesc_LE) || \
+                                         ((FLAG) == ETH_DMARxDesc_OE) || \
+                                         ((FLAG) == ETH_DMARxDesc_VLAN) || \
+                                         ((FLAG) == ETH_DMARxDesc_FS) || \
+                                         ((FLAG) == ETH_DMARxDesc_LS) || \
+                                         ((FLAG) == ETH_DMARxDesc_IPV4HCE) || \
+                                         ((FLAG) == ETH_DMARxDesc_LC) || \
+                                         ((FLAG) == ETH_DMARxDesc_FT) || \
+                                         ((FLAG) == ETH_DMARxDesc_RWT) || \
+                                         ((FLAG) == ETH_DMARxDesc_RE) || \
+                                         ((FLAG) == ETH_DMARxDesc_DBE) || \
+                                         ((FLAG) == ETH_DMARxDesc_CE) || \
+                                         ((FLAG) == ETH_DMARxDesc_MAMPCE))
+
+/* ETHERNET DMA PTP Rx descriptor extended flags  --------------------------------*/
+#define IS_ETH_DMAPTPRxDESC_GET_EXTENDED_FLAG(FLAG) (((FLAG) == ETH_DMAPTPRxDesc_PTPV) || \
+                                                     ((FLAG) == ETH_DMAPTPRxDesc_PTPFT) || \
+                                                     ((FLAG) == ETH_DMAPTPRxDesc_PTPMT) || \
+                                                     ((FLAG) == ETH_DMAPTPRxDesc_IPV6PR) || \
+                                                     ((FLAG) == ETH_DMAPTPRxDesc_IPV4PR) || \
+                                                     ((FLAG) == ETH_DMAPTPRxDesc_IPCB) || \
+                                                     ((FLAG) == ETH_DMAPTPRxDesc_IPPE) || \
+                                                     ((FLAG) == ETH_DMAPTPRxDesc_IPHE) || \
+                                                     ((FLAG) == ETH_DMAPTPRxDesc_IPPT))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_Rx_descriptor_buffers_
+  * @{
+  */
+#define ETH_DMARxDesc_Buffer1     ((uint32_t)0x00000000)  /*!< DMA Rx Desc Buffer1 */
+#define ETH_DMARxDesc_Buffer2     ((uint32_t)0x00000001)  /*!< DMA Rx Desc Buffer2 */
+#define IS_ETH_DMA_RXDESC_BUFFER(BUFFER) (((BUFFER) == ETH_DMARxDesc_Buffer1) || \
+                                          ((BUFFER) == ETH_DMARxDesc_Buffer2))
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                           Ethernet DMA defines
+  */
+/**--------------------------------------------------------------------------**/
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Drop_TCP_IP_Checksum_Error_Frame
+  * @{
+  */
+#define ETH_DropTCPIPChecksumErrorFrame_Enable   ((uint32_t)0x00000000)
+#define ETH_DropTCPIPChecksumErrorFrame_Disable  ((uint32_t)0x04000000)
+#define IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(CMD) (((CMD) == ETH_DropTCPIPChecksumErrorFrame_Enable) || \
+                                               ((CMD) == ETH_DropTCPIPChecksumErrorFrame_Disable))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Receive_Store_Forward
+  * @{
+  */
+#define ETH_ReceiveStoreForward_Enable      ((uint32_t)0x02000000)
+#define ETH_ReceiveStoreForward_Disable     ((uint32_t)0x00000000)
+#define IS_ETH_RECEIVE_STORE_FORWARD(CMD) (((CMD) == ETH_ReceiveStoreForward_Enable) || \
+                                           ((CMD) == ETH_ReceiveStoreForward_Disable))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Flush_Received_Frame
+  * @{
+  */
+#define ETH_FlushReceivedFrame_Enable       ((uint32_t)0x00000000)
+#define ETH_FlushReceivedFrame_Disable      ((uint32_t)0x01000000)
+#define IS_ETH_FLUSH_RECEIVE_FRAME(CMD) (((CMD) == ETH_FlushReceivedFrame_Enable) || \
+                                         ((CMD) == ETH_FlushReceivedFrame_Disable))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Transmit_Store_Forward
+  * @{
+  */
+#define ETH_TransmitStoreForward_Enable     ((uint32_t)0x00200000)
+#define ETH_TransmitStoreForward_Disable    ((uint32_t)0x00000000)
+#define IS_ETH_TRANSMIT_STORE_FORWARD(CMD) (((CMD) == ETH_TransmitStoreForward_Enable) || \
+                                            ((CMD) == ETH_TransmitStoreForward_Disable))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Transmit_Threshold_Control
+  * @{
+  */
+#define ETH_TransmitThresholdControl_64Bytes     ((uint32_t)0x00000000)  /*!< threshold level of the MTL Transmit FIFO is 64 Bytes */
+#define ETH_TransmitThresholdControl_128Bytes    ((uint32_t)0x00004000)  /*!< threshold level of the MTL Transmit FIFO is 128 Bytes */
+#define ETH_TransmitThresholdControl_192Bytes    ((uint32_t)0x00008000)  /*!< threshold level of the MTL Transmit FIFO is 192 Bytes */
+#define ETH_TransmitThresholdControl_256Bytes    ((uint32_t)0x0000C000)  /*!< threshold level of the MTL Transmit FIFO is 256 Bytes */
+#define ETH_TransmitThresholdControl_40Bytes     ((uint32_t)0x00010000)  /*!< threshold level of the MTL Transmit FIFO is 40 Bytes */
+#define ETH_TransmitThresholdControl_32Bytes     ((uint32_t)0x00014000)  /*!< threshold level of the MTL Transmit FIFO is 32 Bytes */
+#define ETH_TransmitThresholdControl_24Bytes     ((uint32_t)0x00018000)  /*!< threshold level of the MTL Transmit FIFO is 24 Bytes */
+#define ETH_TransmitThresholdControl_16Bytes     ((uint32_t)0x0001C000)  /*!< threshold level of the MTL Transmit FIFO is 16 Bytes */
+#define IS_ETH_TRANSMIT_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_TransmitThresholdControl_64Bytes) || \
+                                                      ((THRESHOLD) == ETH_TransmitThresholdControl_128Bytes) || \
+                                                      ((THRESHOLD) == ETH_TransmitThresholdControl_192Bytes) || \
+                                                      ((THRESHOLD) == ETH_TransmitThresholdControl_256Bytes) || \
+                                                      ((THRESHOLD) == ETH_TransmitThresholdControl_40Bytes) || \
+                                                      ((THRESHOLD) == ETH_TransmitThresholdControl_32Bytes) || \
+                                                      ((THRESHOLD) == ETH_TransmitThresholdControl_24Bytes) || \
+                                                      ((THRESHOLD) == ETH_TransmitThresholdControl_16Bytes))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Forward_Error_Frames
+  * @{
+  */
+#define ETH_ForwardErrorFrames_Enable       ((uint32_t)0x00000080)
+#define ETH_ForwardErrorFrames_Disable      ((uint32_t)0x00000000)
+#define IS_ETH_FORWARD_ERROR_FRAMES(CMD) (((CMD) == ETH_ForwardErrorFrames_Enable) || \
+                                          ((CMD) == ETH_ForwardErrorFrames_Disable))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Forward_Undersized_Good_Frames
+  * @{
+  */
+#define ETH_ForwardUndersizedGoodFrames_Enable   ((uint32_t)0x00000040)
+#define ETH_ForwardUndersizedGoodFrames_Disable  ((uint32_t)0x00000000)
+#define IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(CMD) (((CMD) == ETH_ForwardUndersizedGoodFrames_Enable) || \
+                                                    ((CMD) == ETH_ForwardUndersizedGoodFrames_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Receive_Threshold_Control
+  * @{
+  */
+#define ETH_ReceiveThresholdControl_64Bytes      ((uint32_t)0x00000000)  /*!< threshold level of the MTL Receive FIFO is 64 Bytes */
+#define ETH_ReceiveThresholdControl_32Bytes      ((uint32_t)0x00000008)  /*!< threshold level of the MTL Receive FIFO is 32 Bytes */
+#define ETH_ReceiveThresholdControl_96Bytes      ((uint32_t)0x00000010)  /*!< threshold level of the MTL Receive FIFO is 96 Bytes */
+#define ETH_ReceiveThresholdControl_128Bytes     ((uint32_t)0x00000018)  /*!< threshold level of the MTL Receive FIFO is 128 Bytes */
+#define IS_ETH_RECEIVE_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_ReceiveThresholdControl_64Bytes) || \
+                                                     ((THRESHOLD) == ETH_ReceiveThresholdControl_32Bytes) || \
+                                                     ((THRESHOLD) == ETH_ReceiveThresholdControl_96Bytes) || \
+                                                     ((THRESHOLD) == ETH_ReceiveThresholdControl_128Bytes))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Second_Frame_Operate
+  * @{
+  */
+#define ETH_SecondFrameOperate_Enable       ((uint32_t)0x00000004)
+#define ETH_SecondFrameOperate_Disable      ((uint32_t)0x00000000)
+#define IS_ETH_SECOND_FRAME_OPERATE(CMD) (((CMD) == ETH_SecondFrameOperate_Enable) || \
+                                          ((CMD) == ETH_SecondFrameOperate_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Address_Aligned_Beats
+  * @{
+  */
+#define ETH_AddressAlignedBeats_Enable      ((uint32_t)0x02000000)
+#define ETH_AddressAlignedBeats_Disable     ((uint32_t)0x00000000)
+#define IS_ETH_ADDRESS_ALIGNED_BEATS(CMD) (((CMD) == ETH_AddressAlignedBeats_Enable) || \
+                                           ((CMD) == ETH_AddressAlignedBeats_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Fixed_Burst
+  * @{
+  */
+#define ETH_FixedBurst_Enable     ((uint32_t)0x00010000)
+#define ETH_FixedBurst_Disable    ((uint32_t)0x00000000)
+#define IS_ETH_FIXED_BURST(CMD) (((CMD) == ETH_FixedBurst_Enable) || \
+                                 ((CMD) == ETH_FixedBurst_Disable))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Rx_DMA_Burst_Length
+  * @{
+  */
+#define ETH_RxDMABurstLength_1Beat          ((uint32_t)0x00020000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 1 */
+#define ETH_RxDMABurstLength_2Beat          ((uint32_t)0x00040000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 2 */
+#define ETH_RxDMABurstLength_4Beat          ((uint32_t)0x00080000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */
+#define ETH_RxDMABurstLength_8Beat          ((uint32_t)0x00100000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */
+#define ETH_RxDMABurstLength_16Beat         ((uint32_t)0x00200000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */
+#define ETH_RxDMABurstLength_32Beat         ((uint32_t)0x00400000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */
+#define ETH_RxDMABurstLength_4xPBL_4Beat    ((uint32_t)0x01020000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */
+#define ETH_RxDMABurstLength_4xPBL_8Beat    ((uint32_t)0x01040000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */
+#define ETH_RxDMABurstLength_4xPBL_16Beat   ((uint32_t)0x01080000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */
+#define ETH_RxDMABurstLength_4xPBL_32Beat   ((uint32_t)0x01100000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */
+#define ETH_RxDMABurstLength_4xPBL_64Beat   ((uint32_t)0x01200000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 64 */
+#define ETH_RxDMABurstLength_4xPBL_128Beat  ((uint32_t)0x01400000)  /*!< maximum number of beats to be transferred in one RxDMA transaction is 128 */
+
+#define IS_ETH_RXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_RxDMABurstLength_1Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_2Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_4Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_8Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_16Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_32Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_4xPBL_4Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_4xPBL_8Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_4xPBL_16Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_4xPBL_32Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_4xPBL_64Beat) || \
+                                           ((LENGTH) == ETH_RxDMABurstLength_4xPBL_128Beat))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Tx_DMA_Burst_Length
+  * @{
+  */
+#define ETH_TxDMABurstLength_1Beat          ((uint32_t)0x00000100)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */
+#define ETH_TxDMABurstLength_2Beat          ((uint32_t)0x00000200)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */
+#define ETH_TxDMABurstLength_4Beat          ((uint32_t)0x00000400)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */
+#define ETH_TxDMABurstLength_8Beat          ((uint32_t)0x00000800)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */
+#define ETH_TxDMABurstLength_16Beat         ((uint32_t)0x00001000)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */
+#define ETH_TxDMABurstLength_32Beat         ((uint32_t)0x00002000)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */
+#define ETH_TxDMABurstLength_4xPBL_4Beat    ((uint32_t)0x01000100)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */
+#define ETH_TxDMABurstLength_4xPBL_8Beat    ((uint32_t)0x01000200)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */
+#define ETH_TxDMABurstLength_4xPBL_16Beat   ((uint32_t)0x01000400)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */
+#define ETH_TxDMABurstLength_4xPBL_32Beat   ((uint32_t)0x01000800)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */
+#define ETH_TxDMABurstLength_4xPBL_64Beat   ((uint32_t)0x01001000)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */
+#define ETH_TxDMABurstLength_4xPBL_128Beat  ((uint32_t)0x01002000)  /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */
+
+#define IS_ETH_TXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_TxDMABurstLength_1Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_2Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_4Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_8Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_16Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_32Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_4xPBL_4Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_4xPBL_8Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_4xPBL_16Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_4xPBL_32Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_4xPBL_64Beat) || \
+                                           ((LENGTH) == ETH_TxDMABurstLength_4xPBL_128Beat))
+/**
+  * @brief  ETH DMA Desciptor SkipLength
+  */
+#define IS_ETH_DMA_DESC_SKIP_LENGTH(LENGTH) ((LENGTH) <= 0x1F)
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_Arbitration
+  * @{
+  */
+#define ETH_DMAArbitration_RoundRobin_RxTx_1_1   ((uint32_t)0x00000000)
+#define ETH_DMAArbitration_RoundRobin_RxTx_2_1   ((uint32_t)0x00004000)
+#define ETH_DMAArbitration_RoundRobin_RxTx_3_1   ((uint32_t)0x00008000)
+#define ETH_DMAArbitration_RoundRobin_RxTx_4_1   ((uint32_t)0x0000C000)
+#define ETH_DMAArbitration_RxPriorTx             ((uint32_t)0x00000002)
+#define IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(RATIO) (((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_1_1) || \
+                                                       ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_2_1) || \
+                                                       ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_3_1) || \
+                                                       ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_4_1) || \
+                                                       ((RATIO) == ETH_DMAArbitration_RxPriorTx))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_Flags
+  * @{
+  */
+#define ETH_DMA_FLAG_TST               ((uint32_t)0x20000000)  /*!< Time-stamp trigger interrupt (on DMA) */
+#define ETH_DMA_FLAG_PMT               ((uint32_t)0x10000000)  /*!< PMT interrupt (on DMA) */
+#define ETH_DMA_FLAG_MMC               ((uint32_t)0x08000000)  /*!< MMC interrupt (on DMA) */
+#define ETH_DMA_FLAG_DataTransferError ((uint32_t)0x00800000)  /*!< Error bits 0-Rx DMA, 1-Tx DMA */
+#define ETH_DMA_FLAG_ReadWriteError    ((uint32_t)0x01000000)  /*!< Error bits 0-write trnsf, 1-read transfr */
+#define ETH_DMA_FLAG_AccessError       ((uint32_t)0x02000000)  /*!< Error bits 0-data buffer, 1-desc. access */
+#define ETH_DMA_FLAG_NIS               ((uint32_t)0x00010000)  /*!< Normal interrupt summary flag */
+#define ETH_DMA_FLAG_AIS               ((uint32_t)0x00008000)  /*!< Abnormal interrupt summary flag */
+#define ETH_DMA_FLAG_ER                ((uint32_t)0x00004000)  /*!< Early receive flag */
+#define ETH_DMA_FLAG_FBE               ((uint32_t)0x00002000)  /*!< Fatal bus error flag */
+#define ETH_DMA_FLAG_ET                ((uint32_t)0x00000400)  /*!< Early transmit flag */
+#define ETH_DMA_FLAG_RWT               ((uint32_t)0x00000200)  /*!< Receive watchdog timeout flag */
+#define ETH_DMA_FLAG_RPS               ((uint32_t)0x00000100)  /*!< Receive process stopped flag */
+#define ETH_DMA_FLAG_RBU               ((uint32_t)0x00000080)  /*!< Receive buffer unavailable flag */
+#define ETH_DMA_FLAG_R                 ((uint32_t)0x00000040)  /*!< Receive flag */
+#define ETH_DMA_FLAG_TU                ((uint32_t)0x00000020)  /*!< Underflow flag */
+#define ETH_DMA_FLAG_RO                ((uint32_t)0x00000010)  /*!< Overflow flag */
+#define ETH_DMA_FLAG_TJT               ((uint32_t)0x00000008)  /*!< Transmit jabber timeout flag */
+#define ETH_DMA_FLAG_TBU               ((uint32_t)0x00000004)  /*!< Transmit buffer unavailable flag */
+#define ETH_DMA_FLAG_TPS               ((uint32_t)0x00000002)  /*!< Transmit process stopped flag */
+#define ETH_DMA_FLAG_T                 ((uint32_t)0x00000001)  /*!< Transmit flag */
+
+#define IS_ETH_DMA_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFE1800) == 0x00) && ((FLAG) != 0x00))
+#define IS_ETH_DMA_GET_FLAG(FLAG) (((FLAG) == ETH_DMA_FLAG_TST) || ((FLAG) == ETH_DMA_FLAG_PMT) || \
+                                   ((FLAG) == ETH_DMA_FLAG_MMC) || ((FLAG) == ETH_DMA_FLAG_DataTransferError) || \
+                                   ((FLAG) == ETH_DMA_FLAG_ReadWriteError) || ((FLAG) == ETH_DMA_FLAG_AccessError) || \
+                                   ((FLAG) == ETH_DMA_FLAG_NIS) || ((FLAG) == ETH_DMA_FLAG_AIS) || \
+                                   ((FLAG) == ETH_DMA_FLAG_ER) || ((FLAG) == ETH_DMA_FLAG_FBE) || \
+                                   ((FLAG) == ETH_DMA_FLAG_ET) || ((FLAG) == ETH_DMA_FLAG_RWT) || \
+                                   ((FLAG) == ETH_DMA_FLAG_RPS) || ((FLAG) == ETH_DMA_FLAG_RBU) || \
+                                   ((FLAG) == ETH_DMA_FLAG_R) || ((FLAG) == ETH_DMA_FLAG_TU) || \
+                                   ((FLAG) == ETH_DMA_FLAG_RO) || ((FLAG) == ETH_DMA_FLAG_TJT) || \
+                                   ((FLAG) == ETH_DMA_FLAG_TBU) || ((FLAG) == ETH_DMA_FLAG_TPS) || \
+                                   ((FLAG) == ETH_DMA_FLAG_T))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_Interrupts
+  * @{
+  */
+#define ETH_DMA_IT_TST       ((uint32_t)0x20000000)  /*!< Time-stamp trigger interrupt (on DMA) */
+#define ETH_DMA_IT_PMT       ((uint32_t)0x10000000)  /*!< PMT interrupt (on DMA) */
+#define ETH_DMA_IT_MMC       ((uint32_t)0x08000000)  /*!< MMC interrupt (on DMA) */
+#define ETH_DMA_IT_NIS       ((uint32_t)0x00010000)  /*!< Normal interrupt summary */
+#define ETH_DMA_IT_AIS       ((uint32_t)0x00008000)  /*!< Abnormal interrupt summary */
+#define ETH_DMA_IT_ER        ((uint32_t)0x00004000)  /*!< Early receive interrupt */
+#define ETH_DMA_IT_FBE       ((uint32_t)0x00002000)  /*!< Fatal bus error interrupt */
+#define ETH_DMA_IT_ET        ((uint32_t)0x00000400)  /*!< Early transmit interrupt */
+#define ETH_DMA_IT_RWT       ((uint32_t)0x00000200)  /*!< Receive watchdog timeout interrupt */
+#define ETH_DMA_IT_RPS       ((uint32_t)0x00000100)  /*!< Receive process stopped interrupt */
+#define ETH_DMA_IT_RBU       ((uint32_t)0x00000080)  /*!< Receive buffer unavailable interrupt */
+#define ETH_DMA_IT_R         ((uint32_t)0x00000040)  /*!< Receive interrupt */
+#define ETH_DMA_IT_TU        ((uint32_t)0x00000020)  /*!< Underflow interrupt */
+#define ETH_DMA_IT_RO        ((uint32_t)0x00000010)  /*!< Overflow interrupt */
+#define ETH_DMA_IT_TJT       ((uint32_t)0x00000008)  /*!< Transmit jabber timeout interrupt */
+#define ETH_DMA_IT_TBU       ((uint32_t)0x00000004)  /*!< Transmit buffer unavailable interrupt */
+#define ETH_DMA_IT_TPS       ((uint32_t)0x00000002)  /*!< Transmit process stopped interrupt */
+#define ETH_DMA_IT_T         ((uint32_t)0x00000001)  /*!< Transmit interrupt */
+
+#define IS_ETH_DMA_IT(IT) ((((IT) & (uint32_t)0xFFFE1800) == 0x00) && ((IT) != 0x00))
+#define IS_ETH_DMA_GET_IT(IT) (((IT) == ETH_DMA_IT_TST) || ((IT) == ETH_DMA_IT_PMT) || \
+                               ((IT) == ETH_DMA_IT_MMC) || ((IT) == ETH_DMA_IT_NIS) || \
+                               ((IT) == ETH_DMA_IT_AIS) || ((IT) == ETH_DMA_IT_ER) || \
+                               ((IT) == ETH_DMA_IT_FBE) || ((IT) == ETH_DMA_IT_ET) || \
+                               ((IT) == ETH_DMA_IT_RWT) || ((IT) == ETH_DMA_IT_RPS) || \
+                               ((IT) == ETH_DMA_IT_RBU) || ((IT) == ETH_DMA_IT_R) || \
+                               ((IT) == ETH_DMA_IT_TU) || ((IT) == ETH_DMA_IT_RO) || \
+                               ((IT) == ETH_DMA_IT_TJT) || ((IT) == ETH_DMA_IT_TBU) || \
+                               ((IT) == ETH_DMA_IT_TPS) || ((IT) == ETH_DMA_IT_T))
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_transmit_process_state_
+  * @{
+  */
+#define ETH_DMA_TransmitProcess_Stopped     ((uint32_t)0x00000000)  /*!< Stopped - Reset or Stop Tx Command issued */
+#define ETH_DMA_TransmitProcess_Fetching    ((uint32_t)0x00100000)  /*!< Running - fetching the Tx descriptor */
+#define ETH_DMA_TransmitProcess_Waiting     ((uint32_t)0x00200000)  /*!< Running - waiting for status */
+#define ETH_DMA_TransmitProcess_Reading     ((uint32_t)0x00300000)  /*!< Running - reading the data from host memory */
+#define ETH_DMA_TransmitProcess_Suspended   ((uint32_t)0x00600000)  /*!< Suspended - Tx Desciptor unavailabe */
+#define ETH_DMA_TransmitProcess_Closing     ((uint32_t)0x00700000)  /*!< Running - closing Rx descriptor */
+
+/**
+  * @}
+  */
+
+
+/** @defgroup ETH_DMA_receive_process_state_
+  * @{
+  */
+#define ETH_DMA_ReceiveProcess_Stopped      ((uint32_t)0x00000000)  /*!< Stopped - Reset or Stop Rx Command issued */
+#define ETH_DMA_ReceiveProcess_Fetching     ((uint32_t)0x00020000)  /*!< Running - fetching the Rx descriptor */
+#define ETH_DMA_ReceiveProcess_Waiting      ((uint32_t)0x00060000)  /*!< Running - waiting for packet */
+#define ETH_DMA_ReceiveProcess_Suspended    ((uint32_t)0x00080000)  /*!< Suspended - Rx Desciptor unavailable */
+#define ETH_DMA_ReceiveProcess_Closing      ((uint32_t)0x000A0000)  /*!< Running - closing descriptor */
+#define ETH_DMA_ReceiveProcess_Queuing      ((uint32_t)0x000E0000)  /*!< Running - queuing the recieve frame into host memory */
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_DMA_overflow_
+  * @{
+  */
+#define ETH_DMA_Overflow_RxFIFOCounter      ((uint32_t)0x10000000)  /*!< Overflow bit for FIFO overflow counter */
+#define ETH_DMA_Overflow_MissedFrameCounter ((uint32_t)0x00010000)  /*!< Overflow bit for missed frame counter */
+#define IS_ETH_DMA_GET_OVERFLOW(OVERFLOW) (((OVERFLOW) == ETH_DMA_Overflow_RxFIFOCounter) || \
+                                           ((OVERFLOW) == ETH_DMA_Overflow_MissedFrameCounter))
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                           Ethernet PMT defines
+  */
+/**--------------------------------------------------------------------------**/
+/**
+  * @}
+  */
+
+/** @defgroup ETH_PMT_Flags
+  * @{
+  */
+#define ETH_PMT_FLAG_WUFFRPR      ((uint32_t)0x80000000)  /*!< Wake-Up Frame Filter Register Poniter Reset */
+#define ETH_PMT_FLAG_WUFR         ((uint32_t)0x00000040)  /*!< Wake-Up Frame Received */
+#define ETH_PMT_FLAG_MPR          ((uint32_t)0x00000020)  /*!< Magic Packet Received */
+#define IS_ETH_PMT_GET_FLAG(FLAG) (((FLAG) == ETH_PMT_FLAG_WUFR) || \
+                                   ((FLAG) == ETH_PMT_FLAG_MPR))
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                           Ethernet MMC defines
+  */
+/**--------------------------------------------------------------------------**/
+/**
+  * @}
+  */
+
+/** @defgroup ETH_MMC_Tx_Interrupts
+  * @{
+  */
+#define ETH_MMC_IT_TGF       ((uint32_t)0x00200000)  /*!< When Tx good frame counter reaches half the maximum value */
+#define ETH_MMC_IT_TGFMSC    ((uint32_t)0x00008000)  /*!< When Tx good multi col counter reaches half the maximum value */
+#define ETH_MMC_IT_TGFSC     ((uint32_t)0x00004000)  /*!< When Tx good single col counter reaches half the maximum value */
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_MMC_Rx_Interrupts
+  * @{
+  */
+#define ETH_MMC_IT_RGUF      ((uint32_t)0x10020000)  /*!< When Rx good unicast frames counter reaches half the maximum value */
+#define ETH_MMC_IT_RFAE      ((uint32_t)0x10000040)  /*!< When Rx alignment error counter reaches half the maximum value */
+#define ETH_MMC_IT_RFCE      ((uint32_t)0x10000020)  /*!< When Rx crc error counter reaches half the maximum value */
+#define IS_ETH_MMC_IT(IT) (((((IT) & (uint32_t)0xFFDF3FFF) == 0x00) || (((IT) & (uint32_t)0xEFFDFF9F) == 0x00)) && \
+                           ((IT) != 0x00))
+#define IS_ETH_MMC_GET_IT(IT) (((IT) == ETH_MMC_IT_TGF) || ((IT) == ETH_MMC_IT_TGFMSC) || \
+                               ((IT) == ETH_MMC_IT_TGFSC) || ((IT) == ETH_MMC_IT_RGUF) || \
+                               ((IT) == ETH_MMC_IT_RFAE) || ((IT) == ETH_MMC_IT_RFCE))
+/**
+  * @}
+  */
+
+/** @defgroup ETH_MMC_Registers
+  * @{
+  */
+#define ETH_MMCCR            ((uint32_t)0x00000100)  /*!< MMC CR register */
+#define ETH_MMCRIR           ((uint32_t)0x00000104)  /*!< MMC RIR register */
+#define ETH_MMCTIR           ((uint32_t)0x00000108)  /*!< MMC TIR register */
+#define ETH_MMCRIMR          ((uint32_t)0x0000010C)  /*!< MMC RIMR register */
+#define ETH_MMCTIMR          ((uint32_t)0x00000110)  /*!< MMC TIMR register */
+#define ETH_MMCTGFSCCR       ((uint32_t)0x0000014C)  /*!< MMC TGFSCCR register */
+#define ETH_MMCTGFMSCCR      ((uint32_t)0x00000150)  /*!< MMC TGFMSCCR register */
+#define ETH_MMCTGFCR         ((uint32_t)0x00000168)  /*!< MMC TGFCR register */
+#define ETH_MMCRFCECR        ((uint32_t)0x00000194)  /*!< MMC RFCECR register */
+#define ETH_MMCRFAECR        ((uint32_t)0x00000198)  /*!< MMC RFAECR register */
+#define ETH_MMCRGUFCR        ((uint32_t)0x000001C4)  /*!< MMC RGUFCR register */
+
+/**
+  * @brief  ETH MMC registers
+  */
+#define IS_ETH_MMC_REGISTER(REG) (((REG) == ETH_MMCCR)  || ((REG) == ETH_MMCRIR) || \
+                                  ((REG) == ETH_MMCTIR)  || ((REG) == ETH_MMCRIMR) || \
+                                  ((REG) == ETH_MMCTIMR) || ((REG) == ETH_MMCTGFSCCR) || \
+                                  ((REG) == ETH_MMCTGFMSCCR) || ((REG) == ETH_MMCTGFCR) || \
+                                  ((REG) == ETH_MMCRFCECR) || ((REG) == ETH_MMCRFAECR) || \
+                                  ((REG) == ETH_MMCRGUFCR))
+
+/**--------------------------------------------------------------------------**/
+/**
+  * @brief                           Ethernet PTP defines
+  */
+/**--------------------------------------------------------------------------**/
+/**
+  * @}
+  */
+
+/** @defgroup ETH_PTP_time_update_method
+  * @{
+  */
+#define ETH_PTP_FineUpdate        ((uint32_t)0x00000001)  /*!< Fine Update method */
+#define ETH_PTP_CoarseUpdate      ((uint32_t)0x00000000)  /*!< Coarse Update method */
+#define IS_ETH_PTP_UPDATE(UPDATE) (((UPDATE) == ETH_PTP_FineUpdate) || \
+                                   ((UPDATE) == ETH_PTP_CoarseUpdate))
+
+/**
+  * @}
+  */
+
+
+/** @defgroup ETH_PTP_Flags
+  * @{
+  */
+#define ETH_PTP_FLAG_TSARU        ((uint32_t)0x00000020)  /*!< Addend Register Update */
+#define ETH_PTP_FLAG_TSITE        ((uint32_t)0x00000010)  /*!< Time Stamp Interrupt Trigger */
+#define ETH_PTP_FLAG_TSSTU        ((uint32_t)0x00000008)  /*!< Time Stamp Update */
+#define ETH_PTP_FLAG_TSSTI        ((uint32_t)0x00000004)  /*!< Time Stamp Initialize */
+
+#define ETH_PTP_FLAG_TSTTR        ((uint32_t)0x10000002)  /* Time stamp target time reached */
+#define ETH_PTP_FLAG_TSSO         ((uint32_t)0x10000001)  /* Time stamp seconds overflow */
+
+#define IS_ETH_PTP_GET_FLAG(FLAG) (((FLAG) == ETH_PTP_FLAG_TSARU) || \
+                                    ((FLAG) == ETH_PTP_FLAG_TSITE) || \
+                                    ((FLAG) == ETH_PTP_FLAG_TSSTU) || \
+                                    ((FLAG) == ETH_PTP_FLAG_TSSTI) || \
+                                    ((FLAG) == ETH_PTP_FLAG_TSTTR) || \
+                                    ((FLAG) == ETH_PTP_FLAG_TSSO))
+
+/**
+  * @brief  ETH PTP subsecond increment
+  */
+#define IS_ETH_PTP_SUBSECOND_INCREMENT(SUBSECOND) ((SUBSECOND) <= 0xFF)
+
+/**
+  * @}
+  */
+
+
+/** @defgroup ETH_PTP_time_sign
+  * @{
+  */
+#define ETH_PTP_PositiveTime      ((uint32_t)0x00000000)  /*!< Positive time value */
+#define ETH_PTP_NegativeTime      ((uint32_t)0x80000000)  /*!< Negative time value */
+#define IS_ETH_PTP_TIME_SIGN(SIGN) (((SIGN) == ETH_PTP_PositiveTime) || \
+                                    ((SIGN) == ETH_PTP_NegativeTime))
+
+/**
+  * @brief  ETH PTP time stamp low update
+  */
+#define IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SUBSECOND) ((SUBSECOND) <= 0x7FFFFFFF)
+
+/**
+  * @brief  ETH PTP registers
+  */
+#define ETH_PTPTSCR     ((uint32_t)0x00000700)  /*!< PTP TSCR register */
+#define ETH_PTPSSIR     ((uint32_t)0x00000704)  /*!< PTP SSIR register */
+#define ETH_PTPTSHR     ((uint32_t)0x00000708)  /*!< PTP TSHR register */
+#define ETH_PTPTSLR     ((uint32_t)0x0000070C)  /*!< PTP TSLR register */
+#define ETH_PTPTSHUR    ((uint32_t)0x00000710)  /*!< PTP TSHUR register */
+#define ETH_PTPTSLUR    ((uint32_t)0x00000714)  /*!< PTP TSLUR register */
+#define ETH_PTPTSAR     ((uint32_t)0x00000718)  /*!< PTP TSAR register */
+#define ETH_PTPTTHR     ((uint32_t)0x0000071C)  /*!< PTP TTHR register */
+#define ETH_PTPTTLR     ((uint32_t)0x00000720)  /* PTP TTLR register */
+
+#define ETH_PTPTSSR     ((uint32_t)0x00000728)  /* PTP TSSR register */
+
+#define IS_ETH_PTP_REGISTER(REG) (((REG) == ETH_PTPTSCR) || ((REG) == ETH_PTPSSIR) || \
+                                   ((REG) == ETH_PTPTSHR) || ((REG) == ETH_PTPTSLR) || \
+                                   ((REG) == ETH_PTPTSHUR) || ((REG) == ETH_PTPTSLUR) || \
+                                   ((REG) == ETH_PTPTSAR) || ((REG) == ETH_PTPTTHR) || \
+                                   ((REG) == ETH_PTPTTLR) || ((REG) == ETH_PTPTSSR))
+
+/**
+  * @brief  ETHERNET PTP clock
+  */
+#define ETH_PTP_OrdinaryClock               ((uint32_t)0x00000000)  /* Ordinary Clock */
+#define ETH_PTP_BoundaryClock               ((uint32_t)0x00010000)  /* Boundary Clock */
+#define ETH_PTP_EndToEndTransparentClock    ((uint32_t)0x00020000)  /* End To End Transparent Clock */
+#define ETH_PTP_PeerToPeerTransparentClock  ((uint32_t)0x00030000)  /* Peer To Peer Transparent Clock */
+
+#define IS_ETH_PTP_TYPE_CLOCK(CLOCK) (((CLOCK) == ETH_PTP_OrdinaryClock) || \
+                          ((CLOCK) == ETH_PTP_BoundaryClock) || \
+                          ((CLOCK) == ETH_PTP_EndToEndTransparentClock) || \
+                                      ((CLOCK) == ETH_PTP_PeerToPeerTransparentClock))
+/**
+  * @brief  ETHERNET snapshot
+  */
+#define ETH_PTP_SnapshotMasterMessage          ((uint32_t)0x00008000)  /* Time stamp snapshot for message relevant to master enable */
+#define ETH_PTP_SnapshotEventMessage           ((uint32_t)0x00004000)  /* Time stamp snapshot for event message enable */
+#define ETH_PTP_SnapshotIPV4Frames             ((uint32_t)0x00002000)  /* Time stamp snapshot for IPv4 frames enable */
+#define ETH_PTP_SnapshotIPV6Frames             ((uint32_t)0x00001000)  /* Time stamp snapshot for IPv6 frames enable */
+#define ETH_PTP_SnapshotPTPOverEthernetFrames  ((uint32_t)0x00000800)  /* Time stamp snapshot for PTP over ethernet frames enable */
+#define ETH_PTP_SnapshotAllReceivedFrames      ((uint32_t)0x00000100)  /* Time stamp snapshot for all received frames enable */
+
+#define IS_ETH_PTP_SNAPSHOT(SNAPSHOT) (((SNAPSHOT) == ETH_PTP_SnapshotMasterMessage) || \
+                           ((SNAPSHOT) == ETH_PTP_SnapshotEventMessage) || \
+                           ((SNAPSHOT) == ETH_PTP_SnapshotIPV4Frames) || \
+                           ((SNAPSHOT) == ETH_PTP_SnapshotIPV6Frames) || \
+                           ((SNAPSHOT) == ETH_PTP_SnapshotPTPOverEthernetFrames) || \
+                           ((SNAPSHOT) == ETH_PTP_SnapshotAllReceivedFrames))
+
+/**
+  * @}
+  */
+
+
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Exported_Macros
+  * @{
+  */
+/**
+  * @}
+  */
+
+/** @defgroup ETH_Exported_Functions
+  * @{
+  */
+void ETH_DeInit(void);
+uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct);
+void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct);
+void ETH_SoftwareReset(void);
+FlagStatus ETH_GetSoftwareResetStatus(void);
+void  ETH_Start(void);
+uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength);
+uint32_t ETH_HandleRxPkt(uint8_t *ppkt);
+uint32_t ETH_GetRxPktSize(void);
+void ETH_DropRxPkt(void);
+
+#ifdef USE_ENHANCED_DMA_DESCRIPTORS
+ void ETH_EnhancedDescriptorCmd(FunctionalState NewState);
+#endif /* USE_ENHANCED_DMA_DESCRIPTORS */
+
+/**
+  * @brief  PHY
+  */
+uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg);
+uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue);
+uint32_t ETH_PHYLoopBackCmd(uint16_t PHYAddress, FunctionalState NewState);
+
+/**
+  * @brief  MAC
+  */
+void ETH_MACTransmissionCmd(FunctionalState NewState);
+void ETH_MACReceptionCmd(FunctionalState NewState);
+FlagStatus ETH_GetFlowControlBusyStatus(void);
+void ETH_InitiatePauseControlFrame(void);
+void ETH_BackPressureActivationCmd(FunctionalState NewState);
+FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG);
+ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT);
+void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState);
+void ETH_MACAddressConfig(uint32_t MacAddr, uint8_t *Addr);
+void ETH_GetMACAddress(uint32_t MacAddr, uint8_t *Addr);
+void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState);
+void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter);
+void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte);
+
+/**
+  * @brief  DMA Tx/Rx descriptors
+  */
+void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount);
+void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff1, uint8_t *TxBuff2, uint32_t TxBuffCount);
+FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag);
+uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc);
+void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc);
+void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment);
+void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum);
+void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState);
+void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2);
+void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount);
+void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff1, uint8_t *RxBuff2, uint32_t RxBuffCount);
+FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag);
+#ifdef USE_ENHANCED_DMA_DESCRIPTORS
+ FlagStatus ETH_GetDMAPTPRxDescExtendedFlagStatus(ETH_DMADESCTypeDef *DMAPTPRxDesc, uint32_t ETH_DMAPTPRxDescExtendedFlag);
+#endif /* USE_ENHANCED_DMA_DESCRIPTORS */
+void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc);
+uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc);
+void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState);
+void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState);
+void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState);
+uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer);
+
+/**
+  * @brief  DMA
+  */
+FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG);
+void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG);
+ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT);
+void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT);
+uint32_t ETH_GetTransmitProcessState(void);
+uint32_t ETH_GetReceiveProcessState(void);
+void ETH_FlushTransmitFIFO(void);
+FlagStatus ETH_GetFlushTransmitFIFOStatus(void);
+void ETH_DMATransmissionCmd(FunctionalState NewState);
+void ETH_DMAReceptionCmd(FunctionalState NewState);
+void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState);
+FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow);
+uint32_t ETH_GetRxOverflowMissedFrameCounter(void);
+uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void);
+uint32_t ETH_GetCurrentTxDescStartAddress(void);
+uint32_t ETH_GetCurrentRxDescStartAddress(void);
+uint32_t ETH_GetCurrentTxBufferAddress(void);
+uint32_t ETH_GetCurrentRxBufferAddress(void);
+void ETH_ResumeDMATransmission(void);
+void ETH_ResumeDMAReception(void);
+void ETH_SetReceiveWatchdogTimer(uint8_t Value);
+
+
+/**
+  * @brief  PMT
+  */
+void ETH_ResetWakeUpFrameFilterRegisterPointer(void);
+void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer);
+void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState);
+FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG);
+void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState);
+void ETH_MagicPacketDetectionCmd(FunctionalState NewState);
+void ETH_PowerDownCmd(FunctionalState NewState);
+
+/**
+  * @brief  MMC
+  */
+void ETH_MMCCounterFullPreset(void);
+void ETH_MMCCounterHalfPreset(void);
+void ETH_MMCCounterFreezeCmd(FunctionalState NewState);
+void ETH_MMCResetOnReadCmd(FunctionalState NewState);
+void ETH_MMCCounterRolloverCmd(FunctionalState NewState);
+void ETH_MMCCountersReset(void);
+void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState);
+ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT);
+uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg);
+
+/**
+  * @brief  PTP
+  */
+void ETH_PTPNodeClockTypeConfig(uint32_t ClockType);
+void ETH_PTPSnapshotCmd(uint32_t SnapshotMethod, FunctionalState NewState);
+void ETH_PTPPacketSnoopingV2FormatCmd(FunctionalState NewState);
+void ETH_PTPSubSecondRolloverCmd(FunctionalState NewState);
+uint32_t ETH_HandlePTPTxPkt(uint8_t *ppkt, uint16_t FrameLength, uint32_t *PTPTxTab);
+uint32_t ETH_HandlePTPRxPkt(uint8_t *ppkt, uint32_t *PTPRxTab);
+#ifdef USE_ENHANCED_DMA_DESCRIPTORS
+ void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMAPTPTxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount);
+ void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMAPTPRxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount);
+#endif /* USE_ENHANCED_DMA_DESCRIPTORS */
+void ETH_EnablePTPTimeStampAddend(void);
+void ETH_EnablePTPTimeStampInterruptTrigger(void);
+void ETH_EnablePTPTimeStampUpdate(void);
+void ETH_InitializePTPTimeStamp(void);
+void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod);
+void ETH_PTPTimeStampCmd(FunctionalState NewState);
+FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG);
+void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue);
+void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue);
+void ETH_SetPTPTimeStampAddend(uint32_t Value);
+void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue);
+uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg);
+
+/* STM32 ETH HW initialization */
+void rt_hw_stm32_eth_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32F2XX_ETH_H */
+/**
+  * @}
+  */
+
+
+/**
+  * @}
+  */
+
+/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/

+ 77 - 70
bsp/stm32f40x/project.uvproj

@@ -343,7 +343,7 @@
               <MiscControls />
               <Define>USE_STDPERIPH_DRIVER</Define>
               <Undefine />
-              <IncludePath>applications;.;Libraries/STM32F4xx_StdPeriph_Driver/inc;Libraries/CMSIS/ST/STM32F4xx/Include;Libraries/CMSIS/Include;drivers;../../include;../../libcpu/arm/cortex-m4;../../libcpu/arm/common;../../components/finsh;../../components/drivers/include;../../components/drivers/include;../../components/drivers/include</IncludePath>
+              <IncludePath>Libraries/STM32F4xx_StdPeriph_Driver/inc;Libraries/CMSIS/ST/STM32F4xx/Include;Libraries/CMSIS/Include;applications;.;drivers;../../include;../../libcpu/arm/cortex-m4;../../libcpu/arm/common;../../components/drivers/include;../../components/drivers/include;../../components/drivers/include;../../components/finsh</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -373,30 +373,13 @@
             <ScatterFile />
             <IncludeLibs />
             <IncludeLibsPath />
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
             <LinkerInputFile />
             <DisabledWarnings />
           </LDads>
         </TargetArmAds>
       </TargetOption>
       <Groups>
-        <Group>
-          <GroupName>Applications</GroupName>
-          <Files>
-            <File>
-              <FileName>application.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>applications/application.c</FilePath>
-            </File>
-          </Files>
-          <Files>
-            <File>
-              <FileName>startup.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>applications/startup.c</FilePath>
-            </File>
-          </Files>
-        </Group>
         <Group>
           <GroupName>STM32_StdPeriph</GroupName>
           <Files>
@@ -632,19 +615,29 @@
           </Files>
         </Group>
         <Group>
-          <GroupName>Drivers</GroupName>
+          <GroupName>Applications</GroupName>
           <Files>
             <File>
-              <FileName>board.c</FileName>
+              <FileName>application.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers/board.c</FilePath>
+              <FilePath>applications/application.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>gpio.c</FileName>
+              <FileName>startup.c</FileName>
               <FileType>1</FileType>
-              <FilePath>drivers/gpio.c</FilePath>
+              <FilePath>applications/startup.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/board.c</FilePath>
             </File>
           </Files>
           <Files>
@@ -661,6 +654,13 @@
               <FilePath>drivers/usart.c</FilePath>
             </File>
           </Files>
+          <Files>
+            <File>
+              <FileName>gpio.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/gpio.c</FilePath>
+            </File>
+          </Files>
         </Group>
         <Group>
           <GroupName>Kernel</GroupName>
@@ -671,6 +671,13 @@
               <FilePath>../../src/clock.c</FilePath>
             </File>
           </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
+            </File>
+          </Files>
           <Files>
             <File>
               <FileName>device.c</FileName>
@@ -788,155 +795,155 @@
           </Files>
         </Group>
         <Group>
-          <GroupName>finsh</GroupName>
+          <GroupName>DeviceDrivers</GroupName>
           <Files>
             <File>
-              <FileName>shell.c</FileName>
+              <FileName>pin.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/shell.c</FilePath>
+              <FilePath>../../components/drivers/misc/pin.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>symbol.c</FileName>
+              <FileName>serial.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/symbol.c</FilePath>
+              <FilePath>../../components/drivers/serial/serial.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>cmd.c</FileName>
+              <FileName>completion.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/cmd.c</FilePath>
+              <FilePath>../../components/drivers/src/completion.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_compiler.c</FileName>
+              <FileName>dataqueue.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
+              <FilePath>../../components/drivers/src/dataqueue.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_error.c</FileName>
+              <FileName>pipe.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_error.c</FilePath>
+              <FilePath>../../components/drivers/src/pipe.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_heap.c</FileName>
+              <FileName>portal.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
+              <FilePath>../../components/drivers/src/portal.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_init.c</FileName>
+              <FileName>ringbuffer.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_init.c</FilePath>
+              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_node.c</FileName>
+              <FileName>workqueue.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_node.c</FilePath>
+              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
             </File>
           </Files>
+        </Group>
+        <Group>
+          <GroupName>finsh</GroupName>
           <Files>
             <File>
-              <FileName>finsh_ops.c</FileName>
+              <FileName>shell.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
+              <FilePath>../../components/finsh/shell.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_parser.c</FileName>
+              <FileName>symbol.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_var.c</FileName>
+              <FileName>cmd.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_var.c</FilePath>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_vm.c</FileName>
+              <FileName>finsh_compiler.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>finsh_token.c</FileName>
+              <FileName>finsh_error.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/finsh/finsh_token.c</FilePath>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
             </File>
           </Files>
-        </Group>
-        <Group>
-          <GroupName>DeviceDrivers</GroupName>
           <Files>
             <File>
-              <FileName>serial.c</FileName>
+              <FileName>finsh_heap.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/drivers/serial/serial.c</FilePath>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>pin.c</FileName>
+              <FileName>finsh_init.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/drivers/misc/pin.c</FilePath>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>completion.c</FileName>
+              <FileName>finsh_node.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/drivers/src/completion.c</FilePath>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>dataqueue.c</FileName>
+              <FileName>finsh_ops.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/drivers/src/dataqueue.c</FilePath>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>pipe.c</FileName>
+              <FileName>finsh_parser.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/drivers/src/pipe.c</FilePath>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>portal.c</FileName>
+              <FileName>finsh_var.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/drivers/src/portal.c</FilePath>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>ringbuffer.c</FileName>
+              <FileName>finsh_vm.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
             </File>
           </Files>
           <Files>
             <File>
-              <FileName>workqueue.c</FileName>
+              <FileName>finsh_token.c</FileName>
               <FileType>1</FileType>
-              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
             </File>
           </Files>
         </Group>

+ 57 - 7
bsp/stm32f40x/project.uvprojx

@@ -365,7 +365,7 @@
               <MiscControls></MiscControls>
               <Define>USE_STDPERIPH_DRIVER</Define>
               <Undefine></Undefine>
-              <IncludePath>.;..\..\components\finsh;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m4;Libraries\CMSIS\Include;Libraries\CMSIS\ST\STM32F4xx\Include;Libraries\STM32F4xx_StdPeriph_Driver\inc;applications;drivers</IncludePath>
+              <IncludePath>.;..\..\components\drivers\include;..\..\components\finsh;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m4;Libraries\CMSIS\Include;Libraries\CMSIS\ST\STM32F4xx\Include;Libraries\STM32F4xx_StdPeriph_Driver\inc;applications;drivers</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -398,7 +398,7 @@
             <ScatterFile></ScatterFile>
             <IncludeLibs></IncludeLibs>
             <IncludeLibsPath></IncludeLibsPath>
-            <Misc> --keep __fsym_* --keep __vsym_* </Misc>
+            <Misc> --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
             <LinkerInputFile></LinkerInputFile>
             <DisabledWarnings></DisabledWarnings>
           </LDads>
@@ -428,11 +428,6 @@
               <FileType>1</FileType>
               <FilePath>drivers\board.c</FilePath>
             </File>
-            <File>
-              <FileName>serial.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>drivers\serial.c</FilePath>
-            </File>
             <File>
               <FileName>stm32f4xx_it.c</FileName>
               <FileType>1</FileType>
@@ -443,6 +438,11 @@
               <FileType>1</FileType>
               <FilePath>drivers\usart.c</FilePath>
             </File>
+            <File>
+              <FileName>gpio.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers\gpio.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -623,6 +623,11 @@
               <FileType>1</FileType>
               <FilePath>..\..\src\clock.c</FilePath>
             </File>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\src\components.c</FilePath>
+            </File>
             <File>
               <FileName>device.c</FileName>
               <FileType>1</FileType>
@@ -710,6 +715,51 @@
             </File>
           </Files>
         </Group>
+        <Group>
+          <GroupName>DeviceDrivers</GroupName>
+          <Files>
+            <File>
+              <FileName>pin.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\components\drivers\misc\pin.c</FilePath>
+            </File>
+            <File>
+              <FileName>serial.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\components\drivers\serial\serial.c</FilePath>
+            </File>
+            <File>
+              <FileName>completion.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\components\drivers\src\completion.c</FilePath>
+            </File>
+            <File>
+              <FileName>dataqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\components\drivers\src\dataqueue.c</FilePath>
+            </File>
+            <File>
+              <FileName>pipe.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\components\drivers\src\pipe.c</FilePath>
+            </File>
+            <File>
+              <FileName>portal.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\components\drivers\src\portal.c</FilePath>
+            </File>
+            <File>
+              <FileName>ringbuffer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\components\drivers\src\ringbuffer.c</FilePath>
+            </File>
+            <File>
+              <FileName>workqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\components\drivers\src\workqueue.c</FilePath>
+            </File>
+          </Files>
+        </Group>
         <Group>
           <GroupName>finsh</GroupName>
           <Files>

+ 1210 - 0
bsp/tm4c129x/project.uvproj

@@ -0,0 +1,1210 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+  <SchemaVersion>1.1</SchemaVersion>
+  <Header>### uVision Project, (C) Keil Software</Header>
+  <Targets>
+    <Target>
+      <TargetName>RT-Thread TM4C129X</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>TM4C1294NCPDT</Device>
+          <Vendor>Texas Instruments</Vendor>
+          <PackID>Keil.TM4C_DFP.1.0.0</PackID>
+          <PackURL>http://www.keil.com/pack/</PackURL>
+          <Cpu>IROM(0x00000000,0x100000) IRAM(0x20000000,0x040000) CPUTYPE("Cortex-M4") FPU2 CLOCK(120000000) ELITTLE</Cpu>
+          <FlashUtilSpec />
+          <StartupFile />
+          <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C129_1024 -FS00 -FL0100000 -FP0($$Device:TM4C1294NCPDT$Flash\TM4C129_1024.FLM))</FlashDriverDll>
+          <DeviceId>7088</DeviceId>
+          <RegisterFile>$$Device:TM4C1294NCPDT$Device\Include\TM4C129\TM4C129.h</RegisterFile>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc>-DTM4C1294NCPDT</SLE66CMisc>
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile>$$Device:TM4C1294NCPDT$SVD\TM4C129\TM4C1294NCPDT.svd</SFDFile>
+          <bCustSvd>0</bCustSvd>
+          <UseEnv>0</UseEnv>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
+          <RegisterFilePath />
+          <DBRegisterFilePath />
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\build\</OutputDirectory>
+          <OutputName>rtthread-tm4c</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopB1X>0</nStopB1X>
+            <nStopB2X>0</nStopB2X>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString />
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument />
+          <IncludeLibraryModules />
+          <ComprImg>1</ComprImg>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments>-MPU</SimDllArguments>
+          <SimDlgDll>DCM.DLL</SimDlgDll>
+          <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments>-MPU</TargetDllArguments>
+          <TargetDlgDll>TCM.DLL</TargetDlgDll>
+          <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>0</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+            <RestoreSysVw>1</RestoreSysVw>
+          </Simulator>
+          <Target>
+            <UseTarget>1</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>1</RestoreTracepoints>
+            <RestoreSysVw>1</RestoreSysVw>
+            <UsePdscDebugDescription>1</UsePdscDebugDescription>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>6</TargetSelection>
+          <SimDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+            <Driver>Segger\JL2CM3.dll</Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4096</DriverSelection>
+          </Flash1>
+          <bUseTDR>1</bUseTDR>
+          <Flash2>BIN\UL2CM3.DLL</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4 />
+          <pFcarmOut />
+          <pFcarmGrp />
+          <pFcArmRoot />
+          <FcArmLst>0</FcArmLst>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M4"</AdsCpuType>
+            <RvctDeviceName />
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>1</hadIROM>
+            <hadIRAM>1</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>2</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>8</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>0</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>3</RoSelD>
+            <RwSelD>3</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>0</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>1</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>0</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>1</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x40000</Size>
+              </IRAM>
+              <IROM>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x100000</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x100000</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x40000</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector />
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>1</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>2</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <uC99>0</uC99>
+            <useXO>0</useXO>
+            <VariousControls>
+              <MiscControls />
+              <Define>PART_TM4C129XNCZAD</Define>
+              <Undefine />
+              <IncludePath>libraries;libraries/inc;libraries/driverlib;applications;.;drivers;../../include;../../libcpu/arm/cortex-m4;../../libcpu/arm/common;../../components/drivers/include;../../components/drivers/include;../../components/finsh;../../components/net/lwip-1.4.1/src;../../components/net/lwip-1.4.1/src/include;../../components/net/lwip-1.4.1/src/include/ipv4;../../components/net/lwip-1.4.1/src/arch/include;../../components/net/lwip-1.4.1/src/include/netif</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <useXO>0</useXO>
+            <VariousControls>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>0</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <pXoBase />
+            <ScatterFile>tm4c_rom.sct</ScatterFile>
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc> --keep *.o(.rti_fn.*)   --keep *.o(FSymTab) --keep *.o(VSymTab) </Misc>
+            <LinkerInputFile />
+            <DisabledWarnings />
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Libraries</GroupName>
+          <Files>
+            <File>
+              <FileName>adc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/adc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>aes.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/aes.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>can.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/can.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>comp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/comp.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>cpu.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/cpu.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>crc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/crc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>des.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/des.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>eeprom.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/eeprom.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>emac.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/emac.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>epi.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/epi.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>flash.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/flash.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>fpu.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/fpu.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>gpio.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/gpio.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>hibernate.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/hibernate.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>i2c.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/i2c.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>interrupt.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/interrupt.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lcd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/lcd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mpu.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/mpu.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pwm.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/pwm.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>qei.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/qei.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>shamd5.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/shamd5.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ssi.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/ssi.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>sw_crc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/sw_crc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>sysctl.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/sysctl.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>sysexc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/sysexc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>systick.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/systick.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>tiva_timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/tiva_timer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/uart.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>udma.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/udma.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>usb.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/usb.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>watchdog.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries/driverlib/watchdog.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup_rvmdk.S</FileName>
+              <FileType>2</FileType>
+              <FilePath>libraries/startup/startup_rvmdk.S</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
+            <File>
+              <FileName>application.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/application.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/board.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications/startup.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
+            <File>
+              <FileName>drv_eth.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/drv_eth.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>drv_uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers/drv_uart.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Kernel</GroupName>
+          <Files>
+            <File>
+              <FileName>clock.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/components.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>device.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/device.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>idle.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/idle.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ipc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/ipc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>irq.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/irq.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>kservice.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/kservice.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/mem.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>memheap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/memheap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mempool.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/mempool.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>object.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/object.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>scheduler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/scheduler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>thread.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/thread.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../src/timer.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>CORTEX-M4</GroupName>
+          <Files>
+            <File>
+              <FileName>cpuport.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/cortex-m4/cpuport.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>context_rvds.S</FileName>
+              <FileType>2</FileType>
+              <FilePath>../../libcpu/arm/cortex-m4/context_rvds.S</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>backtrace.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/backtrace.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>div0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/div0.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>showmem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../libcpu/arm/common/showmem.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>DeviceDrivers</GroupName>
+          <Files>
+            <File>
+              <FileName>serial.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/serial/serial.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>completion.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/completion.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dataqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/dataqueue.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pipe.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/pipe.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>portal.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/portal.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ringbuffer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/ringbuffer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>workqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/drivers/src/workqueue.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>symbol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/symbol.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>cmd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/cmd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_compiler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_compiler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_error.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_error.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_heap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_heap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_init.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_init.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_node.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_node.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_ops.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_ops.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_parser.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_parser.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_var.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_var.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_vm.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_vm.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>finsh_token.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/finsh/finsh_token.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>LwIP</GroupName>
+          <Files>
+            <File>
+              <FileName>api_lib.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_lib.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>api_msg.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/api_msg.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>err.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/err.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>netbuf.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netbuf.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>netdb.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netdb.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>netifapi.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/netifapi.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>sockets.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/sockets.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>tcpip.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/api/tcpip.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>sys_arch.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/arch/sys_arch.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>def.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/def.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dhcp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dhcp.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dns.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/dns.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>init.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/init.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>memp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/memp.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>netif.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/netif.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pbuf.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/pbuf.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>raw.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/raw.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>stats.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/stats.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>sys.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/sys.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>tcp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>tcp_in.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_in.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>tcp_out.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/tcp_out.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>timers.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/timers.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>udp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/udp.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>autoip.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/autoip.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>icmp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/icmp.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>igmp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/igmp.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>inet.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>inet_chksum.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/inet_chksum.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ip.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ip_addr.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_addr.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ip_frag.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/core/ipv4/ip_frag.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>etharp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/etharp.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ethernetif.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/ethernetif.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>slipif.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>../../components/net/lwip-1.4.1/src/netif/slipif.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+</Project>

+ 8 - 0
components/drivers/can/SConscript

@@ -0,0 +1,8 @@
+from building import *
+
+cwd     = GetCurrentDir()
+src     = Glob('*.c')
+CPPPATH = [cwd + '/../include']
+group   = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_CAN'], CPPPATH = CPPPATH)
+
+Return('group')

+ 907 - 0
components/drivers/can/can.c

@@ -0,0 +1,907 @@
+/*
+ * File      : can.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2015, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date           Author       		Notes
+ * 2015-05-14     aubrcool@qq.com 	first version
+ */
+#include <rthw.h>
+#include <rtthread.h>
+#include <rtdevice.h>
+
+static rt_err_t rt_can_init(struct rt_device *dev)
+{
+    rt_err_t result = RT_EOK;
+    struct rt_can_device *can;
+
+    RT_ASSERT(dev != RT_NULL);
+    can = (struct rt_can_device *)dev;
+
+    /* initialize rx/tx */
+    can->can_rx = RT_NULL;
+    can->can_tx = RT_NULL;
+
+    /* apply configuration */
+    if (can->ops->configure)
+        result = can->ops->configure(can, &can->config);
+
+    return result;
+}
+/*
+ * can interrupt routines
+ */
+rt_inline int _can_int_rx(struct rt_can_device *can, struct rt_can_msg *data, int msgs)
+{
+    int size;
+    struct rt_can_rx_fifo* rx_fifo;
+
+    RT_ASSERT(can != RT_NULL);
+    size = msgs; 
+    
+    rx_fifo = (struct rt_can_rx_fifo*) can->can_rx;
+    RT_ASSERT(rx_fifo != RT_NULL);
+
+    /* read from software FIFO */
+    while (msgs)
+    {
+        rt_base_t level;
+        struct rt_can_msg_list *listmsg=RT_NULL;
+        /* disable interrupt */
+        level = rt_hw_interrupt_disable();
+#ifdef RT_CAN_USING_HDR
+        rt_int32_t hdr = data->hdr;
+        if (hdr >=0 && can->hdr && hdr < can->config.maxhdr && !rt_list_isempty(&can->hdr[hdr].list))
+        {
+             listmsg=rt_list_entry(can->hdr[hdr].list.next, struct rt_can_msg_list, hdrlist);
+             rt_list_remove(&listmsg->list);
+             rt_list_remove(&listmsg->hdrlist);
+             if(can->hdr[hdr].msgs) {
+               can->hdr[hdr].msgs--;                     
+             }
+             listmsg->owner = RT_NULL;
+        } else
+#endif /*RT_CAN_USING_HDR*/
+        if (!rt_list_isempty(&rx_fifo->uselist))
+        {
+             listmsg=rt_list_entry(rx_fifo->uselist.next, struct rt_can_msg_list, list);
+             rt_list_remove(&listmsg->list);
+#ifdef RT_CAN_USING_HDR
+             rt_list_remove(&listmsg->hdrlist);
+             if(listmsg->owner != RT_NULL && listmsg->owner->msgs) {
+                listmsg->owner->msgs--;                     
+              }
+              listmsg->owner = RT_NULL;
+#endif
+        }
+        else
+        {
+            /* no data, enable interrupt and break out */
+            rt_hw_interrupt_enable(level);
+            break;
+        }
+
+        /* enable interrupt */
+        rt_hw_interrupt_enable(level);
+        if(listmsg!=RT_NULL)
+        {
+            rt_memcpy(data,&listmsg->data,sizeof(struct rt_can_msg));
+            level = rt_hw_interrupt_disable();
+            rt_list_insert_before(&rx_fifo->freelist,&listmsg->list);
+            rx_fifo->freenumbers++;
+            RT_ASSERT(rx_fifo->freenumbers <= can->config.msgboxsz);
+            rt_hw_interrupt_enable(level);
+            listmsg = RT_NULL;
+        }
+        data ++; msgs -= sizeof(struct rt_can_msg);
+    }
+
+    return (size - msgs);
+}
+
+rt_inline int _can_int_tx(struct rt_can_device *can, const struct rt_can_msg *data, int msgs)
+{
+    int size;
+    struct rt_can_tx_fifo *tx_fifo;
+    
+    RT_ASSERT(can != RT_NULL);
+
+    size = msgs;
+    tx_fifo = (struct rt_can_tx_fifo*) can->can_tx;
+    RT_ASSERT(tx_fifo != RT_NULL);
+
+    while (msgs)
+    {      
+        rt_base_t level;
+        rt_uint32_t no;
+        struct rt_can_sndbxinx_list* tx_tosnd = RT_NULL;
+        level = rt_hw_interrupt_disable();
+        if(!rt_list_isempty(&tx_fifo->freelist))
+        {
+            tx_tosnd = rt_list_entry(tx_fifo->freelist.next, struct rt_can_sndbxinx_list, list);
+            RT_ASSERT(tx_tosnd != RT_NULL);
+            rt_list_remove(&tx_tosnd->list);
+        } else {
+            rt_hw_interrupt_enable(level);
+            rt_completion_wait(&(tx_fifo->completion), RT_WAITING_FOREVER);
+            continue;
+        }
+        rt_hw_interrupt_enable(level);
+        no=((rt_uint32_t)tx_tosnd-(rt_uint32_t)tx_fifo->buffer)/sizeof(struct rt_can_sndbxinx_list);
+        tx_tosnd->result = RT_CAN__SND_RESUTL_WAIT;
+        if (can->ops->sendmsg(can, data ,no))
+        {
+            level = rt_hw_interrupt_disable();
+            rt_list_insert_after(&tx_fifo->freelist,&tx_tosnd->list);
+            rt_hw_interrupt_enable(level);
+            continue;
+        }
+        can->status.sndchange = 1;
+        rt_completion_wait(&(tx_tosnd->completion), RT_WAITING_FOREVER);
+        level = rt_hw_interrupt_disable();
+        rt_uint32_t result = tx_tosnd->result;
+        if(!rt_list_isempty(&tx_tosnd->list)) {
+                rt_list_remove(&tx_tosnd->list);
+        }
+        rt_list_insert_before(&tx_fifo->freelist,&tx_tosnd->list);
+        rt_hw_interrupt_enable(level);
+        
+        if(result == RT_CAN__SND_RESUTL_OK)
+        {
+            level = rt_hw_interrupt_disable();
+            can->status.sndpkg++;
+            rt_hw_interrupt_enable(level);
+            data ++; msgs -= sizeof(struct rt_can_msg);
+            if(!msgs) break;
+        }
+        else
+        {
+            level = rt_hw_interrupt_disable();
+            can->status.dropedsndpkg++;
+            rt_hw_interrupt_enable(level);
+            break;
+        }
+
+        level = rt_hw_interrupt_disable();
+        if(rt_list_isempty(&tx_fifo->freelist))
+        {
+              rt_hw_interrupt_enable(level);
+              rt_completion_done(&(tx_fifo->completion));
+        }
+        else
+        {
+              rt_hw_interrupt_enable(level);
+        }
+    }
+
+    return (size - msgs);
+}
+rt_inline int _can_int_tx_priv(struct rt_can_device *can, const struct rt_can_msg *data, int msgs)
+{
+    int size;
+    struct rt_can_tx_fifo *tx_fifo;
+    
+    RT_ASSERT(can != RT_NULL);
+
+    size = msgs;
+    tx_fifo = (struct rt_can_tx_fifo*) can->can_tx;
+    RT_ASSERT(tx_fifo != RT_NULL);
+
+    rt_base_t level;
+    rt_uint32_t no;
+    rt_uint32_t result;
+    while (msgs)
+    {      
+        no = data->priv;
+        if(no >= can->config.sndboxnumber) {
+           break;
+        }
+        level = rt_hw_interrupt_disable();
+        if((tx_fifo->buffer[no].result != RT_CAN__SND_RESUTL_OK)) {
+           rt_hw_interrupt_enable(level);
+           rt_completion_wait(&(tx_fifo->buffer[no].completion), RT_WAITING_FOREVER);
+           continue;
+        }
+        tx_fifo->buffer[no].result = RT_CAN__SND_RESUTL_WAIT;
+        rt_hw_interrupt_enable(level);
+        if (can->ops->sendmsg(can, data ,no) != RT_EOK)
+        {
+            continue;
+        }
+        can->status.sndchange = 1;
+        rt_completion_wait(&(tx_fifo->buffer[no].completion), RT_WAITING_FOREVER);
+        result = tx_fifo->buffer[no].result;
+        if(result == RT_CAN__SND_RESUTL_OK)
+        {
+            level = rt_hw_interrupt_disable();
+            can->status.sndpkg++;
+            rt_hw_interrupt_enable(level);
+            data ++; msgs -= sizeof(struct rt_can_msg);
+            if(!msgs) break;
+        }
+        else
+        {
+            level = rt_hw_interrupt_disable();
+            can->status.dropedsndpkg++;
+            rt_hw_interrupt_enable(level);
+            break;
+        }
+    }
+
+    return (size - msgs);
+}
+static rt_err_t rt_can_open(struct rt_device *dev, rt_uint16_t oflag)
+{
+    struct rt_can_device *can;
+
+    RT_ASSERT(dev != RT_NULL);
+    can = (struct rt_can_device *)dev;
+
+    /* get open flags */
+    dev->open_flag = oflag & 0xff;
+    rt_enter_critical();
+    if (can->can_rx == RT_NULL)
+    {
+        if (oflag & RT_DEVICE_FLAG_INT_RX)
+        {
+            struct rt_can_rx_fifo* rx_fifo;
+
+            rx_fifo = (struct rt_can_rx_fifo*) rt_malloc (sizeof(struct rt_can_rx_fifo) + 
+                can->config.msgboxsz * sizeof(struct rt_can_msg_list));
+            RT_ASSERT(rx_fifo != RT_NULL);
+            rx_fifo->buffer = (struct rt_can_msg_list*) (rx_fifo + 1);
+            rt_memset(rx_fifo->buffer, 0, can->config.msgboxsz * sizeof(struct rt_can_msg_list));
+            rt_list_init(&rx_fifo->freelist);
+            rt_list_init(&rx_fifo->uselist);
+            rx_fifo->freenumbers=can->config.msgboxsz;
+            int i = 0;
+            for(i = 0;  i< can->config.msgboxsz; i++)
+            {
+                  rt_list_insert_before(&rx_fifo->freelist,&rx_fifo->buffer[i].list);
+#ifdef RT_CAN_USING_HDR
+                  rt_list_init(&rx_fifo->buffer[i].hdrlist);
+                  rx_fifo->buffer[i].owner = RT_NULL;
+#endif
+            }
+            can->can_rx = rx_fifo;
+            rt_exit_critical();
+            dev->open_flag |= RT_DEVICE_FLAG_INT_RX;
+            /* configure low level device */
+            can->ops->control(can, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_RX);
+        }
+        else
+        {
+            can->can_rx = RT_NULL;
+            rt_exit_critical();
+        }
+    } else {
+        rt_exit_critical();
+    }
+    rt_enter_critical();
+    if (can->can_tx == RT_NULL)
+    {
+        if (oflag & RT_DEVICE_FLAG_INT_TX)
+        {
+            struct rt_can_tx_fifo *tx_fifo;
+
+            tx_fifo = (struct rt_can_tx_fifo*) rt_malloc(sizeof(struct rt_can_tx_fifo)+
+                                can->config.sndboxnumber*sizeof(struct rt_can_sndbxinx_list));
+            RT_ASSERT(tx_fifo != RT_NULL);
+            tx_fifo->buffer = (struct rt_can_sndbxinx_list *) (tx_fifo + 1);
+            rt_memset(tx_fifo->buffer, 0, 
+                      can->config.sndboxnumber*sizeof(struct rt_can_sndbxinx_list));
+            rt_list_init(&tx_fifo->freelist);
+            int i = 0;
+            for(i = 0;  i< can->config.sndboxnumber; i++)
+            {
+                  rt_list_insert_before(&tx_fifo->freelist,&tx_fifo->buffer[i].list);
+                  rt_completion_init(&(tx_fifo->buffer[i].completion));
+                  tx_fifo->buffer[i].result = RT_CAN__SND_RESUTL_OK;
+            }
+            rt_completion_init(&(tx_fifo->completion));
+            can->can_tx = tx_fifo;
+            rt_exit_critical();
+            dev->open_flag |= RT_DEVICE_FLAG_INT_TX;
+            /* configure low level device */
+            can->ops->control(can, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_TX);
+        }
+        else
+        {
+            can->can_tx = RT_NULL;
+            rt_exit_critical();
+        }
+    } else {
+        rt_exit_critical();
+    }
+    can->ops->control(can, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_CAN_INT_ERR);
+#ifdef RT_CAN_USING_HDR
+    rt_enter_critical();
+    if(can->hdr == RT_NULL) {
+        struct rt_can_hdr * phdr;
+        phdr = (struct rt_can_hdr *) rt_malloc(can->config.maxhdr*sizeof(struct rt_can_hdr));
+        RT_ASSERT(phdr != RT_NULL);
+        rt_memset(phdr, 0,can->config.maxhdr*sizeof(struct rt_can_hdr));
+        int i = 0;
+        for(i = 0;  i< can->config.maxhdr; i++)
+        {
+              rt_list_init(&phdr[i].list);
+        }
+        can->hdr = phdr;
+        rt_exit_critical();
+    } else {
+        rt_exit_critical();
+    }
+#endif
+    rt_enter_critical();
+    if(!can->timerinitflag) {
+        can->timerinitflag = 1;
+        rt_exit_critical();
+        #ifdef RT_CAN_USING_LED
+        if(can->config.rcvled != RT_NULL) {
+            rt_pin_mode(can->config.rcvled->pin,can->config.rcvled->mode);
+            rt_pin_write(can->config.rcvled->pin,can->config.rcvled->init);
+        }
+        if(can->config.sndled != RT_NULL) {
+            rt_pin_mode(can->config.sndled->pin,can->config.sndled->mode);
+            rt_pin_write(can->config.sndled->pin,can->config.sndled->init);
+        }
+        if(can->config.errled != RT_NULL) {
+            rt_pin_mode(can->config.errled->pin,can->config.errled->mode);
+            rt_pin_write(can->config.errled->pin,can->config.errled->init);
+        }
+        #endif
+        rt_timer_start(&can->timer);
+    } else {
+        rt_exit_critical();
+    }
+    return RT_EOK;
+}
+
+static rt_err_t rt_can_close(struct rt_device *dev)
+{
+    struct rt_can_device *can;
+
+    RT_ASSERT(dev != RT_NULL);
+    can = (struct rt_can_device *)dev;
+
+    /* this device has more reference count */
+    if (dev->ref_count > 1) return RT_EOK;
+    rt_enter_critical();
+    if(can->timerinitflag) {
+        can->timerinitflag = 0;
+        rt_exit_critical();
+        rt_timer_stop(&can->timer);
+        #ifdef RT_CAN_USING_LED
+        rt_pin_write(can->config.rcvled->pin,can->config.rcvled->init);
+        rt_pin_write(can->config.rcvled->pin,can->config.sndled->init);
+        rt_pin_write(can->config.rcvled->pin,can->config.errled->init);
+        #endif
+    } else {
+        rt_exit_critical();
+    }
+    rt_enter_critical();
+    can->status_indicate.ind = RT_NULL;
+    can->status_indicate.args = RT_NULL;
+    rt_exit_critical();
+#ifdef RT_CAN_USING_HDR
+    rt_enter_critical();
+    if(can->hdr != RT_NULL) {
+        rt_free(can->hdr);
+        can->hdr = RT_NULL;
+        rt_exit_critical();
+    } else {
+        rt_exit_critical();
+    }
+#endif
+    if (dev->open_flag & RT_DEVICE_FLAG_INT_RX)
+    {
+        struct rt_can_rx_fifo* rx_fifo;
+
+        rx_fifo = (struct rt_can_rx_fifo*)can->can_rx;
+        RT_ASSERT(rx_fifo != RT_NULL);
+
+        rt_free(rx_fifo);
+        dev->open_flag &= ~RT_DEVICE_FLAG_INT_RX;
+        /* configure low level device */
+        can->ops->control(can, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_TX);
+    }
+    if (dev->open_flag & RT_DEVICE_FLAG_INT_TX)
+    {
+        struct rt_can_tx_fifo* tx_fifo;
+
+        tx_fifo = (struct rt_can_tx_fifo*)can->can_rx;
+        RT_ASSERT(tx_fifo != RT_NULL);
+
+        rt_free(tx_fifo);
+        dev->open_flag &= ~RT_DEVICE_FLAG_INT_TX;
+        /* configure low level device */
+        can->ops->control(can, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_TX);
+    }
+    can->ops->control(can, RT_DEVICE_CTRL_CLR_INT, (void *)RT_DEVICE_CAN_INT_ERR);
+    return RT_EOK;
+}
+
+static rt_size_t rt_can_read(struct rt_device *dev,
+                                rt_off_t          pos,
+                                void             *buffer,
+                                rt_size_t         size)
+{
+    struct rt_can_device *can;
+
+    RT_ASSERT(dev != RT_NULL);
+    if (size == 0) return 0;
+
+    can = (struct rt_can_device *)dev;
+
+    if (dev->open_flag & RT_DEVICE_FLAG_INT_RX)
+    {
+          return _can_int_rx(can, buffer, size);
+    }
+    return 0;
+}
+
+static rt_size_t rt_can_write(struct rt_device *dev,
+                                 rt_off_t          pos,
+                                 const void       *buffer,
+                                 rt_size_t         size)
+{
+    struct rt_can_device *can;
+
+    RT_ASSERT(dev != RT_NULL);
+    if (size == 0) return 0;
+
+    can = (struct rt_can_device *)dev;
+
+    if (dev->open_flag & RT_DEVICE_FLAG_INT_TX)
+    {
+      if(can->config.privmode) {
+         return _can_int_tx_priv(can, buffer, size);
+      } else {
+         return _can_int_tx(can, buffer, size);
+      }
+    }
+    return 0;
+}
+
+static rt_err_t rt_can_control(struct rt_device *dev,
+                                  rt_uint8_t        cmd,
+                                  void             *args)
+{
+    struct rt_can_device *can;
+    rt_err_t res;
+
+    RT_ASSERT(dev != RT_NULL);
+    can = (struct rt_can_device *)dev;
+
+    switch (cmd)
+    {
+        case RT_DEVICE_CTRL_SUSPEND:
+            /* suspend device */
+            dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
+            break;
+
+        case RT_DEVICE_CTRL_RESUME:
+            /* resume device */
+            dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
+            break;
+
+        case RT_DEVICE_CTRL_CONFIG:
+            /* configure device */
+            can->ops->configure(can, (struct can_configure *)args);
+            break;
+        case RT_CAN_CMD_SET_PRIV:
+            /* configure device */
+            if((rt_uint32_t)args != can->config.privmode) {
+              if(res = can->ops->control(can, cmd, args) != RT_EOK) {
+                return res;
+              }
+              struct rt_can_tx_fifo* tx_fifo;
+              tx_fifo = (struct rt_can_tx_fifo*) can->can_tx;
+              int i;
+              rt_base_t level; 
+              if(can->config.privmode) {
+                  rt_completion_done(&(tx_fifo->completion));
+                  level = rt_hw_interrupt_disable();
+                   for(i = 0;  i< can->config.sndboxnumber; i++)
+                   {
+                       rt_list_remove(&tx_fifo->buffer[i].list);
+                   }
+                   rt_hw_interrupt_enable(level);
+              } else {
+                    for(i = 0;  i< can->config.sndboxnumber; i++)
+                    {
+                        rt_base_t level;
+                        level = rt_hw_interrupt_disable();
+                        if(tx_fifo->buffer[i].result == RT_CAN__SND_RESUTL_OK) {
+                            rt_list_insert_before(&tx_fifo->freelist,&tx_fifo->buffer[i].list);
+                        }
+                        rt_hw_interrupt_enable(level);
+                    }
+              }
+              return RT_EOK;
+            }
+            break;
+      case RT_CAN_CMD_SET_STATUS_IND:
+            can->status_indicate.ind = ((rt_can_status_ind_type_t)args)->ind;
+            can->status_indicate.args = ((rt_can_status_ind_type_t)args)->args;
+      break;
+#ifdef RT_CAN_USING_HDR
+        case RT_CAN_CMD_SET_FILTER:
+            res = can->ops->control(can, cmd, args);
+            if(res != RT_EOK || can->hdr == RT_NULL) {
+              return res;
+            }
+            {
+                  struct rt_can_filter_config* pfilter;
+                  struct rt_can_filter_item* pitem;
+                  rt_uint32_t count;
+                  rt_base_t level; 
+                  pfilter = (struct rt_can_filter_config*)args;
+                  count = pfilter->count;
+                  pitem = pfilter->items;
+                  if(pfilter->actived) {
+                        while(count) {
+                          if(pitem->hdr >= can->config.maxhdr || pitem->hdr < 0) {
+                            count--;
+                            pitem++;
+                            continue;
+                          }
+                          level = rt_hw_interrupt_disable();
+                          if(!can->hdr[pitem->hdr].connected) {
+                              rt_memcpy(&can->hdr[pitem->hdr].filter,pitem,
+                                        sizeof(struct rt_can_filter_item));
+                              can->hdr[pitem->hdr].connected = 1;
+                              can->hdr[pitem->hdr].msgs = 0;
+                              rt_list_init(&can->hdr[pitem->hdr].list);
+                          }
+                          rt_hw_interrupt_enable(level);
+                          count--;
+                          pitem++;
+                        }
+                  } else {
+                       while(count) {
+                          if(pitem->hdr >= can->config.maxhdr || pitem->hdr < 0) {
+                            count--;
+                            pitem++;
+                            continue;
+                          }
+                          level = rt_hw_interrupt_disable();
+                          if(can->hdr[pitem->hdr].connected) {
+                              rt_memset(&can->hdr[pitem->hdr].filter,0,
+                                        sizeof(struct rt_can_filter_item));
+                              can->hdr[pitem->hdr].connected = 0;
+                              can->hdr[pitem->hdr].msgs = 0;
+                              if(!rt_list_isempty(&can->hdr[pitem->hdr].list))
+                              {
+                                  rt_list_remove(can->hdr[pitem->hdr].list.next);
+                              }
+                          }
+                          rt_hw_interrupt_enable(level);
+                          count--;
+                          pitem++;
+                        }
+                  }
+            }
+            break;
+#endif /*RT_CAN_USING_HDR*/
+        default :
+            /* control device */
+            if(can->ops->control != RT_NULL)
+            {
+                can->ops->control(can, cmd, args);
+            }
+            break;
+    }
+
+    return RT_EOK;
+}
+/*
+ * can timer
+ */
+static void cantimeout(void* arg)
+{
+     rt_uint32_t ledonflag = 0;
+     rt_can_t can = (rt_can_t)arg;
+     rt_device_control((rt_device_t)can,RT_CAN_CMD_GET_STATUS,(void* )&can->status);
+     if(can->timerinitflag == 1) {
+         ledonflag = 1;
+         can->timerinitflag = 0xFF;
+     }
+     #ifdef RT_CAN_USING_LED
+     if(can->config.rcvled != RT_NULL && can->config.sndled == RT_NULL) {
+         if(ledonflag == 1) {
+              rt_pin_write(can->config.rcvled->pin,can->config.rcvled->init?0:1);
+         } else {
+             if(can->status.rcvchange == 1 || can->status.sndchange == 1)
+             {
+                 can->status.rcvchange = 0;
+                 can->status.sndchange = 0;
+                 rt_pin_write(can->config.rcvled->pin,rt_pin_read(can->config.rcvled->pin)?0:1);
+             } else {
+                 rt_pin_write(can->config.rcvled->pin,can->config.rcvled->init);
+             }
+         }
+     } else if(can->config.rcvled != RT_NULL && can->config.sndled != RT_NULL) {
+         if(ledonflag == 1) {
+               rt_pin_write(can->config.rcvled->pin,can->config.rcvled->init?0:1);
+               rt_pin_write(can->config.sndled->pin,can->config.sndled->init?0:1);
+         } else {
+               if(can->status.rcvchange == 1)
+               {
+                   can->status.rcvchange = 0;
+                   rt_pin_write(can->config.rcvled->pin,rt_pin_read(can->config.rcvled->pin)?0:1);
+               } else {
+                   rt_pin_write(can->config.rcvled->pin,can->config.rcvled->init);
+               }
+               if(can->status.sndchange == 1)
+               {
+                   can->status.sndchange = 0;
+                   rt_pin_write(can->config.sndled->pin,rt_pin_read(can->config.sndled->pin)?0:1);
+               } else {
+                   rt_pin_write(can->config.sndled->pin,can->config.sndled->init);
+               }
+         }
+     } else if(can->config.rcvled == RT_NULL && can->config.sndled != RT_NULL) {
+         if(ledonflag == 1) {
+               rt_pin_write(can->config.sndled->pin,can->config.sndled->init?0:1);
+         } else {
+               if(can->status.rcvchange == 1 || can->status.sndchange == 1)
+               {
+                   can->status.rcvchange = 0;
+                   can->status.sndchange = 0;
+                   rt_pin_write(can->config.sndled->pin,rt_pin_read(can->config.sndled->pin)?0:1);
+               } else {
+                   rt_pin_write(can->config.sndled->pin,can->config.sndled->init);
+               }
+         }
+     }
+     if(ledonflag == 1) {
+           rt_pin_write(can->config.errled->pin,can->config.errled->init?0:1);
+     } else {
+           if(can->status.errcode) {
+               rt_pin_write(can->config.errled->pin,can->config.errled->init?0:1);
+           } else {
+               rt_pin_write(can->config.errled->pin,can->config.errled->init);
+           }
+     }
+     #endif
+     if(can->status_indicate.ind != RT_NULL)
+     {
+         can->status_indicate.ind(can,can->status_indicate.args);
+     }
+}
+
+/*
+ * can register
+ */
+rt_err_t rt_hw_can_register(struct rt_can_device *can,
+                               const char              *name,
+                               const struct rt_can_ops *ops,
+                               void                    *data)
+{
+    struct rt_device *device;
+    RT_ASSERT(can != RT_NULL);
+
+    device = &(can->parent);
+
+    device->type        = RT_Device_Class_CAN;
+    device->rx_indicate = RT_NULL;
+    device->tx_complete = RT_NULL;
+#ifdef RT_CAN_USING_HDR
+    can->hdr            = RT_NULL;
+#endif
+    can->can_rx         = RT_NULL;
+    can->can_tx         = RT_NULL;
+    device->init        = rt_can_init;
+    device->open        = rt_can_open;
+    device->close       = rt_can_close;
+    device->read        = rt_can_read;
+    device->write       = rt_can_write;
+    device->control     = rt_can_control;
+    can->ops            = ops;
+
+    can->status_indicate.ind  = RT_NULL;
+    can->status_indicate.args = RT_NULL;
+    rt_memset(&can->status,0,sizeof(can->status));
+
+    device->user_data   = data;
+    can->timerinitflag = 0;
+    if(can->config.rcvled != RT_NULL ||
+       can->config.sndled != RT_NULL ||
+       can->config.errled != RT_NULL)
+    {
+        rt_timer_init(&can->timer,
+                  name,
+                  cantimeout,
+                  (void*)can,
+                  can->config.ticks,
+                  RT_TIMER_FLAG_PERIODIC);
+    }
+    /* register a character device */
+    return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR);
+}
+
+/* ISR for can interrupt */
+void rt_hw_can_isr(struct rt_can_device *can, int event)
+{
+    switch (event & 0xff)
+    {
+        case RT_CAN_EVENT_RXOF_IND:
+        {
+            rt_base_t level; 
+            level = rt_hw_interrupt_disable();
+            can->status.dropedrcvpkg++;
+            rt_hw_interrupt_enable(level);
+        }
+        case RT_CAN_EVENT_RX_IND:
+        {
+            struct rt_can_msg tmpmsg;
+            struct rt_can_rx_fifo* rx_fifo;
+            struct rt_can_msg_list* listmsg=RT_NULL;
+#ifdef RT_CAN_USING_HDR
+            rt_int32_t hdr;
+#endif
+            int ch = -1;
+            rt_base_t level; 
+            rx_fifo = (struct rt_can_rx_fifo*)can->can_rx;
+            RT_ASSERT(rx_fifo != RT_NULL);
+            /* interrupt mode receive */
+            RT_ASSERT(can->parent.open_flag & RT_DEVICE_FLAG_INT_RX);
+            
+            rt_uint32_t no;
+            no = event >> 8;
+            ch = can->ops->recvmsg(can,&tmpmsg,no);
+            if (ch == -1) break;
+            /* disable interrupt */
+            level = rt_hw_interrupt_disable();
+            can->status.rcvpkg++;
+            can->status.rcvchange = 1;
+            if(!rt_list_isempty(&rx_fifo->freelist))
+            {
+                   listmsg = rt_list_entry(rx_fifo->freelist.next, struct rt_can_msg_list, list);
+                   rt_list_remove(&listmsg->list);
+#ifdef RT_CAN_USING_HDR
+                   rt_list_remove(&listmsg->hdrlist);
+                   if(listmsg->owner != RT_NULL && listmsg->owner->msgs) {
+                     listmsg->owner->msgs--;                     
+                   }
+                   listmsg->owner = RT_NULL;
+#endif /*RT_CAN_USING_HDR*/
+                   RT_ASSERT(rx_fifo->freenumbers >0);
+                   rx_fifo->freenumbers--;
+            } else if(!rt_list_isempty(&rx_fifo->uselist)) {
+                   listmsg = rt_list_entry(rx_fifo->uselist.next, struct rt_can_msg_list, list);
+                   can->status.dropedrcvpkg++;
+                   rt_list_remove(&listmsg->list);
+#ifdef RT_CAN_USING_HDR
+                   rt_list_remove(&listmsg->hdrlist);
+                   if(listmsg->owner != RT_NULL && listmsg->owner->msgs) {
+                     listmsg->owner->msgs--;                     
+                   }
+                   listmsg->owner = RT_NULL;
+#endif
+            }                  
+            /* enable interrupt */
+            rt_hw_interrupt_enable(level);
+            if(listmsg != RT_NULL) {
+                  rt_memcpy(&listmsg->data,&tmpmsg,sizeof(struct rt_can_msg));
+                  level = rt_hw_interrupt_disable();
+                  rt_list_insert_before(&rx_fifo->uselist,&listmsg->list);
+#ifdef RT_CAN_USING_HDR
+                  hdr = tmpmsg.hdr;
+                  if(can->hdr != RT_NULL) {
+                        RT_ASSERT(hdr < can->config.maxhdr && hdr >= 0);
+                        if(can->hdr[hdr].connected) {
+                            rt_list_insert_before(&can->hdr[hdr].list,&listmsg->hdrlist);
+                            listmsg->owner = &can->hdr[hdr];
+                            can->hdr[hdr].msgs++;
+                        }
+                        
+                  }
+#endif
+                  rt_hw_interrupt_enable(level);
+            }
+            
+            /* invoke callback */
+#ifdef RT_CAN_USING_HDR
+            if(can->hdr != RT_NULL && can->hdr[hdr].connected && can->hdr[hdr].filter.ind) {
+                  RT_ASSERT(hdr < can->config.maxhdr && hdr >= 0);
+                  rt_size_t rx_length;
+                  level = rt_hw_interrupt_disable();
+                  rx_length = can->hdr[hdr].msgs * sizeof(struct rt_can_msg);
+                  rt_hw_interrupt_enable(level);
+                  can->hdr[hdr].filter.ind(&can->parent, can->hdr[hdr].filter.args, hdr, rx_length);
+                  
+            } else
+#endif
+              if (can->parent.rx_indicate != RT_NULL) {
+                rt_size_t rx_length;
+                /* get rx length */
+                level = rt_hw_interrupt_disable();
+                rx_length = rx_fifo->freenumbers*sizeof(struct rt_can_msg);
+                rt_hw_interrupt_enable(level);
+
+                can->parent.rx_indicate(&can->parent, rx_length);
+            }
+            break;
+        }
+        case RT_CAN_EVENT_TX_DONE:
+        case RT_CAN_EVENT_TX_FAIL:
+        {
+            struct rt_can_tx_fifo* tx_fifo;
+            rt_uint32_t no;
+            no = event >> 8;
+            tx_fifo = (struct rt_can_tx_fifo*) can->can_tx;
+            RT_ASSERT(tx_fifo != RT_NULL);
+            if((event & 0xff) == RT_CAN_EVENT_TX_DONE) {
+                tx_fifo->buffer[no].result = RT_CAN__SND_RESUTL_OK;
+            } else {
+                tx_fifo->buffer[no].result = RT_CAN__SND_RESUTL_ERR;
+            }
+            rt_completion_done(&(tx_fifo->buffer[no].completion));
+            break;
+        }
+    }
+}
+#ifdef RT_USING_FINSH
+#include <finsh.h>
+int cmd_canstat(int argc,void** argv)
+{
+    static const char* ErrCode[] = {
+      "No Error!",
+      "Warning !",
+      "Passive !",
+      "Bus Off !"
+    };
+    if(argc >= 2) {
+        rt_device_t candev = rt_device_find(argv[1]);
+        if(!candev) {
+            rt_kprintf(" Can't find can device %s\n",argv[1]);
+            return -1;
+        }
+        rt_kprintf(" Finded can device: %s...",argv[1]);
+        struct rt_can_status status;
+        rt_device_control(candev,RT_CAN_CMD_GET_STATUS,&status);
+        rt_kprintf("\n Receive...error..count: %010ld. Send.....error....count: %010ld.",
+                   status.rcverrcnt,status.snderrcnt);
+        rt_kprintf("\n Bit..pad..error..count: %010ld. Format...error....count: %010ld",
+                   status.bitpaderrcnt,status.formaterrcnt);
+        rt_kprintf("\n Ack.......error..count: %010ld. Bit......error....count: %010ld.",
+                   status.ackerrcnt,status.biterrcnt);
+        rt_kprintf("\n CRC.......error..count: %010ld. Error.code.[%010ld]: ",
+                   status.crcerrcnt,status.errcode);
+        switch(status.errcode) {
+        case 0:
+            rt_kprintf("%s.",ErrCode[0]);
+        break;
+        case 1:
+            rt_kprintf("%s.",ErrCode[1]);
+        break;
+        case 2:
+        case 3:
+            rt_kprintf("%s.",ErrCode[2]);
+        break;
+        case 4:
+        case 5:
+        case 6:
+        case 7:
+            rt_kprintf("%s.",ErrCode[3]);
+        break;
+        }
+        rt_kprintf("\n Total.receive.packages: %010ld. Droped.receive.packages: %010ld.",
+                   status.rcvpkg,status.dropedrcvpkg);
+        rt_kprintf("\n Total..send...packages: %010ld. Droped...send..packages: %010ld.\n",
+           status.sndpkg + status.dropedsndpkg,status.dropedsndpkg);
+    } else {
+        rt_kprintf(" Invalid Call %s\n",argv[0]);
+        rt_kprintf(" Please using %s cannamex .Here canname is driver name and x is candrive number.\n",argv[0]);
+    }
+    return 0;
+}
+FINSH_FUNCTION_EXPORT_ALIAS(cmd_canstat, __cmd_canstat, Stat Can Device Status.);
+#endif

+ 132 - 0
components/drivers/can/readme-zh.txt

@@ -0,0 +1,132 @@
+说明: 
+本驱动完成了can控制器硬件抽象
+一 CAN Driver 注册
+	Can driver注册需要填充以下几个数据结构:
+	1、struct can_configure
+	{
+		rt_uint32_t baud_rate;
+		rt_uint32_t msgboxsz;
+		rt_uint32_t sndboxnumber;
+		rt_uint32_t mode      :8;
+		rt_uint32_t privmode  :8;
+		rt_uint32_t reserved  :16;
+		#ifdef RT_CAN_USING_LED
+		const struct rt_can_led* rcvled;
+		const struct rt_can_led* sndled;
+		const struct rt_can_led* errled;
+		#endif  /*RT_CAN_USING_LED*/
+		rt_uint32_t ticks;
+	#ifdef RT_CAN_USING_HDR
+		rt_uint32_t maxhdr;
+	#endif
+	};
+	struct can_configure 为can驱动的基本配置信息:
+	baud_rate :
+		enum CANBAUD
+		{
+			CAN1MBaud=0,    // 1 MBit/sec
+			CAN800kBaud,    // 800 kBit/sec
+			CAN500kBaud,    // 500 kBit/sec
+			CAN250kBaud,    // 250 kBit/sec
+			CAN125kBaud,    // 125 kBit/sec
+			CAN100kBaud,    // 100 kBit/sec
+			CAN50kBaud,     // 50 kBit/sec
+			CAN20kBaud,     // 20 kBit/sec
+			CAN10kBaud      // 10 kBit/sec
+		};
+		配置Can的波特率。
+	msgboxsz : Can接收邮箱缓冲数量,本驱动在软件层开辟msgboxsz个接收邮箱。
+	sndboxnumber : can 发送通道数量,该配置为Can控制器实际的发送通道数量。 
+	mode :
+		#define RT_CAN_MODE_NORMAL 0		正常模式
+		#define RT_CAN_MODE_LISEN 1		只听模式
+		#define RT_CAN_MODE_LOOPBACK 2		自发自收模式
+		#define RT_CAN_MODE_LOOPBACKANLISEN 3	自发自收只听模式
+		配置Can 的工作状态。
+	privmode :
+		#define RT_CAN_MODE_PRIV 0x01 		处于优先级模式,高优先级的消息优先发送。
+		#define RT_CAN_MODE_NOPRIV 0x00
+		配置Can driver的优先级模式。
+	#ifdef RT_CAN_USING_LED
+	const struct rt_can_led* rcvled;
+	const struct rt_can_led* sndled;
+	const struct rt_can_led* errled;
+	#endif  /*RT_CAN_USING_LED*/
+	配置can led信息, 当前can驱动的led使用了 pin驱动,
+	开启RT_CAN_USING_LED时要确保当前系统已实现pin驱动。
+	rt_uint32_t ticks : 配置Can driver timer周期。
+	#ifdef RT_CAN_USING_HDR
+		rt_uint32_t maxhdr;
+	#endif
+	如果使用硬件过滤,则开启RT_CAN_USING_HDR, maxhdr 为Can控制器过滤表的数量。
+	2、struct rt_can_ops
+	{
+		rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg);
+		rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg);
+		int (*sendmsg)(struct rt_can_device *can, const void* buf, rt_uint32_t boxno);
+		int (*recvmsg)(struct rt_can_device *can,void* buf, rt_uint32_t boxno);
+	};
+	struct rt_can_ops 为要实现的特定的can控制器操作。
+	rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg);
+	configure根据配置信息初始化Can控制器工作模式。
+	rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg);
+	control 当前接受以下cmd参数:
+		#define RT_CAN_CMD_SET_FILTER      0x13
+		#define RT_CAN_CMD_SET_BAUD        0x14
+		#define RT_CAN_CMD_SET_MODE        0x15
+		#define RT_CAN_CMD_SET_PRIV        0x16
+		#define RT_CAN_CMD_GET_STATUS      0x17
+		#define RT_CAN_CMD_SET_STATUS_IND  0x18
+	int (*sendmsg)(struct rt_can_device *can, const void* buf, rt_uint32_t boxno);
+	sendmsg向Can控制器发送数,boxno为发送通道号。
+	int (*recvmsg)(struct rt_can_device *can,void* buf, rt_uint32_t boxno);
+	recvmsg从Can控制器接收数据,boxno为接收通道号。
+	struct rt_can_device
+	{
+		struct rt_device          parent;
+
+		const struct rt_can_ops *ops;
+		struct can_configure   config;
+		struct rt_can_status   status;
+		rt_uint32_t timerinitflag;
+		struct rt_timer timer;
+		struct rt_can_status_ind_type status_indicate;
+	#ifdef RT_CAN_USING_HDR
+		struct rt_can_hdr* hdr;
+	#endif
+		void *can_rx;
+		void *can_tx;
+	};
+	填充完成后,便可调用rt_hw_can_register完成can驱动的注册。
+二、 CAN Driver 的添加:
+	要添加一个新的Can驱动,至少要完成以下接口。
+	1、struct rt_can_ops
+	{
+		rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg);
+		rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg);
+		int (*sendmsg)(struct rt_can_device *can, const void* buf, rt_uint32_t boxno);
+		int (*recvmsg)(struct rt_can_device *can,void* buf, rt_uint32_t boxno);
+	};
+	2、 rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg);
+	接口的
+		#define RT_CAN_CMD_SET_FILTER      0x13
+		#define RT_CAN_CMD_SET_BAUD        0x14
+		#define RT_CAN_CMD_SET_MODE        0x15
+		#define RT_CAN_CMD_SET_PRIV        0x16
+		#define RT_CAN_CMD_GET_STATUS      0x17
+		#define RT_CAN_CMD_SET_STATUS_IND  0x18
+	若干命令。
+	3、can口中断,要完接收,发送结束,以及错误中断。
+		#define RT_CAN_EVENT_RX_IND          0x01    /* Rx indication */
+		#define RT_CAN_EVENT_TX_DONE         0x02    /* Tx complete   */
+		#define RT_CAN_EVENT_TX_FAIL         0x03    /* Tx complete   */
+		#define RT_CAN_EVENT_RX_TIMEOUT      0x05    /* Rx timeout    */
+		#define RT_CAN_EVENT_RXOF_IND        0x06    /* Rx overflow */
+		中断产生后,调用rt_hw_can_isr(struct rt_can_device *can, int event)
+		进入相应的操作,其中接收发送中断的event,最低8位为上面的事件,16到24位为通信通道号。
+	一个作为一个例子,参见bsp/stm32f10x/driver下的bxcan.c 。
+三、CAN Driver的使用:
+	一个使用的例子,参数bsp/stm32f10x/applications下的canapp.c
+四、当前Can驱动,没有实现轮模式,采用中断模式,bxcan驱动工作在loopback模式下的时候不能读数据。
+
+五、当前Can驱动,在stm32f105上测试,暂无问题。

+ 293 - 0
components/drivers/include/drivers/can.h

@@ -0,0 +1,293 @@
+/*
+ * File      : can.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2015, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date           Author       		Notes
+ * 2015-05-14     aubrcool@qq.com 	first version
+ */
+#ifndef CAN_H_
+#define CAN_H_
+
+#ifndef RT_CANMSG_BOX_SZ
+#define RT_CANMSG_BOX_SZ 16
+#endif
+#ifndef RT_CANSND_BOX_NUM
+#define RT_CANSND_BOX_NUM 1
+#endif
+
+enum CANBAUD
+{
+        CAN1MBaud=0,    // 1 MBit/sec
+        CAN800kBaud,    // 800 kBit/sec
+        CAN500kBaud,    // 500 kBit/sec
+        CAN250kBaud,    // 250 kBit/sec
+        CAN125kBaud,    // 125 kBit/sec
+        CAN100kBaud,    // 100 kBit/sec
+        CAN50kBaud,     // 50 kBit/sec
+        CAN20kBaud,     // 20 kBit/sec
+        CAN10kBaud      // 10 kBit/sec
+};
+#define RT_CAN_MODE_NORMAL 0
+#define RT_CAN_MODE_LISEN 1
+#define RT_CAN_MODE_LOOPBACK 2
+#define RT_CAN_MODE_LOOPBACKANLISEN 3
+
+#define RT_CAN_MODE_PRIV 0x01
+#define RT_CAN_MODE_NOPRIV 0x00
+
+#ifdef RT_CAN_USING_LED
+struct  rt_can_led
+{
+        rt_uint32_t pin,mode,init;
+        struct rt_timer* timer;
+        const char* timer_name;
+};
+#endif /*RT_CAN_USING_LED*/
+
+struct rt_can_filter_item
+{
+        rt_uint32_t id  :29;
+        rt_uint32_t ide :1;
+        rt_uint32_t rtr :1;
+        rt_uint32_t mode :1;
+        rt_uint32_t mask;
+        rt_int32_t hdr;
+        rt_err_t  (*ind)(rt_device_t dev, void* args ,rt_int32_t hdr, rt_size_t size);
+        void* args;
+};
+#ifdef RT_CAN_USING_HDR
+#define RT_CAN_FILTER_ITEM_INIT(id,ide,rtr,mode,mask,ind,args) \
+     {\
+         id,\
+         ide,\
+         rtr,\
+         mode,\
+         mask,\
+         -1,\
+         ind,\
+         args,\
+     }
+#define RT_CAN_FILTER_STD_INIT(id,ind,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,0,0,0,0xFFFFFFFF,ind,args)
+#define RT_CAN_FILTER_EXT_INIT(id,ind,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,1,0,0,0xFFFFFFFF,ind,args)
+#define RT_CAN_STD_RMT_FILTER_INIT(id,ind,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,0,1,0,0xFFFFFFFF,ind,args)
+#define RT_CAN_EXT_RMT_FILTER_INIT(id,ind,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,1,1,0,0xFFFFFFFF,ind,args)
+#define RT_CAN_STD_RMT_DATA_FILTER_INIT(id,ind,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,0,0,1,0xFFFFFFFF,ind,args)
+#define RT_CAN_EXT_RMT_DATA_FILTER_INIT(id,ind,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,1,0,1,0xFFFFFFFF,ind,args)
+#else
+#define RT_CAN_FILTER_ITEM_INIT(id,ide,rtr,mode,mask,args) \
+     {\
+         id,\
+         ide,\
+         rtr,\
+         mode,\
+         mask,\
+         -1,\
+         args,\
+     }
+#define RT_CAN_FILTER_STD_INIT(id,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,0,0,0,0xFFFFFFFF,args)
+#define RT_CAN_FILTER_EXT_INIT(id,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,1,0,0,0xFFFFFFFF,args)
+#define RT_CAN_STD_RMT_FILTER_INIT(id,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,0,1,0,0xFFFFFFFF,args)
+#define RT_CAN_EXT_RMT_FILTER_INIT(id,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,1,1,0,0xFFFFFFFF,args)
+#define RT_CAN_STD_RMT_DATA_FILTER_INIT(id,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,0,0,1,0xFFFFFFFF,args)
+#define RT_CAN_EXT_RMT_DATA_FILTER_INIT(id,args) \
+     RT_CAN_FILTER_ITEM_INIT(id,1,0,1,0xFFFFFFFF,args)
+#endif
+
+struct rt_can_filter_config
+{
+        rt_uint32_t count;
+        rt_uint32_t actived;
+        struct rt_can_filter_item* items;
+};
+struct can_configure
+{
+        rt_uint32_t baud_rate;
+        rt_uint32_t msgboxsz;
+        rt_uint32_t sndboxnumber;
+        rt_uint32_t mode      :8;
+        rt_uint32_t privmode  :8;
+        rt_uint32_t reserved  :16;
+        #ifdef RT_CAN_USING_LED
+        const struct rt_can_led* rcvled;
+        const struct rt_can_led* sndled;
+        const struct rt_can_led* errled;
+        #endif  /*RT_CAN_USING_LED*/
+        rt_uint32_t ticks;
+#ifdef RT_CAN_USING_HDR
+        rt_uint32_t maxhdr;
+#endif
+};
+
+#define CANDEFAULTCONFIG \
+{\
+        CAN1MBaud,\
+        RT_CANMSG_BOX_SZ,\
+        RT_CANSND_BOX_NUM,\
+        RT_CAN_MODE_NORMAL,\
+};
+
+struct rt_can_ops;
+#define RT_CAN_CMD_SET_FILTER      0x13
+#define RT_CAN_CMD_SET_BAUD        0x14
+#define RT_CAN_CMD_SET_MODE        0x15
+#define RT_CAN_CMD_SET_PRIV        0x16
+#define RT_CAN_CMD_GET_STATUS      0x17
+#define RT_CAN_CMD_SET_STATUS_IND  0x18
+
+#define RT_DEVICE_CAN_INT_ERR  0x1000
+
+enum RT_CAN_STATUS_MODE
+{
+        NORMAL = 0,
+        ERRWARNING = 1,
+        ERRPASSIVE = 2,
+        BUSOFF = 4,
+};
+enum RT_CAN_BUS_ERR
+{
+        RT_CAN_BUS_NO_ERR = 0,
+        RT_CAN_BUS_BIT_PAD_ERR = 1,
+        RT_CAN_BUS_FORMAT_ERR = 2,
+        RT_CAN_BUS_ACK_ERR = 3,
+        RT_CAN_BUS_IMPLICIT_BIT_ERR = 4,
+        RT_CAN_BUS_EXPLICIT_BIT_ERR = 5,
+        RT_CAN_BUS_CRC_ERR = 6,
+};
+struct rt_can_status
+{
+        rt_uint32_t rcverrcnt;
+        rt_uint32_t snderrcnt;
+        rt_uint32_t errcode;
+        rt_uint32_t rcvpkg;
+        rt_uint32_t dropedrcvpkg;
+        rt_uint32_t sndpkg;
+        rt_uint32_t dropedsndpkg;
+        rt_uint32_t bitpaderrcnt;
+        rt_uint32_t formaterrcnt;
+        rt_uint32_t ackerrcnt;
+        rt_uint32_t biterrcnt;
+        rt_uint32_t crcerrcnt;
+        rt_uint32_t rcvchange;
+        rt_uint32_t sndchange;
+        rt_uint32_t lasterrtype;
+};
+#ifdef RT_CAN_USING_HDR
+struct rt_can_hdr {
+        rt_uint32_t connected;
+        rt_uint32_t msgs;
+        struct rt_can_filter_item filter;
+        struct rt_list_node list;
+};
+#endif
+struct rt_can_device;
+typedef rt_err_t (*rt_canstatus_ind)(struct rt_can_device*, void*);
+typedef struct rt_can_status_ind_type
+{
+    rt_canstatus_ind ind;
+    void* args;
+} *rt_can_status_ind_type_t;
+struct rt_can_device
+{
+        struct rt_device          parent;
+
+        const struct rt_can_ops *ops;
+        struct can_configure   config;
+        struct rt_can_status   status;
+        rt_uint32_t timerinitflag;
+        struct rt_timer timer;
+        struct rt_can_status_ind_type status_indicate;
+#ifdef RT_CAN_USING_HDR
+        struct rt_can_hdr* hdr;
+#endif
+        void *can_rx;
+	void *can_tx;
+};
+typedef struct rt_can_device *rt_can_t;
+
+#define RT_CAN_STDID 0
+#define RT_CAN_EXTID 1
+#define RT_CAN_DTR   0
+#define RT_CAN_RTR   1
+
+typedef struct rt_can_status * rt_can_status_t;
+struct rt_can_msg
+{
+        rt_uint32_t id  :29;
+        rt_uint32_t ide :1;
+        rt_uint32_t rtr :1;
+        rt_uint32_t rsv :1;
+        rt_uint32_t len :8;
+        rt_uint32_t priv :8;
+        rt_uint32_t hdr :8;
+        rt_uint32_t reserved :8;
+        rt_uint8_t data[8];
+};
+typedef struct rt_can_msg* rt_can_msg_t;
+struct rt_can_msg_list {
+        struct rt_list_node list;
+#ifdef RT_CAN_USING_HDR
+        struct rt_list_node hdrlist;
+        struct rt_can_hdr* owner;
+#endif
+        struct rt_can_msg data;
+};
+struct rt_can_rx_fifo
+{
+	/* software fifo */
+	struct rt_can_msg_list *buffer;
+        rt_uint32_t freenumbers;
+        struct rt_list_node freelist;
+        struct rt_list_node uselist;
+};
+
+#define RT_CAN__SND_RESUTL_OK 0
+#define RT_CAN__SND_RESUTL_ERR 1
+#define RT_CAN__SND_RESUTL_WAIT 2
+
+#define RT_CAN_EVENT_RX_IND          0x01    /* Rx indication */
+#define RT_CAN_EVENT_TX_DONE         0x02    /* Tx complete   */
+#define RT_CAN_EVENT_TX_FAIL         0x03    /* Tx complete   */
+#define RT_CAN_EVENT_RX_TIMEOUT      0x05    /* Rx timeout    */
+#define RT_CAN_EVENT_RXOF_IND        0x06    /* Rx overflow */
+
+struct rt_can_sndbxinx_list {
+        struct rt_list_node list;
+        struct rt_completion completion;
+        rt_uint32_t result;
+};
+struct rt_can_tx_fifo
+{
+  	struct rt_can_sndbxinx_list *buffer;
+	struct rt_completion completion;
+        struct rt_list_node freelist;
+};
+struct rt_can_ops
+{
+        rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg);
+        rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg);
+        int (*sendmsg)(struct rt_can_device *can, const void* buf, rt_uint32_t boxno);
+        int (*recvmsg)(struct rt_can_device *can,void* buf, rt_uint32_t boxno);
+};
+rt_err_t rt_hw_can_register(struct rt_can_device *can,
+                               const char              *name,
+                               const struct rt_can_ops *ops,
+                               void                    *data);
+void rt_hw_can_isr(struct rt_can_device *can, int event);
+#endif /*_CAN_H*/

+ 4 - 0
components/drivers/include/rtdevice.h

@@ -366,6 +366,10 @@ rt_inline void rt_work_init(struct rt_work* work, void (*work_func)(struct rt_wo
 #include "drivers/pin.h"
 #endif
 
+#ifdef RT_USING_CAN
+#include "drivers/can.h"
+#endif
+
 #ifdef __cplusplus
 }
 #endif

+ 5 - 2
components/drivers/spi/spi_flash_w25qxx.c

@@ -13,6 +13,7 @@
  * 2012-05-06     aozima       can page write.
  * 2012-08-23     aozima       add flash lock.
  * 2012-08-24     aozima       fixed write status register BUG.
+ * 2015-05-13     bernard      add GD25Q flash ID.
  */
 
 #include <stdint.h>
@@ -28,8 +29,10 @@
 
 #define PAGE_SIZE           4096
 
-/* JEDEC Manufacturer¡¯s ID */
+/* JEDEC Manufacturer��s ID */
 #define MF_ID           (0xEF)
+#define GD_ID           (0xC8)
+
 /* JEDEC Device ID: Memory type and Capacity */
 #define MTC_W25Q16_BV_CL_CV   (0x4015) /* W25Q16BV W25Q16CL W25Q16CV  */
 #define MTC_W25Q16_DW         (0x6015) /* W25Q16DW  */
@@ -297,7 +300,7 @@ rt_err_t w25qxx_init(const char * flash_device_name, const char * spi_device_nam
 
         flash_unlock(&spi_flash_device);
 
-        if(id_recv[0] != MF_ID)
+        if(id_recv[0] != MF_ID && id_recv[0] != GD_ID)
         {
             FLASH_TRACE("Manufacturers ID error!\r\n");
             FLASH_TRACE("JEDEC Read-ID Data : %02X %02X %02X\r\n", id_recv[0], id_recv[1], id_recv[2]);

+ 229 - 35
components/net/lwip/apps/ftpd.c

@@ -11,17 +11,24 @@
 #define FTP_MAX_CONNECTION	2
 #define FTP_USER			"rtt"
 #define FTP_PASSWORD		"demo"
-#define FTP_WELCOME_MSG		"220-= welcome on RT-Thread FTP server =-\r\n220 \r\n"
+#define FTP_WELCOME_MSG		"220 welcome on RT-Thread FTP server.\r\n"
 #define FTP_BUFFER_SIZE		1024
 
+#define INET_ADDRSTRLEN 16
+
+
 struct ftp_session
 {
 	rt_bool_t is_anonymous;
 
 	int sockfd;
 	struct sockaddr_in remote;
+	struct sockaddr_in server;
+
+	char serveraddr[INET_ADDRSTRLEN];
 
 	/* pasv data */
+	int  pasv_listen_sockfd;
 	char pasv_active;
 	int  pasv_sockfd;
 
@@ -43,6 +50,7 @@ struct ftp_session* ftp_new_session()
 	struct ftp_session* session;
 
 	session = (struct ftp_session*)rt_malloc(sizeof(struct ftp_session));
+	rt_memset((void *)session, 0, sizeof(struct ftp_session));
 
 	session->next = session_list;
 	session_list = session;
@@ -71,6 +79,83 @@ void ftp_close_session(struct ftp_session* session)
 	rt_free(session);
 }
 
+static int open_data_connection(struct ftp_session* session)
+{
+	socklen_t len = sizeof(struct sockaddr);
+	struct sockaddr_in sin;
+#if 0
+	/* Previous PORT command from client */
+	if (ctrl->data_address[0]) {
+		ctrl->data_sd = socket(AF_INET, SOCK_STREAM, 0);
+		if (-1 == ctrl->data_sd) {
+			printf("Failed creating data socket");
+			return -1;
+		}
+
+		memset(&sin, 0, sizeof(sin));
+		sin.sin_family = AF_INET;
+		sin.sin_port = htons(ctrl->data_port);
+		inet_aton(ctrl->data_address, &(sin.sin_addr));
+
+		if (connect(ctrl->data_sd, (struct sockaddr *)&sin, len) == -1) {
+			printf("Failed connecting data socket to client");
+			close(ctrl->data_sd);
+			ctrl->data_sd = -1;
+
+			return -1;
+		}
+
+		DBG("Connected successfully to client's previously requested address:PORT %s:%d", ctrl->data_address, ctrl->data_port);
+		return 0;
+	}
+#endif
+	/* Previous PASV command, accept connect from client */
+	if (session->pasv_listen_sockfd > 0) {
+		char client_ip[100];
+
+		session->pasv_sockfd = accept(session->pasv_listen_sockfd, (struct sockaddr *)&sin, &len);
+		if (-1 == session->pasv_sockfd) {
+			printf("Failed accepting connection from client");
+			return -1;
+		}
+
+		len = sizeof(struct sockaddr);
+		if (-1 == getpeername(session->pasv_sockfd, (struct sockaddr *)&sin, &len)) {
+			printf("Cannot determine client address");
+			closesocket(session->pasv_sockfd);
+			session->pasv_sockfd = -1;
+			return -1;
+		}
+
+		printf("Client PASV data connection from %s\n", inet_ntoa(sin.sin_addr));
+	}
+
+	return 0;
+}
+
+static void close_data_connection(struct ftp_session* session)
+{
+	/* PASV server listening socket */
+	if (session->pasv_listen_sockfd > 0) {
+		closesocket(session->pasv_listen_sockfd);
+		session->pasv_listen_sockfd = -1;
+	}
+
+	/* PASV client socket */
+	if (session->pasv_sockfd > 0) {
+		closesocket(session->pasv_sockfd);
+		session->pasv_sockfd = -1;
+	}
+#if 0
+	/* PORT */
+	if (ctrl->data_address[0]) {
+		ctrl->data_address[0] = 0;
+		ctrl->data_port = 0;
+	}
+#endif
+}
+
+
 int ftp_get_filesize(char * filename)
 {
 	int pos;
@@ -179,6 +264,10 @@ void ftpd_thread_entry(void* parameter)
 				session = ftp_new_session();
 				if (session != NULL)
 				{
+					if (-1 == getsockname(com_socket, (struct sockaddr *)&session->server, &addr_len)) {
+						printf("Cannot determine our address, need it if client should connect to us\n");
+					}
+					ipaddr_ntoa_r(&(session->server.sin_addr), session->serveraddr, sizeof(session->serveraddr));
 					strcpy(session->currentdir, FTP_SRV_ROOT);
 					session->sockfd = com_socket;
 					session->remote = remote;
@@ -201,6 +290,7 @@ void ftpd_thread_entry(void* parameter)
 						rt_kprintf("Client %s disconnected\n", inet_ntoa(session->remote.sin_addr));
 						FD_CLR(session->sockfd, &readfds);
 						closesocket(session->sockfd);
+						session->sockfd = -1;
 						ftp_close_session(session);
 					}
 					else
@@ -210,6 +300,7 @@ void ftpd_thread_entry(void* parameter)
 						{
 							rt_kprintf("Client %s disconnected\r\n", inet_ntoa(session->remote.sin_addr));
 							closesocket(session->sockfd);
+							session->sockfd = -1;
 							ftp_close_session(session);
 						}
 					}
@@ -359,7 +450,7 @@ int ftp_process_request(struct ftp_session* session, char *buf)
 		}
 		else if (strcmp(parameter_ptr, FTP_USER) == 0)
 		{
-			session->is_anonymous = RT_FALSE;		
+			session->is_anonymous = RT_FALSE;
 			rt_sprintf(sbuf, "331 Password required for %s\r\n", parameter_ptr);
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
 		}
@@ -380,25 +471,26 @@ int ftp_process_request(struct ftp_session* session, char *buf)
 			session->is_anonymous == RT_TRUE)
 		{
 			// password correct
-			rt_sprintf(sbuf, "230 User logged in\r\n");
+			rt_sprintf(sbuf, "230 User logged in.\r\n");
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
-			rt_free(sbuf);			
+			rt_free(sbuf);
 			return 0;
 		}
 
 		// incorrect password
 		rt_sprintf(sbuf, "530 Login or Password incorrect. Bye!\r\n");
 		send(session->sockfd, sbuf, strlen(sbuf), 0);
-		rt_free(sbuf);		
+		rt_free(sbuf);
 		return -1;
 	}
 	else if(str_begin_with(buf, "LIST")==0  )
 	{
 		memset(sbuf,0,FTP_BUFFER_SIZE);
+		open_data_connection(session);
 		rt_sprintf(sbuf, "150 Opening Binary mode connection for file list.\r\n");
 		send(session->sockfd, sbuf, strlen(sbuf), 0);
 		do_list(session->currentdir, session->pasv_sockfd);
-		closesocket(session->pasv_sockfd);
+		close_data_connection(session);
 		session->pasv_active = 0;
 		rt_sprintf(sbuf, "226 Transfert Complete.\r\n");
 		send(session->sockfd, sbuf, strlen(sbuf), 0);
@@ -408,8 +500,9 @@ int ftp_process_request(struct ftp_session* session, char *buf)
 		memset(sbuf, 0, FTP_BUFFER_SIZE);
 		rt_sprintf(sbuf, "150 Opening Binary mode connection for file list.\r\n");
 		send(session->sockfd, sbuf, strlen(sbuf), 0);
+		open_data_connection(session);
 		do_simple_list(session->currentdir, session->pasv_sockfd);
-		closesocket(session->pasv_sockfd);
+		close_data_connection(session);
 		session->pasv_active = 0;
 		rt_sprintf(sbuf, "226 Transfert Complete.\r\n");
 		send(session->sockfd, sbuf, strlen(sbuf), 0);
@@ -436,8 +529,20 @@ int ftp_process_request(struct ftp_session* session, char *buf)
 	else if(str_begin_with(buf, "PASV")==0)
 	{
 		int dig1, dig2;
-		int sockfd;
-		char optval='1';
+		//int sockfd;
+		int optval=1;
+		int port;
+		struct sockaddr_in data;
+		socklen_t len = sizeof(struct sockaddr);
+		char *msg, *p;
+
+		if (session->pasv_sockfd > 0) {
+			closesocket(session->pasv_sockfd);
+			session->pasv_sockfd = -1;
+		}
+
+		if (session->pasv_listen_sockfd > 0)
+			closesocket(session->pasv_listen_sockfd);
 
 		session->pasv_port = 10000;
 		session->pasv_active = 1;
@@ -448,40 +553,63 @@ int ftp_process_request(struct ftp_session* session, char *buf)
 		dig2 = session->pasv_port % 256;
 
 		FD_ZERO(&readfds);
-		if((sockfd=socket(PF_INET, SOCK_STREAM, 0))==-1)
+		if((session->pasv_listen_sockfd=socket(PF_INET, SOCK_STREAM, 0))==-1)
 		{
-			rt_sprintf(sbuf, "425 Can't open data connection.\r\n");
+			rt_sprintf(sbuf, "425 Can't open data connection0.\r\n");
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
 			goto err1;
 		}
-		if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))==-1)
+		if(setsockopt(session->pasv_listen_sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))==-1)
 		{
-			rt_sprintf(sbuf, "425 Can't open data connection.\r\n");
+			rt_sprintf(sbuf, "425 Can't open data connection1.\r\n");
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
 			goto err1;
 		}
-		if(bind(sockfd, (struct sockaddr *)&local, addr_len)==-1)
+		if(bind(session->pasv_listen_sockfd, (struct sockaddr *)&local, addr_len)==-1)
 		{
-			rt_sprintf(sbuf, "425 Can't open data connection.\r\n");
+			rt_sprintf(sbuf, "425 Can't open data connection2.\r\n");
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
 			goto err1;
 		}
-		if(listen(sockfd, 1)==-1)
+		if(listen(session->pasv_listen_sockfd, 1)==-1)
 		{
-			rt_sprintf(sbuf, "425 Can't open data connection.\r\n");
+			rt_sprintf(sbuf, "425 Can't open data connection3.\r\n");
+			send(session->sockfd, sbuf, strlen(sbuf), 0);
+			goto err1;
+		}
+		if (-1 == getsockname(session->pasv_listen_sockfd, (struct sockaddr *)&data, &len)) {
+			rt_kprintf("Cannot determine our address, need it if client should connect to us\n");
+			goto err1;
+		}
+
+		port = ntohs(data.sin_port);
+		rt_kprintf("Port %d\n", port);
+
+		/* Convert server IP address and port to comma separated list */
+		msg = strdup(session->serveraddr);
+		if (!msg) {
+			rt_sprintf(sbuf, "426 Internal server error.\r\n");
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
 			goto err1;
 		}
+		p = msg;
+		while ((p = strchr(p, '.')))
+			*p++ = ',';
+	
 		rt_kprintf("Listening %d seconds @ port %d\n", tv.tv_sec, session->pasv_port);
-		rt_sprintf(sbuf, "227 Entering passive mode (%d,%d,%d,%d,%d,%d)\r\n", 127, 0, 0, 1, dig1, dig2);
+		rt_sprintf(sbuf, "227 Entering passive mode (%s,%d,%d)\r\n", msg, port / 256, port % 256);
 		send(session->sockfd, sbuf, strlen(sbuf), 0);
+		rt_free(sbuf);
+		rt_free(msg);
+		return 0;
+	#if 0
 		FD_SET(sockfd, &readfds);
 		select(0, &readfds, 0, 0, &tv);
 		if(FD_ISSET(sockfd, &readfds))
 		{
 			if((session->pasv_sockfd = accept(sockfd, (struct sockaddr*)&pasvremote, &addr_len))==-1)
 			{
-				rt_sprintf(sbuf, "425 Can't open data connection.\r\n");
+				rt_sprintf(sbuf, "425 Can't open data connection4.\r\n");
 				send(session->sockfd, sbuf, strlen(sbuf), 0);
 				goto err1;
 			}
@@ -500,11 +628,21 @@ err1:
 			rt_free(sbuf);
 			return 0;
 		}
+	#endif
+err1:
+		close_data_connection(session);
+		session->pasv_active = 0;
+		rt_free(sbuf);
+		rt_free(msg);
+		return 0;
+
 	}
 	else if (str_begin_with(buf, "RETR")==0)
 	{
 		int file_size;
 
+		open_data_connection(session);
+
 		strcpy(filename, buf + 5);
 
 		build_full_path(session, parameter_ptr, filename, 256);
@@ -514,13 +652,15 @@ err1:
 			rt_sprintf(sbuf, "550 \"%s\" : not a regular file\r\n", filename);
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
 			session->offset=0;
-			rt_free(sbuf);			
+			close_data_connection(session);
+			rt_free(sbuf);
 			return 0;
 		}
 
 		fd = open(filename, O_RDONLY, 0);
 		if (fd < 0)
 		{
+			close_data_connection(session);
 			rt_free(sbuf);
 			return 0;
 		}
@@ -543,14 +683,16 @@ err1:
 		rt_sprintf(sbuf, "226 Finished.\r\n");
 		send(session->sockfd, sbuf, strlen(sbuf), 0);
 		close(fd);
-		closesocket(session->pasv_sockfd);
+		close_data_connection(session);
 	}
 	else if (str_begin_with(buf, "STOR")==0)
 	{
+		open_data_connection(session);
 		if(session->is_anonymous == RT_TRUE)
 		{
 			rt_sprintf(sbuf, "550 Permission denied.\r\n");
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
+			close_data_connection(session);
 			rt_free(sbuf);
 			return 0;
 		}
@@ -562,6 +704,7 @@ err1:
 		{
 			rt_sprintf(sbuf, "550 Cannot open \"%s\" for writing.\r\n", filename);
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
+			close_data_connection(session);
 			rt_free(sbuf);
 			return 0;
 		}
@@ -579,7 +722,7 @@ err1:
 			else if(numbytes==0)
 			{
 				close(fd);
-				closesocket(session->pasv_sockfd);
+				close_data_connection(session);
 				rt_sprintf(sbuf, "226 Finished.\r\n");
 				send(session->sockfd, sbuf, strlen(sbuf), 0);
 				break;
@@ -587,12 +730,12 @@ err1:
 			else if(numbytes==-1)
 			{
 				close(fd);
-				closesocket(session->pasv_sockfd);
+				close_data_connection(session);
 				rt_free(sbuf);
 				return -1;
 			}
 		}
-		closesocket(session->pasv_sockfd);
+		close_data_connection(session);
 	}
 	else if(str_begin_with(buf, "SIZE")==0)
 	{
@@ -659,7 +802,7 @@ err1:
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
 			closesocket(session->pasv_sockfd);
 			session->pasv_active = 0;
-			rt_free(sbuf);	
+			rt_free(sbuf);
 			return 0;
 		}
 		pasvremote.sin_addr.s_addr=inet_addr(tmpip);
@@ -674,7 +817,7 @@ err1:
 				rt_sprintf(sbuf, "425 Can't open data connection.\r\n");
 				send(session->sockfd, sbuf, strlen(sbuf), 0);
 				closesocket(session->pasv_sockfd);
-				rt_free(sbuf);				
+				rt_free(sbuf);
 				return 0;
 			}
 		}
@@ -697,9 +840,9 @@ err1:
 	{
 		if (session->is_anonymous == RT_TRUE)
 		{
-			rt_sprintf(sbuf, "550 Permission denied.\r\n");
+			rt_sprintf(sbuf, "530 Permission denied.\r\n");
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
-			rt_free(sbuf);			
+			rt_free(sbuf);
 			return 0;
 		}
 
@@ -720,7 +863,7 @@ err1:
 	{
 		if (session->is_anonymous == RT_TRUE)
 		{
-			rt_sprintf(sbuf, "550 Permission denied.\r\n");
+			rt_sprintf(sbuf, "530 Permission denied.\r\n");
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
 			rt_free(sbuf);
 			return 0;
@@ -740,9 +883,9 @@ err1:
 	{
 		if (session->is_anonymous == RT_TRUE)
 		{
-			rt_sprintf(sbuf, "550 Permission denied.\r\n");
+			rt_sprintf(sbuf, "530 Permission denied.\r\n");
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
-			rt_free(sbuf);			
+			rt_free(sbuf);
 			return 0;
 		}
 		build_full_path(session, parameter_ptr, filename, 256);
@@ -758,12 +901,53 @@ err1:
 			send(session->sockfd, sbuf, strlen(sbuf), 0);
 		}
 	}
-	
+	else if(str_begin_with(buf, "RNFR")==0)
+	{
+		if (session->is_anonymous == RT_TRUE)
+		{
+			rt_sprintf(sbuf, "530 Permission denied.\r\n");
+			send(session->sockfd, sbuf, strlen(sbuf), 0);
+			rt_free(sbuf);
+			return 0;
+		}
+		build_full_path(session, parameter_ptr, filename, 256);
+
+		rt_sprintf(sbuf, "350 Successfully rececive old file \"%s\".\r\n", filename);
+		send(session->sockfd, sbuf, strlen(sbuf), 0);
+	}
+	else if(str_begin_with(buf, "RNTO")==0)
+	{
+		char new_filename[256];
+		if (session->is_anonymous == RT_TRUE)
+		{
+			rt_sprintf(sbuf, "530 Permission denied.\r\n");
+			send(session->sockfd, sbuf, strlen(sbuf), 0);
+			rt_free(sbuf);
+			return 0;
+		}
+		build_full_path(session, parameter_ptr, new_filename, 256);
+
+		if(rename(filename, new_filename) == -1)
+		{
+			rt_sprintf(sbuf, "553 rename file \"%s\" error.\r\n", filename);
+			send(session->sockfd, sbuf, strlen(sbuf), 0);
+		}
+		else
+		{
+			rt_sprintf(sbuf, "250 Successfully rename to new file \"%s\".\r\n", filename);
+			send(session->sockfd, sbuf, strlen(sbuf), 0);
+		}
+	}
+	else if((str_begin_with(buf, "NOOP")==0) || str_begin_with(buf, "noop")==0)
+	{
+		rt_sprintf(sbuf, "200 noop!\r\n");
+		send(session->sockfd, sbuf, strlen(sbuf), 0);
+	}
 	else if(str_begin_with(buf, "QUIT")==0)
 	{
 		rt_sprintf(sbuf, "221 Bye!\r\n");
 		send(session->sockfd, sbuf, strlen(sbuf), 0);
-		rt_free(sbuf);		
+		rt_free(sbuf);
 		return -1;
 	}
 	else
@@ -771,7 +955,7 @@ err1:
 		rt_sprintf(sbuf, "502 Not Implemented.\r\n");
 		send(session->sockfd, sbuf, strlen(sbuf), 0);
 	}
-	rt_free(sbuf);	
+	rt_free(sbuf);
 	return 0;
 }
 
@@ -787,5 +971,15 @@ void ftpd_start()
 
 #ifdef RT_USING_FINSH
 #include <finsh.h>
-FINSH_FUNCTION_EXPORT(ftpd_start, start ftp server)
+FINSH_FUNCTION_EXPORT(ftpd_start, start ftp server);
+
+#ifdef FINSH_USING_MSH
+int cmd_ftpd_start(int argc, char** argv)
+{
+	ftpd_start();
+	return 0;
+}
+FINSH_FUNCTION_EXPORT_ALIAS(cmd_ftpd_start, __cmd_ftpd_start, start ftp server.);
+#endif
+
 #endif

+ 16 - 5
components/net/lwip_dhcpd/dhcp_server.c

@@ -376,13 +376,24 @@ static void dhcpd_thread_entry(void *parameter)
 void dhcpd_start(char* netif_name)
 {
     rt_thread_t thread;
-    struct netif *netif = RT_NULL;
+    struct netif *netif = netif_list;
 
-    /* find ethernet interface. */
-    netif = netif_find(netif_name);
-    if (netif == RT_NULL)
+    if(strlen(netif_name) > sizeof(netif->name))
+    {
+        rt_kprintf("network interface name too long!\r\n");
+        return;
+    }
+    while(netif != RT_NULL)
     {
-        DEBUG_PRINTF("Not found network interface:%s\n", netif_name);
+        if(strncmp(netif_name, netif->name, sizeof(netif->name)) == 0)
+            break;
+
+        netif = netif->next;
+        if( netif == RT_NULL )
+        {
+            rt_kprintf("network interface: %s not found!\r\n", netif_name);
+            return;
+        }
     }
 
     thread = rt_thread_create("dhcpd",

+ 1 - 1
libcpu/arm/am335x/mmu.c

@@ -15,7 +15,7 @@
 #include <rtthread.h>
 #include "am33xx.h"
 
-#define DESC_SEC		(0x2|(1<<4))
+#define DESC_SEC		(0x2)
 #define CB				(3<<2)  //cache_on, write_back
 #define CNB				(2<<2)  //cache_on, write_through
 #define NCB				(1<<2)  //cache_off,WR_BUF on

+ 2 - 2
libcpu/arm/cortex-m0/context_rvds.S

@@ -183,13 +183,11 @@ rt_hw_context_switch_to    PROC
     LDR     r0, =NVIC_INT_CTRL
     LDR     r1, =NVIC_PENDSVSET
     STR     r1, [r0]
-    NOP
 
     ; restore MSP
     LDR     r0, =SCB_VTOR
     LDR     r0, [r0]
     LDR     r0, [r0]
-    NOP
     MSR     msp, r0
 
     ; enable interrupts at processor level
@@ -216,4 +214,6 @@ HardFault_Handler    PROC
     POP     {pc}
     ENDP
 
+    ALIGN   4
+
     END

+ 3 - 3
libcpu/arm/cortex-m3/context_rvds.S

@@ -177,7 +177,6 @@ rt_hw_context_switch_to    PROC
 rt_hw_interrupt_thread_switch PROC
     EXPORT rt_hw_interrupt_thread_switch
     BX      lr
-    NOP
     ENDP
 
     IMPORT rt_hw_hard_fault_exception
@@ -203,5 +202,6 @@ HardFault_Handler    PROC
     BX      lr
     ENDP
 
-    NOP
-    END
+    ALIGN   4
+
+    END

+ 2 - 1
libcpu/arm/cortex-m4/context_rvds.S

@@ -218,7 +218,6 @@ rt_hw_context_switch_to    PROC
 rt_hw_interrupt_thread_switch PROC
     EXPORT rt_hw_interrupt_thread_switch
     BX      lr
-    NOP
     ENDP
 
     IMPORT rt_hw_hard_fault_exception
@@ -235,4 +234,6 @@ HardFault_Handler    PROC
     BX      lr
     ENDP
 
+    ALIGN   4
+
     END

+ 11 - 0
tools/buildbot.py

@@ -19,6 +19,17 @@ elif sys.argv[1] == 'clean':
     command = ' -c'
 elif sys.argv[1] == 'project':
     command = ' --target=mdk -s'
+    
+    projects = os.listdir(BSP_ROOT)
+    for item in projects:
+        project_dir = os.path.join(BSP_ROOT, item)
+        
+        if os.path.isfile(os.path.join(project_dir, 'template.uvproj')):
+            print ('prepare MDK project file on ' + project_dir)
+
+            os.system('scons --directory=' + project_dir + command)
+    
+    sys.exit(0)
 else:
     usage()
     sys.exit(0)

Some files were not shown because too many files changed in this diff